Каковы контрольные знаки плохого объектно-ориентированного проектирования? [закрытый]

Или для чего-то совершенно бесполезного:

[ -d . ] || echo "No"
30
задан Mitch Wheat 3 May 2009 в 06:08
поделиться

12 ответов

Вещи, которые главным образом добиваются меня," запахи кода ".

Главным образом я чувствителен к вещам, которые идут вразрез "с хорошей практикой".

Вещи как:

  • Методы, которые делают вещи кроме того, что Вы думали бы с имени (например: FileExists (), который тихо удаляет нулевые файлы байта)

  • Несколько чрезвычайно длинных методов (знак объектной обертки вокруг процедуры)

  • Повторное использование переключателя/операторов выбора на том же перечислимом участнике (знак подклассов, нуждающихся в извлечении)

  • Партии членских переменных, которые используются для обработки, для не получения состояния (мог бы указать на потребность извлечь объект метода)

  • , класс А, который имеет много обязанностей (нарушение Единственного принципа Repsonsibility)

  • Длинные цепочки членского доступа (this.that прекрасен, this.that.theOther, прекрасен, но my.very.long.chain.of.member.accesses.for.a.result является хрупким)

  • Плохое именование классов

  • Использование слишком многих шаблонов разработки в небольшом пространстве

  • Упорно работать также (переписывающий функции, уже существующие в платформе, или в другом месте в том же проекте)

  • Плохое написание (где угодно) и грамматика (в комментариях) или комментариях, которые просто вводят в заблуждение

48
ответ дан 27 November 2019 в 21:25
поделиться

Найдите программиста, который испытан с кодовой базой. Попросите, чтобы они объяснили, как что-то работает.

, Если они говорят "это вызовы функции та функция", их кодекс является процессуальным.

, Если они говорят "этот класс, взаимодействует с тем классом", их кодом является OO.

0
ответ дан 27 November 2019 в 21:25
поделиться

Наличие всего, чему Вы возражаете, наследовало некоторый основной служебный класс именно так, можно назвать служебные методы, не имея необходимость вводить так много кода.

0
ответ дан 27 November 2019 в 21:25
поделиться

В рамках длинного метода разделы окружили #region / #endregion - почти в каждом случае, который я видел, тот код мог легко быть извлечен в новый метод ИЛИ должен был быть пересмотрен в некотором роде.

Чрезмерно сложные деревья наследования, где подклассы делают совсем другие вещи и только мимоходом связаны друг с другом.

Нарушение DRY - подклассы, что каждое переопределение базовый метод почти точно тем же способом, только с незначительным изменением. Пример: Я недавно работал над некоторым кодом, где подклассами, каждый переопределил базовый метод и где единственной разницей была проверка печатания ("x ThisType" по сравнению с "x, является ThatType"). Я реализовал метод в основе, которая взяла универсальный тип T, который она затем использовала в тесте. Каждый ребенок мог затем назвать базовое внедрение, передав тип, против которого оно хотело протестировать. Это обрезало приблизительно 30 строк кода от каждого из 8 различных дочерних классов.

2
ответ дан 27 November 2019 в 21:25
поделиться

Вот некоторые:

  • Круговые зависимости
  • Вы со свойством XYZ базового класса не были защищены/частными
  • , Вам жаль, что Ваш язык не поддерживал множественное наследование
2
ответ дан 27 November 2019 в 21:25
поделиться

Одной вещью, которую я очень не хочу видеть, является базовый класс, вниз бросающий сам к производному классу. Когда Вы видите это, Вы знаете, что у Вас есть проблемы.

Другие примеры могли бы быть:

  • Чрезмерное использование операторов переключения
  • Производные классы, которые переопределяют все
3
ответ дан 27 November 2019 в 21:25
поделиться

Один запах является объектами, имеющими трудно зависимости/ссылки к другим объектам, которые не являются частью их естественной иерархии объектов или связанного с доменом состава.

Пример: Скажите, что у Вас есть городское моделирование. Если объект Человека имеет свойство NearestPostOffice, Вы, вероятно, в беде.

5
ответ дан 27 November 2019 в 21:25
поделиться

Этот вопрос делает предположение, которое объектно-ориентированный означает хороший дизайн. Существуют случаи, где другой подход является намного более соответствующим.

7
ответ дан 27 November 2019 в 21:25
поделиться

Невозможный к модульному тесту правильно.

16
ответ дан 27 November 2019 в 21:25
поделиться

По моему мнению, весь код ООП ухудшается к процессуальному кодексу по достаточно долговременному промежутку.

Предоставленный при чтении моего нового вопроса Вы могли бы понять, почему я немного заезжен.

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

, После того как Вы решаете ту проблему, ООП на самом деле начинает иметь смысл. Проблема состоит в том, что очень немного команд знают об этом шаблоне разработки.

3
ответ дан 27 November 2019 в 21:25
поделиться

Антишаблоны

антишаблоны Разработки программного обеспечения

  • инверсия Абстракции: Не представление реализованной функциональности, требуемой пользователями, так, чтобы они повторно реализовали его с помощью высокоуровневых функций
  • Неоднозначная точка зрения: Представление модели (обычно OOAD), не указывая его точку зрения
  • Большой комок грязи: система без распознаваемой структуры
  • Блоб: Обобщение Бога возражает от объектно-ориентированной фабрики Газа дизайна
  • : излишне сложный Входной клудж дизайна
  • : Отказ указать и реализовать обработку возможно недопустимого входа
  • Интерфейсное чрезмерное увеличение размера: Создание интерфейса, столь мощного, что чрезвычайно трудно реализовать
  • кнопка Magic: Кодирование логики реализации непосредственно в рамках интерфейсного кода, не используя абстракцию.
  • опасность Гонки: Отказ видеть последствие различных заказов событий
  • решение Railroaded: предлагаемое решение, что, в то время как плохой, является единственным, доступным из-за плохого предвидения и негибкости в других областях Пересвязи дизайна
  • : Представление зависимости от лишнего объекта
  • система Дымохода: едва удобная в сопровождении совокупность плохо связанных компонентов
  • схема Staralised: схема базы данных, содержащая двойные таблицы цели для использования нормализованной и витрины данных

Объектно-ориентированные антишаблоны дизайна

  • Анемичная Модель предметной области: использование модели предметной области без любой бизнес-логики, которая не является ООП, потому что каждый объект должен иметь и атрибуты и поведения
  • BaseBean: Наследование функциональности от служебного класса вместо того, чтобы делегировать к нему
  • Вызов супер: Требование, чтобы подклассы назвали переопределенный метод суперкласса
  • проблема Кругового эллипса: Выделение подтипов в типах переменных на основе подтипов значения
  • Пустой отказ подкласса: Создание класса, который проваливает "Пустой Тест Подкласса" путем поведения по-другому по сравнению с классом, полученным из него без модификаций
  • объект Бога: Концентрация слишком многих функций в единственной части дизайна (класс)
  • выгребная яма Объекта: Многократное использование возражает, чье состояние не соответствует (возможно неявный) контракт для повторного использования
  • Объектная оргия: Отказ правильно инкапсулировать объекты, разрешающие неограниченный доступ к их внутренностям
  • Полтергейсты: Объекты, единственная цель которых состоит в том, чтобы передать информацию другому объекту
  • Последовательная связь: класс, который требует, чтобы его методы были названы в особом порядке
  • Singletonitis: злоупотребление шаблоном "одиночка"
  • еще один Бесполезный Слой: Добавляя ненужные слои к программе, библиотеке или платформе. Это стало популярным после первой книги по шаблонам программирования.
  • Неустойчивая проблема: структура (например, наследования), который трудно понять из-за чрезмерной фрагментации
12
ответ дан 27 November 2019 в 21:25
поделиться

Я сказал бы, что правило номер один плохого дизайна OO (и да я был виновен в нем слишком много раз!):

  • Классы, которые повреждаются Единственный Принцип Ответственности (SRP) и выполняют слишком много действий

Сопровождаемый:

  • Слишком много наследования вместо состава, т.е. Классы, которые происходят из подтипа просто, таким образом, они получают функциональность бесплатно. Состав Пользы по Наследованию .
18
ответ дан 27 November 2019 в 21:25
поделиться