При проектировании новой системы или обдумывании чужого кода какие-то говорят, что что-то пошло не так на этапе проектирования? Есть ли подсказки для поиска на диаграммах классов и иерархиях наследования или даже в самом коде, которые просто кричат о пересмотре дизайна, особенно в начале проекта?Каковы контрольные признаки плохого объектно-ориентированного дизайна?
ответ
вещи, которые в основном торчат для меня являются «code smells».
В основном я чувствителен к вещам, которые противоречат «хорошей практике».
вещи, как:
методы, которые, кроме того, что можно подумать, что от названия вещей (например: FileExists(), который молча удаляет нулевые файлы байта)
Несколько очень долго методы (признак объекта обертки вокруг процедуры)
Повторное использование переключателя/случае заявления на том же перечисленном элементе (признак подклассов необходимости экстракции)
много переменных-членов, которые используются для обработки, а не для захвата состояния (может указывать нужно извлечь объект метод)
класс, который имеет много обязанностей (нарушение принципа одного Repsonsibility)
Длинные цепи доступа к члену (это хорошо, это.что другое прекрасно, но my.very.long.chain.of.member.accesses.for.a.Результатом является хрупким)
Плохое именование классов
Использование слишком большого количества шаблонов проектирования в небольшом пространстве
Работа слишком трудно (переписывание функции уже существующие в рамках, или в другом месте в том же проект)
Плохое написание (в любом месте) и грамматики (в комментариях), или комментарии, которые просто вводят в заблуждение
Одна вещь, которую мне не нравится видеть, - это базовый класс, сбрасывающий себя в производный класс. Когда вы это видите, вы знаете, что у вас проблемы.
Другие примеры могут быть:
- Чрезмерное использование операторов переключателя
- Производные классы, которые переопределяют все,
«базовый класс вниз литья сам к производному классу »- как всегда есть исключение, которое, когда вы используете CRTP для реализации nt имитирует динамическое связывание в C++. Производный класс передается базовому классу в качестве параметра шаблона, поэтому вы абсолютно точно знаете, что акты действительны. – 2008-12-06 01:35:04
Это очень отличается от того, о чем я говорю. Я говорю о том, когда класс Vehicle знает, что класс Car существует. В вашем случае базовый класс до сих пор не знает о производном классе. Как вы сказали, исключения из правил. Я бы даже не назвал их правилами ... может быть, запах запаха? – 2008-12-06 01:38:41
Ну, базовый * класс * имеет специфическое знание производного класса, просто программист имеет дело только с базовым шаблоном * класса *, которого нет. C++ - чистое золото для педантов ;-) – 2008-12-06 01:57:15
Вот некоторые из них:
- Круговые зависимости
- Вы с свойством XYZ ab Класс аза не был защищен/частный
- Вы хотите, чтобы Ваш язык поддерживается множественное наследование
Я должен не согласиться с третьим. Иногда MI может быть хорошим, если использовать правильно. – 2008-12-06 02:15:37
На мой взгляд, все коды ООП вырождаются до процедурного кода на достаточно длительный промежуток времени.
Если вы читаете мой последний вопрос, вы можете понять, почему я немного иссяк.
Ключевая проблема с ООП заключается в том, что она не делает очевидным, что график построения объекта не должен зависеть от вашего графика вызовов.
Как только вы исправите эту проблему, ООП действительно начинает иметь смысл. Проблема в том, что очень немногие команды знают об этом шаблоне проектирования.
Привет, я не понимаю. Не могли бы вы привести пример, пожалуйста. Благодарю. – user712092 2015-09-29 11:09:09
Имея все объекты, наследующие некоторый базовый класс утилиты, чтобы вы могли вызвать свои методы утилиты, не набирая столько кода.
Невозможно правильно протестировать устройство.
Бинго! Смотрите мой комментарий. Хуже всего то, что по крайней мере 90% кода, который вы когда-либо увидите, невозможно правильно выполнить. – 2008-12-06 01:58:10
Я считаю, что это то же самое, что сказать «высокая связь». – 2008-12-06 16:02:29
Проверьте это. Это потрясающе.
Bad Smells: http://c2.com/xp/CodeSmell.html
Его не специфичны для объектно-ориентированного программирования, но он охватывает много битов. Cheers.
Добро пожаловать, Джейсон. – 2008-12-09 02:04:39
Сервер, похоже, не работает, нам нужно называть его эффектом «stackoverflown» (в дополнение к «slashdotted»)? – dhiller 2009-05-03 07:30:03
@Dhiller: Да, кажется, что нет. В любом случае, найти в другом месте. – 2009-05-05 02:07:18
Я бы сказал, что номер один правило плохого дизайна OO (да и я был виновен в этом слишком много раз!) Является:
- Классов, которые нарушают Single ответственность Принципа (SRP) и выполняют слишком много действий
Далее следуют:
- Too м uch наследование вместо композиции, то есть классы, которые получают из подтипа, а потому получают бесплатную функциональность. Оплачивать композицию над наследованием.
Этот вопрос делает предположение, что объектно-ориентированный означает хороший дизайн. Бывают случаи, когда другой подход гораздо более уместен.
Один запах - это объекты, имеющие жесткие зависимости/ссылки на другие объекты, которые не являются частью их естественной иерархии объектов или составной состав, связанный с доменом.
Пример: У вас есть симуляция города.Если объект Person имеет свойство NearestPostOffice, у вас, вероятно, есть проблемы.
Найти программиста, который имеет опыт работы с базой кода. Попросите их объяснить, как что-то работает.
Если они говорят, что эта функция вызывает эту функцию, их код является процедурным.
Если они говорят, что «этот класс взаимодействует с этим классом», их код равен OO.
В длинном методе разделы, окруженные #region/#endregion - почти в каждом случае, который я видел, этот код можно легко извлечь в новый метод или необходимо каким-то образом реорганизовать.
Слишком сложное дерево наследования, где подклассы выполняют разные вещи и только касательно связаны друг с другом.
Нарушение DRY - подклассы, которые каждый переопределяют базовый метод почти точно так же, с незначительным изменением. Пример. Недавно я работал над некоторым кодом, в котором каждый из подклассов переопределял базовый метод и где единственным отличием был тест типа («x is ThisType» vs «x is ThatType»). Я реализовал метод в базе, который взял общий тип T, который затем использовался в тесте. Затем каждый ребенок мог вызвать базовую реализацию, передав тип, с которым он хотел протестировать. Это обрезало около 30 строк кода из каждого из 8 разных дочерних классов.
дизайн программного обеспечения антишаблоны
- Абстракция инверсия: Не подвергая реализованы функциональные возможности, необходимые пользователям, чтобы они повторно реализовать его, используя высокоуровневые функции
- неоднозначным точки зрения: Представление модели (обычно OOAD) без указания ее точки зрения
- Большой шар грязи: система без узнаваемой структуры
- Blob: Обобщение объекта Бога от объектно-ориентированного проектирования
- газа завода: излишне сложной конструкции
- Input ляп: В противном случае определить и осуществить обработку, возможно, недопустимого ввода
- Интерфейс наворотов: Создание интерфейса так что чрезвычайно сложно реализовать
- Волшебная кнопка: логика реализации кодирования непосредственно внутри кода интерфейса, без использования абстракции.
- гонки опасности: В противном случае, чтобы увидеть последствия различных порядков событий
- Railroaded решение: Предлагаемое решение, в то время как бедные, является единственным доступным из-за плохого предвидения и негибкость в других областях дизайна
- Re -coupling: Введение ненужному объект зависимости
- печной системы: едва ремонтопригодна сборка плохо связанные компонентов
- Staralised схемы: база данных, содержащая схему таблицы двойного назначения для нормализованного и DataMart использования
объектно-ориентированного проектирования антишаблоны
- Domain Model Анемический: Использование домена модели без какой-либо бизнес-логики, которая не ООП, потому что каждый объект должен иметь как атрибуты и модели поведения
- BaseBean: Наследование функциональности от полезности класса, а не делегируя ему
- вызовов супер: Требуя подклассов вызвать переопределенный метод суперкласса в
- Круг-эллипсе проблема: подтипирование с переменным типа на основе ценностного подтипа
- Пустой сбой подкласса: создание класса, который не выполняет «Пустой тест подкласса», ведя себя иначе, чем производный от него класс без изменений
- Объект Бога: концентрация слишком большого числа функций в одной части конструкции (класса)
- объекта Подметально: Повторное использование объекты, состояние которых не соответствуют (возможно неявному) контракту для повторного использования
- объекта оргии: в противном случае правильно инкапсулировать объекты, разрешающие неограниченный доступ к их внутренностям
- полтергейста: объекты, единственной целью которых является для передачи информации другому объекту
- последовательного присоединения: Класс, который требует, чтобы его методы, вызываемые в определенном порядке
- Singletonitis: Чрезмерное использованием одноэлементного узора
- Еще один Ненужное слой: Добавление ненужных слоев в программе, библиотеку или рамку. Это стало популярным после первой книги по шаблонам программирования.
- йо-йо проблема: структура (например, наследование), что трудно понять, из-за чрезмерной фрагментации
Дублированный код = код, который делает то же самое ... Я думаю, что в моем опыте это самая большая ошибка, которая может возникнуть при проектировании OO.
Объекты хорошие создают газильон из них плохой дизайн OO.
Ниже приведены наиболее характерные особенности плохой дизайн:
- Жесткость
- Хрупкость
- неподвижность
Посмотрите на The Dependency Inversion Principle
- 1. Признаки плохого дизайна?
- 2. Каковы контрольные признаки того, что мой код должен использовать многопоточность?
- 3. Каковы признаки инициализации крестов?
- 4. Каковы признаки UIImage - Swift
- 5. Примеры плохого дизайна RESTful
- 6. Характеристики плохого объектно-ориентированного дизайна
- 7. Каковы обратные признаки в определениях типа Apollo?
- 8. Каковы контрольные квалификаторы для функций?
- 9. Почему использование плохого дизайна ключевого слова typeid?
- 10. Чувство плохого макета дизайна с помощью Segues
- 11. Является ли это примером плохого дизайна?
- 12. Контрольные устройства Android для отзывчивого веб-дизайна
- 13. Каковы различные типы шаблонов дизайна?
- 14. Признаки умирающего программного обеспечения
- 15. Каковы самые большие ошибки дизайна в популярных языках или библиотеках?
- 16. Пропущенные инварианты для объекта всегда являются признаком плохого дизайна?
- 17. Должен ли возвращать несколько объектов признаку плохого дизайна?
- 18. Является ли проверка типа объекта действительно всегда признаком плохого дизайна?
- 19. Является ли использование на objc 'iskKindOfClass: «индикацией плохого дизайна?
- 20. Делает ли сбор мусора причиной плохого дизайна программного обеспечения?
- 21. Является ли пользователь подтверждением плохого дизайна действия UIActionSheet?
- 22. Неужели у плохого дизайна есть класс, используемый только одним классом?
- 23. Тестирование устройства не выполняется из-за плохого дизайна
- 24. Каковы шаги для идеального проекта веб-дизайна?
- 25. Каковы недостатки в моей логике дизайна формы?
- 26. Каковы преимущества и недостатки дизайна/кода отзывов?
- 27. Каковы хорошие способы дизайна или состояния диаграммы?
- 28. Каковы общие шаблоны дизайна в Cocoa Touch?
- 29. Каковы недостатки в использовании «универсального» настольного дизайна?
- 30. Каковы контрольные точки «em» для iPhone? (Не размер пикселей)
Хороший список, +1. Мне, однако, интересно узнать о чрезмерной плотности шаблонов проектирования. Вы действительно сталкиваетесь с этим? Я бы сказал, что это больше, когда шаблоны неправильно используются и злоупотребляют. – philant 2008-12-10 19:51:37