Симптомы и альтернативы чрезмерному ООП
В последнее время я теряю доверие к ООП. Я уже видел много жалобы на обычные злоупотребления ООП или просто простое злоупотребление. я не означает общую путаницу между отношениями is-a и has-a. Я имею в виду такие как проблемы ORM при работе с реляционными базами данных, чрезмерное использование наследования с С#, а также несколько лет при кодексе с тем же ложным инкапсуляционным убеждением, что Скотт Мейерс упоминает в пункте 23 Эффективного С++
Мне интересно узнать больше об этом и о программном обеспечении OOP шаблоны, которые могут решить определенные проблемы лучше, чем их ООП двойники. Я убежден, что там много людей давая хороший совет о том, как использовать это как преимущество с нечистым ООП такие языки, как С++.
Кто-нибудь знает хорошую ссылку (автор, книга, статья), чтобы получить начало?
Пожалуйста, обратите внимание, что я ищу две связанные, но разные вещи:
- Общие злоупотребления концепциями ООП (например, пункт 23)
- Шаблоны, где ООП не лучшее решение (с альтернативами)
Ответы
Ответ 1
Хорошо, я могу порекомендовать вам книгу Agile Principles, Patterns and Practices в С#.
Примеры, конечно, есть в С#, но идея книги универсальна. Он не только охватывает Agile, но также фокусируется на плохих практиках и показывает в примерах, как преобразовать плохой код в хороший код. Он также содержит описания многих шаблонов проектирования и показывает, как их реализовать в полу-реальном примере приложения Payroll.
Ответ 2
Это нужно сделать, но если вы действительно хотите уйти от ООП или хотя бы взглянуть на концепции, которые не являются ООП, но используются с большой эффективностью: Узнайте у вас Haskell. Попробуйте новую парадигму программирования, а затем начните видеть, где вы можете применить многие концепции к языкам ООП. Это касается вашей второй пули, а не прямо, но поверьте мне, это поможет больше, чем вы можете думать.
Ответ 3
Немного странно, что вы упоминаете С#. У этого есть очень сильные ключевые слова, чтобы держать обычное наследование страдания под контролем. Первое должно быть внутренним ключевым словом. Понятие ограничения видимости для модуля. Эта концепция полностью отсутствует в С++, модель построения просто не поддерживает ее. В противном случае отличная концепция: "Я доверяю членам своей команды, чтобы все было правильно". Конечно, да.
Тогда есть slammer one, запечатанное ключевое слово. Чрезвычайно мощный, "доллар останавливается здесь, не возиться со мной". Используемый с хирургической точностью в .NET framework, я еще не нашел случая, когда запечатанное было использовано ненадлежащим образом. Также отсутствует в С++, но с неясными способами, чтобы это работало.
Но да, объектная модель WPF сосет довольно тяжелую. Унаследовать 6 уровней в глубину и использовать бэкдоры, как свойство зависимости, является оскорбительным. Наследование трудно, отпустите покупки.
Ответ 4
Я бы сказал, чтобы посмотреть на игровые движки. По большей части ООП имеет тенденцию к снижению производительности, и игровая индустрия, похоже, одержима устранением незначительных замедлений (а иногда и игнорированием крупных). Таким образом, их код, хотя обычно написанный на языке, который поддерживает ООП, в конечном итоге будет использовать только те элементы ООП, которые необходимы для чистого кода/простоты обслуживания, который также уравновешивает производительность.
EDIT:
Сказав это, я не знаю, действительно ли я посмотрю на Unreal. Они делают некоторые странные вещи ради того, чтобы сделать контентный конвейер проще для разработчиков... он делает свой код... ну, посмотрите, действительно ли вы хотите знать.
Ответ 5
Одно распространенное избыточное использование - это принудительное выполнение ООП в программах/сценариях, которые вводят некоторый ввод, выводят его на вывод, а затем выводят (и не получают вход из любого места во время процесса). В этих случаях процедурный подход намного более чист.
Типичный пример этого - принудительное выполнение ООП в PHP-скриптах.