Предыдущие части: Часть 1
Добро пожаловать во вторую часть продвинутых советов по написанию кода. В данной статье мы продолжим изучение остальных code smells с реальными примерами и способами исправления ситуации.
— Одержимость примитивами
Этот code smell проявляется всякий раз, когда в своем приложении вы начинаете повсеместно пользоваться примитивными типами данных. Например, целые числа для номеров телефона и строки для валютных символов. Если вы грешите подобным, то взгляните на следующий класс.
Как вы видите, address в примере определен массивом. Такой подход приведет сразу к двум проблемам: каждый раз, когда нам потребуется адрес, придется его хардкодить. Так почему бы попросту не создать новый класс Address?
Теперь всякий раз при добавлении/изменении адреса будем обращаться к классу Address. И для добавления новых методов «Свяжитесь с нами» мы кликаем на класс ContactUs. Таким образом получается, что каждый класс обладает единственной ответственностью.
— Оператор switch
Возможно, сейчас вы задались вопросом: чем же так ужасен оператор switch? Конечно же, он не всегда плох, но, как наглядно показывает следующий пример, этот оператор является довольно крупной и непредсказуемой штукой. По мере его разрастания вы не сможете поделить switch на более мелкие методы.
Всегда помните! Если оператор switch не очень длинный, то его можно оставить. Идеальный пример оператора switch находится внутри фабричного шаблона проектирования.
— Параллельные иерархии наследования
Иногда я и сам гадаю, являются ли параллельные иерархии наследования порочной практикой разработчика. Для начала, давайте разберемся в самих иерархиях, а затем уже решим: хорошо ли это или плохо.
Как вы уже заметили из примера выше, каждый раз при создании нового класса Department нужно добавлять и класс Privilege, что приводит нас прямиком к code smell под названием «Стрельба дробью».
— Ленивый класс
Это тот самый класс, который толком ничего не делает. Помните картинку выше?
Мы решили перенести адрес в отдельный класс. Но горячую линию (hotline в коде) мы не трогали, иначе получился бы класс всего с тремя строками. Поэтому всякий раз при обнаружении ленивых классов, смело от них избавляйтесь.
— Временные поля
Такой запах появляется, если у вас есть переменные экземпляра класса, которыми вы пользуетесь лишь изредка. Посмотрите на следующий пример. Вы заметите, что $name и $contactDetails используются только в методе notify().
Так почему бы не передавать их в качестве параметров метода?
Перевод статьи Mohamed Aladdin: Become An Expert Developer with These Advanced Coding Tips (Part 2)