Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
try { /* очень полезная работа */ } catch (...) { /* а это чтоб не ругалось */}
class Oven
{
public virtual Food Cook(List<FoodProduct> products) ....
}
Ну и, главное, программирование к анализу требований, включая оценку перспектив развития, имхо, мало отношения имеет.Контрпримеры: 1. Программист должен программировать класс String подозреваю, что он может быть не только на char, но и на wchar.
никто не замечает, что всё это моделирование достаточно далеко от решение прямой задачи — реализации приложения «печь», к которому можно было бы приступить изначально.
Есть пекарь. Есть печь электрическая и газовая. Ваша задача смоделировать процесс приготовления пищи пекарем в каждой из печи
Первое, на что стоит обратить внимание, это то, что мы видим не задачу. Задача может звучать, например, как «создать систему поддержки пекарни», а в подзадачи входить отслеживание прихода и ухода продуктов, расхода топлива, контроль условий эксплуатации и т.д. ООП нас учит как раз тому, что предложил автор — смоделировать процесс приготовления пищи
Еще говорят что некоторые вещи нельзя представить в виде объектов и их взаимодействия.
плюс минимальные затраты на само написание кода, расширение и сопровождение.
«ООП — это технология уровня реализации» заметьте, я и не говорил иначе, более того, я это подчеркнул.
Это типа вы сейчас сказали, что DSL, SOA и прочее — это какая-то новая парадигма?
И сервисы не имеют поведения, не имеют внутреннего состояния
DSL не оперируют предметной областью и мы на них не описываем поведение объектов этой самой области
И кубик — это не объект с кучей данных, да?
И даже когда задача сводится к установке готового продукта, его настройке и интеграции с кучей других — там внутри нет ООП?
В чём принципиальная разница между агентами и объектами? Просто что всегда считал, что ООП — это объекты и сообщения.
А причем тут ООП? ООП это такой же инструмент как и все остальные методологии. Он вовсе не универсален и имеет свои области применения.
Когда вам такую задачу надо будет решить не разово а систематически с постоянными изменениями разрезов и изменениями вариантов представления прямо во время презентации по запросу руководства, вот тогда вы вспомните про ООП и разделение представления и данных, и вспомните, что разрезы это типичная реализация паттерна presenter.
Чем тут вам не объектный подход? Вы просто использовали другую терминологию.
Вы по сути получаете историю состояний сущности (объекта), которой в базе данных не существует.
Одни и те же данные в базе одновременно могут являться данными о состоянии разных объектов.
Используя объектное мышление вы легко можете решить любую задачу (очень важно что любую, абсолютно любую)Даже NP-полную? Это как-то на рекламу смахивает, нежели на что-то разумное :(
И даже есть стандарты, которые могут понять хорошо ли вы выбрали абстракции и верна ли ваша декомпозиция (SOLID).SOLID уже стандарт? SOLID не имеет прямого отношения к декомпозиции. SOLID скорее для первого приближения грамотности проектирования, нежели для верификации грамотности выбора абстракций и декомпозиций.
Вы потом внесете изменения требований, о которых я не предполагалда, в реальности всегда так и происходит. хотелось посмотреть, как вы выйдете из положения
И в конце, хотел бы задать вопрос автору, как бы он решал подобную задачу:
хочу чтобы «нарисовать карандашем на бумаге».
Вносить изменения сильно дороже, чем разрабатывать с нуля. DSL тут никак не помогает, а даже усугубляет
Вот через 2 года мы понимаем, что фундамент, заложенный в дизайн DSL — уже не актуален, новые требования уже не реализовать без костылей. Что делать?
как раз наоборот, чем более абстрактуню опердень мы пишем, тем шансы ошибиться больше
Пойдем дальше. Итак, нам важно мыслить функционально, для того, что бы найти нужные нам абстракции функций для решения наших задач. Если аналогии и абстракции выбраны удачно, то мы видим очень четкую картину которая позволяет нам быстро разобраться в том, что же происходит в системе. И вот тут мы начинаем вспоминать про композицию и сопоставление с образцом. Эти два инструмента нужны для удобного масштабирования системы без дублирования кода. Но сила этих механизмов зависит от того насколько удачные абстракции и аналогии вы выбрали. Если ваше функциональное мышление не позволяет вам сформировать удобную декомпозицию функций, то композиция и сопоставление с образцом вам не помогут. Т.е. композиция и сопоставление с образцом это ничто иное как инструменты, которые позволяют решить проблему масштабирования системы.
Остальные примеры, которые были приведены в зацепившей меня статье, лишь примеры отвратительно выбранной абстракции и аналогии в рамках поставленной задачи. Точка.
Еще говорят что некоторые вещи нельзя представить в виде объектов и их взаимодействия. Я уверен что это не так. Просто необходимо выбрать уровень абстракции верно. Будь то реализация протокола, слоя доступа к БД, подключения плагинов, менеджера задач, бизнес процесса, системы проектирования бизнес процессов т.е. все что угодно можно представить как объекты и их взаимодействие. Все можно реализовать как объекты и взаимодействие между ними.
ну да, прикольно, но какое это отношение имеет к ООП? Вы про то, что одни понятие ООП подменило другими? Даже если так, то новые понятия гораздо проще воспринимать. Разве нет?
«И да, не забудьте про null — это одна из самых распространённых ошибок из-за недостатка типизации таких языков как Java (в C# вроде чуть полегче).» — если честно, не понял глубинный смысл вашего высказывания.
да нет, уважаемый, как раз это вы хотите сузить. Понятие объекта именно ООП вынесло на тот уровень, когда GoF могут с удовольствием создавать всякие мосты, фабрики. И нами это воспринимается нормально.
А ваш пример отвратителен, поскольку вы подменяете одно понятие другим — логическое действие объекта «прикотовить» вы заменяете на установку его состояния на «включена».
А для DTO объектов вы не придумаете примера, в котором установка свойства приведёт к каким-то действиям — просто по определению, потому что DTO-объекты на то и data transfer objects, что просто переносят данные и не выполняют никакой логики.В рамках моей абстракции есть экземпляр класса письмо. Он не обладает никаким поведение, т.к. мне это не нужно. Он обладает только свойством текст. Которое можно менять как угодно. Письмо используется в качестве DTO для передачи данных между моими слоями. Оно является объектом в рамках моей доменной (даже доменной!) модели. Где противоречие инкапсуляции? Письмо просто не обладает поведением в рамках моей абстракции. И мне даже инкапсулировать нечего! Мне и не нужен пример в котором я для DTO объекта буду придумывать поведение! При этом мое письмо это реализация паттерна DTO.
Вы не понимаете, но при этом обвиняете меня в глупости? Вот это круто. Я надеялся, что вы хотя бы сможете постоять за своё мнение.
Сама иерархия объектов противоположна теории множест — наследники имеют больший функционал, а значит с точки зрения множест являеются надмножествами, а не подмножествами.
Во-первых, вы GoF ещё раз перечитайте. Там несколько раз говорится, что паттерны решают проблемы, с которыми ООП не может эффективно справиться.Эм… Т.е. по вашему паттерны это набор костылей, которые помогают привести ООП к более нормальному виду? Но это не набор решений часто встречаемых задач, с которыми программистам часто приходится сталкиваться? А то, что паттерны некоторые идеально ложатся на ООП, и собсно без ООП я даже не знаю можно ли некоторые реализовать (я не говорю что нельзя, но если вы дадите мне пример реализация абстрактной фабрики без ООП, я честно буду рад, но не более того). И то что паттерны, это отличные абстракции объектов реального мира тоже в расчет не берем?
Так что нет, уважаемый, инстанс класса — это гораздо меньше, чем просто объект.Мне кажется что вы там какие то проблемы у себя в голове придумываете, потом думаете что эти проблемы возникли благодаря, в данном случае, мне, и пытаетесь меня убедить в обратном. :) Я вам где то сказал что инстанс класса — это гораздо больше чем просто объект? Вы думаете что я не знаю что понятие объекта нигде не использовалось? Вы хотите сузить понятие объекта в рамках ООП, до понятия объекта в языках, в которых ОО подход не использовался. Я же вам говорю, что объект в рамках ООП, это гораздо больше чем понятие объекта, которое существовало ранее, до появления ООП.
(я не говорю что нельзя, но если вы дадите мне пример реализация абстрактной фабрики без ООП, я честно буду рад, но не более того)
Какую именно (конкретную прикладную или инфраструктурную) задачу вы пытаетесь решить?
Вас аналитик просит реализовать абстрактную фабрику?
Вы хотите сказать что все зависит от задачи и требований?
Я, кстати, отдельно хочу заметить, что есть паттерны, которые порождаются исключительно ООП и в других парадигмах не очень нужны.
Меня аналитик регулярно просит написать хранимку. За что и получает.
А что, паттернов которые порождаются другими парадигмами нет?
Но паттерны порождаемые ООП, наиболее просты для понимания человека
представляют собой абстракции объектов реального мира
Далее, т.к. используя объектный подход можно решить ЛЮБУЮ решаемую задачу на уровне ЯП, а качество решения чаще всего зависит лишь от опыта решающего, то получается что используя инструменты парадигмы можно решить заведомо любую задачу.
Например, паттерн «стратегия» или «команда»А что тут не так? :) Паттерны «Стратегия» и «команда» есть абстракции объектов стратегия и команда. Или вы не видите что стратегию можно рассматривать как объект?
До этого момента все было хорошо. А теперь вы внезапно выдали ничем не подкрепленное утверждение.Ну почему же? Тут логическая цепочка работает. Вы согласны что для понимания человека наиболее понятно взаимодействие объектов, которые он может увидеть в реальном мире? Следовательно, если мы пробуем перенести решение задачи в объектное представление, то это проще чем что то другое?
Как уже говорилось, это с равным успехом верно и для процедурного подхода.Ну конечно, я не спорю. :) Но благодаря инструментам ООП сделать это гораздо проще и удобнее чем в процедурном подходе. НЕТ?
Но благодаря инструментам ООП сделать это гораздо проще и удобнее чем в процедурном подходе.В общем, с учетом того, что количество задач бесконечно. А то вы мне тут щас какой нить элементарный пример приведете…
Паттерны «Стратегия» и «команда» есть абстракции объектов стратегия и команда.
Вы согласны что для понимания человека наиболее понятно взаимодействие объектов, которые он может увидеть в реальном мире?
Следовательно, если мы пробуем перенести решение задачи в объектное представление, то это проще чем что то другое?
Но благодаря инструментам ООП сделать это гораздо проще и удобнее чем в процедурном подходе. НЕТ?
Стратегия — в реальном мире — (а) не объект (б) имеет больше одного значения. И да, ее реализация в соответствующем паттерне не имеет ничего общего с тем, как нормальные люди понимают стратегию.
Потому что «объектное представление» — это не «взаимодействие объектов, которое можно увидеть в реальном мире».Может быть вы просто этого не видите? Объектное мышление сложная штука и его надо развивать. Я не говорю что ООП просто и легко решает все задачи, я говорю что оно решает любую задачу. И если вы умеете использовать ООП, то решение будет практически идеальным с точки зрения понимания, гибкости и масштабирования. И безусловно некоторые вещи проще решить без ООП, но, чаще всего, это простые задачи.
И паттерн команда есть отличная абстракция. Про команду тоже самое.
Вы думаете что все объекты материальны?
Может быть вы просто этого не видите?
Объектное мышление сложная штука
И если вы умеете использовать ООП, то решение будет практически идеальным с точки зрения понимания, гибкости и масштабирования.
И безусловно некоторые вещи проще решить без ООП, но, чаще всего, это простые задачи.
Ну да, это тоже характерная группа примеров: алгоритмы обработки данных, где собственно данные и их обработка жестко разделены (как мы помним, это анти-ООП, поскольку в ООП данные и методы объединяются).А вы что, при реализации логики по доменной модели, поведение и действия над доменными объектами запихиваете в доменные объекты? Какое такое анти-ООП? И почему мы должны это помнить?
А вы что, при реализации логики по доменной модели, поведение и действия над доменными объектами запихиваете в доменные объекты?
Какое такое анти-ООП?
Ну, неплохо бы, потому что поведение доменных объектов и действия одних доменных объектов над другими.Ну т.е. если я этого не делаю то я не использую объектный подход вы считаете?
Такое. Потому что типичный объект в ООП — это данные и методы. А тут данные отдельно, методы отдельно.Еще раз говорю, что типичный (любой) объект реального мира обладает состоянием и поведением. А у нас типичный объект это абстракция. Я теперь начинаю думать что добавление еще одного столпа, абстракции, не такая уж плохая идея. :)
Ну, неплохо бы, потому что поведение доменных объектов и действия одних доменных объектов над другими.Вообще хотелось бы что бы вы раскрыли больше это высказывание. Потому что чем больше вчитываюсь, тем больше не понимаю что вы имели ввиду… :(
Ну т.е. если я этого не делаю то я не использую объектный подход вы считаете?
Еще раз говорю, что типичный (любой) объект реального мира обладает состоянием и поведением. А у нас типичный объект это абстракция.
И что вы хотели этим сказать, простите?То что объект, в рамках абстракции, может обладать состоянием и/или поведением.
Но вот когда у вас в рамках задачи одни объекты обладают только состоянием, а другие — только поведением, у вас уже не ООП, а его иллюзия.:) :) Почему же? Вы тоже считаете что DTO не может быть объектов в рамках моей объектной модели?
DTO, все-таки, составляет несущественную часть объектов в нормальной ОО-системе, а уж тем более — в доменной модели. Почитайте у того же Фаулера про anemic domain model.Ну т.е. вы признали что объекты могут обладать ток состоянием.
Потому что когда данные — отдельно, а операции — отдельно, это обычное модульное программирование.Это вы сейчас сами так придумали? А то, что мои данные и операции реализуются в рамках сильных абстракций объектов реального мира мы в расчет не берем? То что такая реализация возможна только благодаря объектному подходы тоже не учитываем?
Вы не понимаете что на определенном уровне абстракции, мне хочется менять состояние объекта, что бы при это менялось его поведение?
В рамках моей абстракции есть экземпляр класса письмо. Он не обладает никаким поведение, т.к. мне это не нужно.
Просто ваше высказывание бессмысленно даже не с точки зрения языка, любого, а с точки зрения философии. Вы думаете что я не могу включить печь, не передав ей при этом того, что в этой печи будет печься?
А в чем собсно проблема то? И почему вы думаете что наследники должны иметь меньший функционал?
Эм… Т.е. по вашему паттерны это набор костылей, которые помогают привести ООП к более нормальному виду?
Я же вам говорю, что объект в рамках ООП, это гораздо больше чем понятие объекта, которое существовало ранее, до появления ООП.
Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и связывания исходного кода на выполнение).
Объе́кт (лат. objectum — предмет) — философская категория, если определять её в пределах эпистемологии, выражающая нечто, существующее в реальной действительности (то есть независимо от сознания) — предмет, явление или процесс, на которые направлена предметно-практическая и познавательная деятельность субъекта (наблюдателя). При этом в качестве объекта может выступать и сам субъект. В качестве субъекта выступает личность, социальная группа или всё общество.
Т.е. вы считаете, что современники не могли воспринять симулу тупо из-за того, что не использовали слово «объект»?Не могли воспринять такой подход. Он слишком не походил на те подходы, которые были до этого.
Я про ООП подход ничего не говорил, я говорил про сам термин «объект». До и после популяризации ООП.К сожалению я теряю нить ваших рассуждений и доводов.
Понятие «объект» прекрасно существует в рамках разработки ПО, но за рамками ООП, и имеет то же значение, что и в общеупотребительной лексике. Но если вы не хотите об этом говорить — ради б-га.Эм… Ну мы же про разработку ПО говорим. Нет? То что понятие объекта существовало очень давно, до появления ООП я прекрасно понимаю. Но при чем тут это?? Или вы хотите сказать что до появления ООП его именно так и использовали как после? Где логика ваших высказываний? Вы кидаете бессмысленные выражения, которые невозможно притянуть к объекту спора.
class SomeRecord {
String x;
int y;
/* getters and setters */
}
...
void printRecord(SomeRecord r) {
System.out.println("[" + r.getX() + " " + r.getY() + "]");
}
void printRecord(String x, int y) {
System.out.println("[" + x + " " + y + "]");
}
y
должно быть строго положительным и соответствующий сеттер такую проверку проводит (пускай ассертом), то это ещё будет, имхо, DTO, но ваши примеры уже будут неэквивалентны.The difference between data transfer objects and business objects or data access objects is that a DTO does not have any behavior except for storage and retrieval of its own data (accessors and mutators).
Почему-то многие приписывают понятие инкапсуляции именно реализации, т.е. конкретным методам типа getValue() и setValue().Я сколько раз говорил что это только инструмент языка, который помогает реализовать инкапсуляцию? У меня сложилось мнение, не отвергаю то, что ошибочно, что вы даже против методов setValue() & getValue() в DTO объектах.
Конечно, если вам очень хочется, вы можете создать свою абстракцию, в которой объектами смогут быть также и DTO, но тогда это сломает всю аналогию с реальным миром, где сообщения, которыми обмениваются агенты, не имеет абсолютно никакого поведения.Эм… А я разве сказал что DTO будут обладать поведением? Я сказал что доменный объект, который не обладает поведением может выполнять функции DTO.
что никаких действий кроме хранения и извлечения своих собственных данных DTO не производитС этим согласен. Но заметьте, существование объекта не обладающим поведением — нормальная абстракция. С письмом пример отлично подходит. И таких очень много.
Эм… А я разве сказал что DTO будут обладать поведением? Я сказал что доменный объект, который не обладает поведением может выполнять функции DTO.
Но заметьте, существование объекта не обладающим поведением — нормальная абстракция. С письмом пример отлично подходит. И таких очень много.
Но инкапсуляция при этом всё равно нарушается. Например, есть у нас доменный объект Point с полями x и y. Объект обладает некоторым поведением — как минимум для него перегружены операторы + и -, а также определён метод draw() для отрисовки на конве. Однако, как бы мы не старались, мы не сможем предусмотреть все возможные функции для точки, а значит нам придётся дать доступ к полям x и y через геттеры и сеттеры.Ну что за бред то? Инкапсуляция не есть скрытия состояния! Есть скрытие реализации! Я же уже не один раз пример приводил!
Паттерн Стратегия заменяет процедурные переменные (aka указатели на функцию, first-class citizen functions), паттерн Фабрика (ака Виртуальный Конструктор) закрывает дыру с ключевым словом newТо что вы пишите, чаще всего есть проблема языка, а не ООП. Но, вы хотите сказать что я не могу реализовать паттерн стратегия через указатель на функцию??? Паттерн — это шаблон реализации. Т.е. общий принцип, но не конкретная реализация.
вы хотите сказать что я не могу реализовать паттерн стратегия через указатель на функцию?
Вот только в ФП это никогда не называлось «паттерном стратегия», потому что это один из основных приемов самой парадигмы, нет никакого смысла выделять его в отдельный паттерн.
Поэтому паттерн то все равно нужен, даже в ФП.
НУ я если честно не понимаю каким образом паттерны являются минусом ООП. И не вижу смысла в подходе что чем больше паттернов, тем хуже.
Кому нужен-то?Программистам. Что бы инфу передавать друг другу было проще.
Паттерны не являются минусом ООП. Но не являются и его плюсом. Это просто некая данность, типовые решения задач.А вы не знаете почему тогда уважаемый ffriend использует паттерны, как что то, что является минусом ООП? :) :)
Программистам. Что бы инфу передавать друг другу было проще.
А вы не знаете почему тогда уважаемый ffriend использует паттерны, как что то, что является минусом ООП?
И это не имеет никакого отношения к программированию, это философия.
Но если вы видите результаты трудов человека, который умеет хорошо пользоваться ООП, то вам достаточно легко будет разобраться, что тут происходит.
А свою точку зрения я уже озвучивал: если парадигма порождает много паттернов, значит в ней есть много задач, которые не решаются «в лоб».Еще раз хочу попросить вас задуматься. Вы уверены что парадигма порождает паттерны? Ее узость? Почему вы не рассматриваете паттерн, как решение задачи инструментами парадигмы? И вы думаете что, если бы во всех ООП языках сразу были бы указатели на функции, то паттерн стратегия не появился бы? Почему вы говорите что функции высшего порядка это гораздо лучшее описание для программиста функционального языка, чем сказать что эти функции реализуют такую то стратегию? Задумайтесь.
Вы уверены что парадигма порождает паттерны?
И вы думаете что, если бы во всех ООП языках сразу были бы указатели на функции, то паттерн стратегия не появился бы?
Почему вы говорите что функции высшего порядка это гораздо лучшее описание для программиста функционального языка, чем сказать что эти функции реализуют такую то стратегию?
Потому что ФВП — это термин самой парадигмы, а не добавочный термин шаблона.Ну вы понимаете что ФВП и понятия стратегии несут абсолютно разный смысл. И когда мы говорим про стратегию, даже в рамках ФП, то это гораздо более конкретное использование ФВП? Или в ФП понятие стратегии вообще не применимо?:)
Ну вы понимаете что ФВП и понятия стратегии несут абсолютно разный смысл.
И когда мы говорим про стратегию, даже в рамках ФП, то это гораздо более конкретное использование ФВП?
Или в ФП понятие стратегии вообще не применимо?
Понимаете ли, в чем дело, «указатель на функцию» — это термин, невозможный в ООП. В ООП мы можем иметь дело только с объектами.Так я же и говорю что паттерн это решение проблемы средствами парадигмы. В ООП задачу с изменением поведнеия решают так, в ФП это решается вообще другими средствами в процедурном третьими.
Так я же и говорю что паттерн это решение проблемы средствами парадигмы.
только если парадигма не предоставляет средств решения, не требующих абстракции до паттерна.
И уж извините, но решения задач в рамках объектов, гораздо более понятны, чем скажем в ФП.
Кажется, я уже не первый раз вам повторяю одно и то же: все можно реализовать с помощью ООП. Но не всякое такое решение будет более понятно, чем решение на специализированном механизме.Эм, а что за механизм то? НЕ методология уже? А механизм инструмент? А если инструмент реализован с использованием ООП, то тогда считается?
Это уже демагогия пошла.Мне тоже так показалось.
ffriend не использует паттерны, как что-то, что является минусом ООП, он вообще ничего плохого про сами паттерны не говорил.Так а чего вы тогда их вообще притянули?
Так что чем больше паттернов, тем больше задач, с которыми голове ООП не может нормально справиться.
Не знаю, где вы здесь усмотрели камень в огород паттернов.И я не знаю где вы увидели подобное в моих словах. :) :) Понимаете, ваше высказывание:
ffriend не использует паттерны, как что-то, что является минусом ООП, он вообще ничего плохого про сами паттерны не говорил.состоит из двух частей. В первой части, вы утверждаете что «ffriend не использует паттерны, как что-то, что является минусом ООП», где я вам четко привожу ваши же слова:
Так что чем больше паттернов, тем больше задач, с которыми голове ООП не может нормально справиться.Вторую же часть «он вообще ничего плохого про сами паттерны не говорил», вы придумали сами. Т.к. я нигде не говорил что вы говорите про паттерны плохо. Отсюда я делаю четкие выводы что вы не видите того, что против вас, а видите лишь то, что вам хочется видеть. Я бы могу сказать что это просто розовые очки, но в свете ваших статей я бы сказал что это скорее дилетантство.
И я не знаю где вы увидели подобное в моих словах. :) :)
А вы не знаете почему тогда уважаемый ffriend использует паттерны, как что то, что является минусом ООП? :) :)
Любой язык создан для решения задач через абстракцииБраво. Ток в случае с ООп это решается через абстракции объектов.
Через пару лет, когда невинная печка-объект превращается в документацию на AbstractSingletonProxyFactoryBean про это уже и не вспоминают, но при объяснении ООП почему-то все равно говорят о том, что ООП — это об объектной декомпозиции.Ну ведь сложно не согласится, что это пример неудачной композиции. Пожалуй я соглашусь, с тем, что в динамике, если вы не заложили гибкость заранее, то проблемы будут. Но в целом весь вопрос в том, что вы не увидели гибких мест, не везде грамотно разорвали связи и вообще декомпозиция получилась очень жесткой. Я думаю что от серьезных изменений, непредвиденных, не застрахован никто.
Вычеркнем состояние. Наследование и полиморфизм со структурами без состояния — SOA, для которого пример с печкой лучше всего подходит.Ну я, если честно не до конца понял, как мы выпрыгнули так высоко. Но, более того, почему вы думаете, что в реализации SOA, на стороне одного из сервисов я не использую ОО подход? А также объекты с состояниями и без оных?
В ООП связи очень жесткие и выделить наследника на этапе проектрования не имея под боком такую же систему невозможно.Ну это опять таки, скорее ошибки проектирования. Т.к. принцип инверсии зависимостей и принцип разделения интерфейса как раз и позволяют решить эту проблему.
Знания проектировщика, работающего несколько лет с GUI будут бесполезны при разработке софта, работающего с деньгами.Абсолютно согласен. Только проблема в незнании предметной области.
Декомпозиция может и на объекты, но объекты эти могут быть чем угодно, и «ООП — это декомпозиция на что угодно».Да, это и есть универсальность ООП и основная проблема. Научиться этим пользоваться можно только обладая очень хорошим объектным мышлением. Но «прочитать» такие решения, чаще всего гораздо проще.
Объект, по SICP, — это такая штука, которая имеет и скрывает свой стейт, что иногда бывает удобно, а иногда — глупо. Такие объекты существовали и до ООП.Я очень рад, что какие то подходы впитывают лучшее от других. И ничего против этого не имею. Я уверен что только используя лучшее, и внося что то еще хорошее можно развиваться.
По моему опыту, ошибка в проектировании или резкая смена требований в ООП значительно сильнее усложняет внесение изменений, чем при использовании процедурного подхода.
Еще говорят что некоторые вещи нельзя представить в виде объектов и их взаимодействия. Я уверен что это не так.
Зачем нам ООП и что это такое