2008-12-06 2 views
27

При проектировании новой системы или обдумывании чужого кода какие-то говорят, что что-то пошло не так на этапе проектирования? Есть ли подсказки для поиска на диаграммах классов и иерархиях наследования или даже в самом коде, которые просто кричат ​​о пересмотре дизайна, особенно в начале проекта?Каковы контрольные признаки плохого объектно-ориентированного дизайна?

ответ

47

вещи, которые в основном торчат для меня являются «code smells».

В основном я чувствителен к вещам, которые противоречат «хорошей практике».

вещи, как:

  • методы, которые, кроме того, что можно подумать, что от названия вещей (например: FileExists(), который молча удаляет нулевые файлы байта)

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

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

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

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

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

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

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

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

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

+0

Хороший список, +1. Мне, однако, интересно узнать о чрезмерной плотности шаблонов проектирования. Вы действительно сталкиваетесь с этим? Я бы сказал, что это больше, когда шаблоны неправильно используются и злоупотребляют. – philant 2008-12-10 19:51:37

3

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

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

  • Чрезмерное использование операторов переключателя
  • Производные классы, которые переопределяют все,
+0

«базовый класс вниз литья сам к производному классу »- как всегда есть исключение, которое, когда вы используете CRTP для реализации nt имитирует динамическое связывание в C++. Производный класс передается базовому классу в качестве параметра шаблона, поэтому вы абсолютно точно знаете, что акты действительны. – 2008-12-06 01:35:04

+0

Это очень отличается от того, о чем я говорю. Я говорю о том, когда класс Vehicle знает, что класс Car существует. В вашем случае базовый класс до сих пор не знает о производном классе. Как вы сказали, исключения из правил. Я бы даже не назвал их правилами ... может быть, запах запаха? – 2008-12-06 01:38:41

+0

Ну, базовый * класс * имеет специфическое знание производного класса, просто программист имеет дело только с базовым шаблоном * класса *, которого нет. C++ - чистое золото для педантов ;-) – 2008-12-06 01:57:15

1

Вот некоторые из них:

  • Круговые зависимости
  • Вы с свойством XYZ ab Класс аза не был защищен/частный
  • Вы хотите, чтобы Ваш язык поддерживается множественное наследование
+0

Я должен не согласиться с третьим. Иногда MI может быть хорошим, если использовать правильно. – 2008-12-06 02:15:37

2

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

Если вы читаете мой последний вопрос, вы можете понять, почему я немного иссяк.

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

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

+0

Привет, я не понимаю. Не могли бы вы привести пример, пожалуйста. Благодарю. – user712092 2015-09-29 11:09:09

0

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

15

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

+1

Бинго! Смотрите мой комментарий. Хуже всего то, что по крайней мере 90% кода, который вы когда-либо увидите, невозможно правильно выполнить. – 2008-12-06 01:58:10

+0

Я считаю, что это то же самое, что сказать «высокая связь». – 2008-12-06 16:02:29

17

Проверьте это. Это потрясающе.

Bad Smells: http://c2.com/xp/CodeSmell.html

Его не специфичны для объектно-ориентированного программирования, но он охватывает много битов. Cheers.

+0

Добро пожаловать, Джейсон. – 2008-12-09 02:04:39

+1

Сервер, похоже, не работает, нам нужно называть его эффектом «stackoverflown» (в дополнение к «slashdotted»)? – dhiller 2009-05-03 07:30:03

+0

@Dhiller: Да, кажется, что нет. В любом случае, найти в другом месте. – 2009-05-05 02:07:18

18

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

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

Далее следуют:

  • Too м uch наследование вместо композиции, то есть классы, которые получают из подтипа, а потому получают бесплатную функциональность. Оплачивать композицию над наследованием.
6

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

5

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

Пример: У вас есть симуляция города.Если объект Person имеет свойство NearestPostOffice, у вас, вероятно, есть проблемы.

1

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

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

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

2

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

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

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

10

Anti-patterns

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

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

объектно-ориентированного проектирования антишаблоны

  • Domain Model Анемический: Использование домена модели без какой-либо бизнес-логики, которая не ООП, потому что каждый объект должен иметь как атрибуты и модели поведения
  • BaseBean: Наследование функциональности от полезности класса, а не делегируя ему
  • вызовов супер: Требуя подклассов вызвать переопределенный метод суперкласса в
  • Круг-эллипсе проблема: подтипирование с переменным типа на основе ценностного подтипа
  • Пустой сбой подкласса: создание класса, который не выполняет «Пустой тест подкласса», ведя себя иначе, чем производный от него класс без изменений
  • Объект Бога: концентрация слишком большого числа функций в одной части конструкции (класса)
  • объекта Подметально: Повторное использование объекты, состояние которых не соответствуют (возможно неявному) контракту для повторного использования
  • объекта оргии: в противном случае правильно инкапсулировать объекты, разрешающие неограниченный доступ к их внутренностям
  • полтергейста: объекты, единственной целью которых является для передачи информации другому объекту
  • последовательного присоединения: Класс, который требует, чтобы его методы, вызываемые в определенном порядке
  • Singletonitis: Чрезмерное использованием одноэлементного узора
  • Еще один Ненужное слой: Добавление ненужных слоев в программе, библиотеку или рамку. Это стало популярным после первой книги по шаблонам программирования.
  • йо-йо проблема: структура (например, наследование), что трудно понять, из-за чрезмерной фрагментации
1

Дублированный код = код, который делает то же самое ... Я думаю, что в моем опыте это самая большая ошибка, которая может возникнуть при проектировании OO.

0

Объекты хорошие создают газильон из них плохой дизайн OO.

0

Ниже приведены наиболее характерные особенности плохой дизайн:

  1. Жесткость
  2. Хрупкость
  3. неподвижность

Посмотрите на The Dependency Inversion Principle

Смежные вопросы