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

В этой статье я остановлюсь на теме «Уровень метода».

  • Чем пахнет код?
  • Как определить запах кода на уровне метода?

Что такое запахи кода? 🌋

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

Запах на уровне метода

в этой области большая часть кода возникает из-за соглашений об именах и раздутого контента.

Слишком много параметров: 💥

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

fun registerNewUser( firstName: String, lastName: String, birthDate: String, gender: String, email: String, mobileNumber: String, country: String) {
...
}

Решение: сгруппируйте параметры в общую группу данных, в этом случае мы можем сделать это так

data class User(
    val firstName: String,
    val lastName: String,
    val birthDate: String,
    val gender: String,
    val email: String,
    val mobileNumber: String,
    val country: String
)

тогда наш метод регистрации будет

fun registerNewUser(user: User) {
    ...
}

Длинный метод: 💥

Любой метод должен отвечать только за одно поведение, а не за многие. такой термин мы называем Раздутый метод, который представляет собой метод, содержащий множество действий в одной функции.

Когда сложно придумать осмысленное имя для функции (вероятно, она делает слишком много). Разбейте Раздутый метод на новые функции, которые делают их все более удобными в обслуживании и используют осмысленные имена для новых функций.

Слишком длинные идентификаторы: 💥

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

Слишком короткие идентификаторы: 💥

имя переменной должно отражать ее функцию, если функция не очевидна.

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

Чрезмерный возврат данных: 💥

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

fun calculateUserAge(birthDate: Date): User {
    .....
    return user
}

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

Длинная строка кода (или God Line): 💥

Сколько раз вы ловили слишком длинную строку с более чем одним вызовом или строку, которую вам приходилось прокручивать по горизонтали, чтобы поймать ее конец, такую ​​строку мы называем Линия Бога Я предполагаю, что такая строка должна называться Devil line, что затрудняет чтение, понимание, отладку, рефакторинг кода или даже определение возможностей повторного использования программного обеспечения. Пример:

сохраняйте формат кода с ограничением разрыва строки.

Ресурсы: