Запах кода 161 — Абстрактные/окончательные/неопределенные классы

Ваши классы абстрактные, конечные или неопределенные

TL;DR: Если ваш язык имеет соответствующий инструмент, ваши классы должны быть либо абстрактными, либо конечными.

Проблемы

  • Подклассификация для повторного использования кода

  • Классы, имеющие только один конкретный подкласс

  • Нарушение подстановки Лискова

  • Проблема [Yo-Yo]

Решения

  1. Объявляйте все классы-листья конечными, а остальные — абстрактными.

Контекст

Управление иерархиями и композицией — основная задача хорошего разработчика программного обеспечения.

Поддерживать иерархии в здоровом состоянии очень важно для обеспечения сплоченности и предотвращения сцепления.

Код примера

Неправильный

public class Vehicle
{
  // class is not a leaf. Therefore it should be abstract

  //an abstract method that only declares, but does not define the start 
  //functionality because each vehicle uses a different starting mechanism
  abstract void start();
}

public class Car extends Vehicle
{
  // class is leaf. Therefore it should be final
}

public class Motorcycle extends Vehicle
{
  // class is leaf. Therefore it should be final
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Правильно

abstract public class Vehicle
{
  // class is not a leaf. Therefore it is be abstract  

  //an abstract method that only declares, but does not define the start 
  //functionality because each vehicle uses a different starting mechanism
  abstract void start();
}

final public class Car extends Vehicle
{
  // class is leaf. Therefore it is final
}

final public class Motorcycle extends Vehicle
{
  // class is leaf. Therefore it is final
}
Войти в полноэкранный режим Выход из полноэкранного режима

Обнаружение

[X] Автоматическое

Поскольку это навязывается статическим анализом, мы не можем сделать это с помощью большинства доступных инструментов.

Теги

  • Субклассификация

Заключение

Мы должны оглянуться на наши классы и начать квалифицировать их либо как абстрактные, либо как конечные.

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

Отношения

Code Smell 11 — Подклассификация для повторного использования кода

Maxi Contieri ・ Oct 30 ’20 ・ 2 min read

#oop #codenewbie #учебник

Code Smell 136 — Классы с одним подклассом

Maxi Contieri ・ May 28 ・ 2 min read

Code Smell 37 — Защищенные атрибуты

Maxi Contieri ・ Nov 29 ’20 ・ 2 min read

#oop #webdev #tutorial #codenewbie

Code Smell 58 — Проблема йо-йо

Maxi Contieri ・ Jan 24 ’21 ・ 2 min read

#codenewbie #codesmell #tutorial #webdev

Подробнее

Сцепление: Единственная и неповторимая проблема проектирования программного обеспечения

Maxi Contieri ・ Feb 6 ’21 ・ 5 min read

#webdev #программирование #oop #учебник

Глубокие подклассы

Отказ от ответственности

Запахи кода — это только мое мнение.

Credits

Фото William Bossen on Unsplash


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

Брэди Кларк

Программная инженерия Великие цитаты

Maxi Contieri ・ Dec 28 ’20 ・ 13 min read

#codenewbie #программирование #цитаты #программное обеспечение

Эта статья является частью серии CodeSmell.

Как найти зловонные части вашего кода

Maxi Contieri ・ May 21 ’21 ・ 7 min read

#codenewbie #учебник #качество кода #новички

Оцените статью
devanswers.ru
Добавить комментарий