Re: Программирование есть моделирование (ООП)
От: OpenMinded Россия  
Дата: 08.03.05 11:30
Оценка: 22 (3)
Здравствуйте, beroal, Вы писали:

B>Давным давно, когда ООП для меня было в новинку, я прочитал в одной книжке, что объекты моделируют реальность (вроде бы Гради Буч). Я не могу привести ссылку, но хорошо помню, что это была не случайная мысль, а мощный разработанный тезис, который, в частности, выдвигался в поддержку самого ООП — якобы оно нужно программисту, чтобы моделировать реальность, с помощью него моделировать реальность очень хорошо. И до сих пор я замечаю, что иногда этот тезис проскакивает в общих размышления об ООП у его поклонников, типа "таким образом мы лучше моделируем реальность".


В науке часто используется следующий приём: что бы обяснить человеку то, чего он не знает, вместо того, что бы сразу обяснять ему модель, основанную на последних достижениях (часто черезвычайно сложную и противоречивую) — ему обясняют всё очень упрощённо и не правильно. Вспомните физику или химию в школе — мы как бы заново проходим путь, пройденный в своё время наукой — каждый раз узнавая, что то, что нам рассказывали раньше — это не совсем правда и, что на самом деле всё обстоит несколько сложнее — иначе.
То же самое сделал и Гради Буч. Думаю, что он прекрасно знал, что его пояснения мягко говоря не правильны. Но у них есть существенное достоинство — если не воспринимать их черезчур буквально, а воспринять из них лишь идею построении системы взаимодействующих объектов, некоторые аспекты поведения которой напоминают некоторые аспекты "предметной области" — то это позволяет воспринимать и развивать конепции ООП/ООА гораздо быстрее, чем если идти, например, снизу — от ассемблерного кода, пытаясь обяснить как из отдельных регистров и команд получить объект.
Эта метафора (о том, что объектная программа моделирует реальный мир) — это всего лишь взгляд на програмную систему "сверху" — полезный инструмент для того, что бы позволить соеденить программу и реальный мир — сделав возможным осмысленное проектирование и понимание программы.
Думаю, что вы знаете, что электроны в атоме не летают вокуг ядра по круговым орбитам — более того — у них вообще нет орбит пока они в составе атома, но не сетуете по этому поводу на школьную физику.

B>Я, однако, не поклонник, смотрю на ООП критически, и это одна из причин, почему. Я не думаю, что программы моделируют реальный мир. Таковыми являются только те программы, у которых в ТЗ прямо записано, что функция программы — моделирование. Например, предсказание погоды, компьютерные игры (стрелялки). Конечно, ПО для моделирования — важная и нужная часть ПО, но именно часть. А в ООП получается, что каждая программа неявно моделирует. Мне, честно говоря, тяжело это представить.

Программы НЕ моделируют реальный мир. Это делают разработчики программ для того, что бы облегчить себе проектирование. Сложную прогаммную систему гораздо легче представить и понять, если рассматривать её как набор объектов, уровней, модулей, служб и т.д. чем как алгоритм.

B>Мне могут привести конкретные примеры. Например, система учёта ТМЦ моделирует, собственно, ТМЦ, как там они перемещаются географически и пр. С этим я не спорю. А бухучёт что моделирует? Бумажный бухучёт? А если мы вспомним, что сами деньги — это не бумажки или драгоценные металлы, а условность. А компьютерная игра "Шахматы" что моделирует? Деревянные шахматы? Которые тоже условность, и в свою очередь моделируют что?.. К любой программе можно притянуть за уши какой-то физический объект, потому что компьютеры появились относительно недавно, и у многих программ должен быть хотя бы бумажный прототип.

Самое забавное как раз в том, что приведённые примеры как раз относятся к тем областям, где программа реализует как раз таки именно модели. Бухучёт — модель движения денежных потоков между счетами, а шахматы — так это построенная по чётким правилам модель сражения. Лучше сказали бы про компиляторы или линкеры — для них соответствие в реальном мире найти гораздо сложнее... Однако мысль ясна.
Но как мне кажется, всё станет на свои места, если мы примем за основу, что моделированием занимается не сама программа, а человек, который её создаёт.

B>Я не возражаю против того, что любая программа что-то моделирует. Это вопрос схоластики. Доказать можно. Меня интересует, насколько полезен такой взгляд программисту, насколько полезно ложить его как основу парадигмы программирования.

В этом и суть. Программы не моделируют. Моделируют их разработчики. Примеры Буча со стиральными машинами и сельхоз системами изначально критики не выдерживали, если пытаться воспринимать их как модели реальности, так как они даже близко не учитавали большинство важных свойств моделируемых объектов.

B>Я предпочитаю смотреть на программу как на машину — что она умеет делать, насколько удобно ей управлять. Возможно даже, тезис о моделировании — это хитрый ход конём, уход от пользователя. У нас есть объективная реальность, мы её в тиши кабинета с ретортами и колбами моделируем, а пользователь со своими предложениями пусть пока постоит за дверью. А ведь даже моделирование интересует не вообще, а в том аспекте, который интересует пользователя. Самолёты учитываются по-разному в бухгалтерии, КБ, аэропорту.

B>Этот взгляд губителен хотя бы тем, что мы концентрируемся на предметной области, а не на тех преимуществах, которые даёт современная техника. Ведь компьютер может гораздо больше, чем делалось с помощью ручки и бумаги... Зачем же моделировать ручку и бумагу?
B>Или я уделяю слишком много всему этому внимания?

Именно. Я не видел ни одного разработчика кто занимаясь бухгалтерскими системами додумался бы до моделирования бумажных папок и перьевых ручек.
Искусство и предназначение аналитика, который изучает предметную область как раз и заключается в том, что бы суметь выделить из предметной области то, что в ней следует моделировать. Врядли заказчика обрадует, если бухгалтерская система будет моделировать перьевые ручки, но не будет учитывать перемещение денег по счетам.
Кроме того, если рассмотреть такую программу, как компилятор — то получается, что реального объекта нет, а вот программа и объектная модель — есть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.