Комментарии 62
Если пофантазировать на тему развития модели классов для приведенного примера, то, операции не осуществляются же сами по себе. Их выполняют вполне конкретные агенты. ИМХО, можно было бы ввести сущности HRDepartment (кадровый отдел) и AccountingDepartment (бухгалтерия) — и вот у них могли бы быть методы fireEmployee() и payRedundancy().
Некорректное высказывание «увольнение сотрудника является членом объекта 'сотрудник'» мы заменяем на корректное «увольнение сотрудника является кадровой операцией».
А почему для примера используется недоделанная ООП иерархия?
Где классы «Сотрудники»? «Департаменты»?
трудовойДоговор.расторгнуть() :)
Сотрудник.Уволиться()
Организация.Уволить(Сотрудник)
Собственно, почти все критики чего-либо, как правило, чего-либо сначала ухудшают.
Метод ВыдатьЗарплату (PaySalary) может быть отнесен к классам Сотрудник (Employee), Касса (Cash), БанковскийСчет (Account) – все они равнозначны в праве владения им
Мне кажется зарплата термин специфичный именно для отношений между людьми и предприятием, а это отношение и обозначается термином Работник.
То Касса и Банковский счет могут быть использованы и в других контекстах.
Чтобы выплатить зарплату сотрудникам некоторой компании,
мы должны просмотреть все департаменты в мире во всех компаниях, чтобы узнать сотрудникам каких департаментов выплачивать зарплату,
Потом просмотреть всех сотрудников в мире, чтобы узнать, кто из них работает в найденных департаментах.
И только затем можно выплатить зарплату.
Больше похоже на попытку реализовать хранимые процедуры СУБД в коде.
Есть маленькая проблема: поскольку реализациия операции не является деталью реализации объекта, вы теперь не можете это инкапсулировать. В частности, если операция "увольнение" проставляет объекту "сотрудик" флаг "уволен", то как вы реализуете требование "флаг "уволен" может быть проставлен только в ходе операции "увольнение""?
Далее, группировка операций по "контекстам" не имеет никакого смысла с точки зрения разработки: операции в рамках "контекста" друг с другом, на самом деле, не связаны. С равным успехом можно вынести каждую операцию в отдельный "контекст" и получить, по большому счету, паттерн Command
(с определенными оговорками) — каковой паттерн, будем честными, полностью объектно-ориентирован.
Но по большому счету, то, что у вас описано, называется Transaction Script и описано Фаулером в PoEAA больше десяти лет назад.
сочетанию объектно-ориентированного и функционального программирования
Не-а. Ваш код остался объектно-ориентированным. Модель — нет, но модель — это не код. И ваш код не приобрел ничего от функционального программирования, потому что практически первое, чем ценно функциональное программирование — это отсутствие побочных эффектов; у вас же каждая операция порождает эти побочные эффекты во множестве.
Науке он принес больше зла, чем вся Святая инквизиция.
Ок, низвергаем мыслителей древности, идём дальше.
Две тысячи лет потребовалось нашим ученым, чтобы затереть следы его «Физики».
Я бы не клеймил так его трактат, ведь он заочно полемизировал в своих трудах с другими учеными своего времени. На его труды опирались последующие поколения учёных. Пусть он был не прав, но давал пищу для размышления.
хочется взять античный стилус (так в Риме называли палку погонщика скота)
Что? Вы про стилос?
единственная на сегодня корректная философия
Вы про ранний или поздний период его работы? Они достаточно сильно отличаются, в позднем он отказался от многого, что утверждал в раннем.
«Единственная»? Как-то очень много пафоса в нескольких абзацах.
Функциональное программирование стало интуитивной реакцией миллионов разработчиков на туманность ООП – его полным отрицанием.
Прочитайте вот это
В комментариях верно заметили — вы изобрели зоново паттерн Медиатор
низвергаем мыслителей древностиДа. И между прочим, кроме физики, он принес еще Аристотелеву логику, легшую в основу (с определенными переосмыслениями) современной мат.логики. Чтобы мы сейчас делали без логики? Как бы программировали?
Пусть он был не прав, но давал пищу для размышления.
Что в глазах любителей «прорывов в науке» должно оправдывать большинство теоретических рассуждений, гипотез и вообще текстов на habrahabr.ru
единственная на сегодня корректная философия
Я бы не советовал делать таких утверждений без вводной конструкции «Я считаю» или «Мне так кажется».
Что? Вы про стилос?
Со стимулом человек перепутал, бывает. :) А так — да, практически те же замечания возникли.
В книгах по программированию честные авторы стыдливо признают, что «объекты – это как бы не совсем объекты»
Пожалуйста, приведите пару ссылок на эти книги.
Оказавшись два года назад в мире разработки ПО
Очень не большой срок.
Неудивительно, что неопозитивизм – единственная «работающая» философская система, по сути – единственная на сегодня корректная философия: в подтверждение могу упомянуть, например, неопозитивиста Карла Поппера, который разработал современную методологию научного познания.Методология Поппера далеко не единственная и не общепризнанная, как и философия неопозитивизма.
Функциональное программирование стало интуитивной реакцией миллионов разработчиков на туманность ООПФункциональное появилось раньше: лямбда-исчисление (Алонзо Чёрч, 1930), Лисп (конец 1950х), т.е. раньше, чем Simula 67.
Пример ИМХО слишком тривиальный для критики методов в ООП. Взять пример сложнее, и мы увидим роль полиморфизма и т.д.
Поэтому «выдача/получение зарплаты» сама может быть объектом.
И не смотря на то, что из ООП кто-то пытается сделать религию, а другие дьявола, лично для меня, это всего лишь удобный инструмент.
class может представлять собой не только существительное, но и глаголы и прилагательные
В естественном языке тоже есть существительные, сделанные из глаголов
Ну что сказать удобно — все дураки, только один я Дартаньян!
Неплохо для начала самостоятельных изысканий. Мысли и желания идут в верном направлении. Если не хотите тратить много времени, то вот вам ключевое слово — DDD.
Критерий научности Поппера не выдерживает рекурсивной проверки самого себя
Это общеизвестный факт или вы сами додумались? Можно ли ссылку на источник?
(Не делайте из науки атеистическую религию Великого Пруфа.)
Но это всё не очень интересно, поскольку почти тривиально. По-настоящему интересное написано в книге Пола Фейерабенда «Против метода». Она не конкретно про критерий Поппера, а про то, что научный метод в целом — это фуфло.
Нельзя, да и не получится, «проинсталлируется» только уверенность в том, что наукообразные формулировки — истинны (и агрессия к «гумманитариям», в которые записываются все несогласные). Большинство «бытовых» коммуникаций людей лежат не в сфере выяснения объективной истины, а в сфере синхронизации мнений и вкусов. Часто путают знание фактов с пониманием принципов. Часто называют оценку рисков логическим доказательством. Часто называют умным (научным, объективным, истинным) то, что совпадает с их точкой зрения. Научный метод — лишь один из множества формальных инструментов познания, им не заменить человеческое мышление.
Научный метод сам по себе, разумеется, недостаточен. Для того, чтобы это понять, достаточно приложить минимальное интеллектуальное усилие. Нужно задаться всего лишь одним простым вопросом. Допустим, что с помощью научного метода я могу проверить любую гипотезу — подтвердить или опровергнуть её. Но откуда брать новые гипотезы, требующие проверки? Ведь научный метод начинается с того, что некая гипотеза уже есть. Тем не менее, многие так носятся с этим научным методом, как будто это универсальный ответ на всё. При этом они отнюдь не глупы. Значит у них в мозгу установлена какая-то прошивка, которая содержит такой набор базовых понятий, который не позволяет формулировать вопросы, не имеющие ответов в рамках научной картины мира. Другого объяснения этому нет. По крайней мере, я другого не знаю.
Как сказал Дэвид Мермин: «Заткнись и считай!»Интересная, хоть и популярная публикация на эту тему: Андрей Борисов, Заткнись и считай (Кого не удовлетворит популярный уровень: см. в конце статьи ссылки на научные издания).
стилус (так в Риме называли палку погонщика скота)
Не стимулус, не?
Говоря о Витгенштейне, я подразумеваю ранний период: некоторые базовые положения Логико-Философского трактата — это представляется очевидным, исходя из написанного. Логика, как-то сформулированная Аристотелем, не была им открыта. Она предшествовала не только грекам, но и человеку — и даже миру, возможно. Не будем углубляться в метафизику. Здесь я остаюсь при своем мнении: Аристотель бесполезен как философ и крайне вреден как лжеученый.
Набросок кода, написанный «на языке Deplhi» (на самом деле, это несуществующий язык с понятными на слух ключевыми словами), я придумал и привел здесь, чтобы не быть голословным. Мне просто был нужен пример. Этот удобен тем, что использует минимум средств языка и платформы. Имея богатые средства, можно сделать лучше. Для меня выжным было показать не инженерный, а философский принцип: адекватное моделирование требует рассматривать факты, а не объекты. Мы-то с вами знаем, что, в отличие от какого-нибудь авиастроения, программирование имеет синтетическую природу: с одной стороны оно — раздел практической философии (как математика), а с другой — инженерная дисциплина. Все, что я тут написал, касается философии исключительно.
PS Отдельное спасибо за бдительность!:) Зловредную опечатку исправил.
адекватное моделирование требует рассматривать факты, а не объекты
Нет, не так. Адекватное моделирование требует рассматривать то, что представляет интерес в предметной области.
в отличие от какого-нибудь авиастроения, программирование имеет синтетическую природу: с одной стороны оно — раздел практической философии (как математика), а с другой — инженерная дисциплинаК «какому-нибудь авиастроению» Вы явно не справедливы: программирование входит и в современное авиастроение, начиная с систем автоматического проектирования и кончая программированием бортовых компьютеров. То, что математика — раздел практической философии, крайне экстравагантное утверждение. Есть область философия математики, но она определяется иначе, чем вся математика.
Я много писал про ограничения ООП, но понимают эти ограничения лишь те программисты, которые умеют программировать в разных парадигмах.И я писал про ограничения ООП, а начинал программировать со стандартного Паскаля и Фортрана-4, где ООП не было. Поэтому меня заинтересовала Ваша точка зрения. И т.к. могу кодить без ООП, то надеюсь, что могу понять Вашу точку зрения. Ранее Ваши публикации не читал и сейчас только очень бегло проглядел. Первые впечатления очень странные. Так, нпр.:
Я развиваю мысль о том, что такое реальность и о том, как мы ее моделируем. Я подчеркиваю тот факт, что мир, в котором мы живем, — это иллюзия. Мы даже не знаем, есть ли мы на самом деле, или наше существование — тоже иллюзия. Наше «Я» думает, что существует, но существует оно в мире иллюзий. Все, что мы видим, и что моделируем, — мы видим иллюзию и моделируем иллюзию.Это, простите, на солипсизм похоже. Но далее у Вас оговорка:
Поэтому между реальностью и моделью я всегда рисую субъекта. Каждый субъект видит свою иллюзию. У каждого субъекта своя модель. Мы предпринимаем невероятные усилия, чтобы сделать наши иллюзии похожими.
Простите за м.б. наивный вопрос: каждый субъект видит прямой угол по-своему, у каждого своя модель и свой аналог теоремы Пифагора? Но не будем сейчас это обсуждать, я просто понадеялся, что Ваши публикации помогут разобраться с тем, что Вы утверждаете здесь, но мне они, к сожалению, пока не помогли. А здесь Вы сказали:
И да, нельзя при помощи ООП моделировать мирНе уверен, что понял, что Вы подразумеваете под словами «моделировать мир», но моделированием явлений данного нам мира традиционно занимается математика. Нпр., есть в нашем с Вами мире хим. реакция между водородом и азотом — при достаточно высоком давлении образуется аммиак. Эта реакция равновесная и моделируется диффурами хим.кинетики настолько хорошо, что с помощью этой модели оказывается экономически оправданным проектирование промышленных установок синтеза. И тут возникает вопрос: почему эту мат. модель я не могу реализовать в программу методами ООП? Допустим, у меня есть некая мат.библиотека, где класс «вектор», у которого методы — скалярное и векторное произведение. Если мне нужен этот класс, я его применю, и это по сути не будет отличаться от процедурного подхода. Но, нпр., в стандартном Паскале для векторов разного размера мне придется написать разные процедуры. Т.е. ООП для модели этого явления мира будет использовать дешевле при одинаковом результате.
каждый субъект видит прямой угол по-своему, у каждого своя модель и свой аналог теоремы Пифагора?
Понятие угол, прямой угол существуют только у геометров. в другой области деятельности нет углов и нет прямых углов.. Я написал статью на эту тему.
моделированием явлений данного нам мира традиционно занимается математика.
Я бы сказал, что математика дает нам инструмент для моделирования. И то, недавно изучая матлогику, я обнаружил у преподавателя слепое пятно: неразличие понятия типа и класса.
Под моделированием я понимаю построение модели в рамках определенной парадигмы построения моделей. ООП предназначено для моделирования кода, как той предметной области, для которой оно предназначено. И не годится ООП для моделирования предметного мира. Потому что наследование в обычном мире и наследование в мире ООП отличаются. Понятие класса в мире и понятие класса в ООП — тоже отличаются
Понятие угол, прямой угол существуют только у геометров
Тем не менее, у двух геометров понятия "угол" (и "прямой угол") совпадают.
(впрочем, нет, понятие "угол" существует не только у геометров)
И то, недавно изучая матлогику, я обнаружил у преподавателя слепое пятно: неразличие понятия типа и класса.
А вы не задумывались, что это может быть не его слепое пятно, а просто другая терминологическая система?
ООП предназначено для моделирования кода, как той предметной области, для которой оно предназначено
Это утверждение неверно. Модель, построенная с помощью ООП (где П — это программирование), не является моделью кода, потому что в этом случае код это была бы автореферентная модель (код моделировал бы сам себя).
И не годится ООП для моделирования предметного мира. Потому что наследование в обычном мире и наследование в мире ООП отличаются.
Это плохой аргумент. Есть много отраслей, понятия в которых не совпадают с понятиями в других отраслях, но это не значит, что они не подходят для моделирования.
Понятие класса в мире
Хочу напомнить вам, что, согласно вашей же логике, "в мире" нет понятия класса, понятие "класса" есть только у конкретного субъекта, и нет никакого способа сказать, что одно понятие правильнее другого.
Тем не менее, у двух геометров понятия «угол» (и «прямой угол») совпадают.
До 20-го века не совпадало. Да и сейчас два геометра легко разойдутся во мнении, что считать прямым углом.
Про ООП я только в русскоязычных источниках читал про моделирование предметной области. Сами создатели ООП никогда не заикались об этом.
Про автореферентность — ошибка. Нет ее. ООП описывает то, что потом создает движок, так что автореферентности нет.
Про ООП я только в русскоязычных источниках читал про моделирование предметной области
The formal programming concept of objects was introduced in the mid-1960s with Simula 67, a major revision of Simula I, a programming language designed for discrete event simulation, created by Ole-Johan Dahl and Kristen Nygaard of the Norwegian Computing Center in Oslo
:)
Да и сейчас два геометра легко разойдутся во мнении, что считать прямым углом.
Мне казалось, определения для того и созданы, чтобы не было такого "легко разойдутся во мнении". Прямой угол — это строго определенное понятие.
ООП описывает то, что потом создает движок, так что автореферентности нет.
Эээ, простите, что описывает объектно-ориентированное программирование? Какой "движок"?
Про ООП я только в русскоязычных источниках читал про моделирование предметной области.
Открываем, значит, "Domain-Driven Design" Эванса.
Object-oriented design, the paradigm that currently dominates the majority of ambitious projects, is the approach used primarily in this book. [...] simple as the concept of object modeling is, it has proven rich enough to capture important domain knowledge [...] most projects attempting MODEL-DRIVEN DESIGN are wise to use object-oriented technology as the core of their system.
Для сравнения:
domains that are intensely mathematical or that are dominated by global logical reasoning do not fit well into the object-oriented paradigm.
Ну и так далее. Типичная иллюстрация того, что если вы о чем-то не читали, это не значит, что его нет.
Сами создатели ООП никогда не заикались об этом.
А кого вы нынче считаете "создателем ООП"?
Понятие угол, прямой угол существуют только у геометров. в другой области деятельности нет угловВот это новость! Даже ребенок-дошкольник понимает, если ему сказать: «встань в угол».
Я бы сказал, что математика дает нам инструмент для моделирования.Есть четкое понятие мат.модель, а бывают другие модели, нпр., модель самолета из дерева для испытаний в аэродинамической трубе.
ООП предназначено для моделирования кодаТ.е. код — прототип? Но нетривиальная модель не тождественна прототипу. Получается противоречие: программа не тождественна коду, на котором написана, т.е. не тождественна самой себе!
Потому что наследование в обычном мире и наследование в мире ООП отличаются.Чем? В обычном мире наследуются свойства и методы, и в ООП наследуются свойства и методы. Ребенок подражает родителям и наследует их методы поведения (как хорошие, так и плохие), а от рождения он может унаследовать родительские свойства, нпр., рыжие волосы.
Понятие класса в мире и понятие класса в ООП — тоже отличаютсяЧем? Нпр., в мире наблюдается класс любителей риторики. Экземпляры этого класса используют одинаковые риторические методы, чтобы «наводить тень на плетень» :)
«Мир есть совокупность фактов, а не вещей»: Витгенштейн и операционно-ориентированное программирование