Запах кода высшего порядка

Кодовые запахи - это хорошо зарекомендовавшая себя идея.

Часть, касающаяся запаха, очень описательна: как открыть холодильник после уик-энда. Вы знаете, когда что-то не так.

Существуют популярные инструменты, помогающие их обнаружить (Checkstyle, SonarQube и т. Д.). Существуют исследовательские работы, дающие им таксономию и позволяющие измерить их относительную стоимость. В качестве мысленного упражнения интересно назвать их и дать классификации (и подумать, какие из них самые худшие), но меня больше всего интересует, как они появляются в дикой природе.

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

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

(Edit: теперь у него полностью Часть 2.)

N-мерный объект

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

Характеризуется: (1) неконтролируемыми побочными эффектами, (2) слишком большим количеством параметров и (3) цикломатической сложностью.

N-мерный объект пытается быть слишком многим.

Неправильная комбинация аргументов будет казаться верной, но будет иметь побочные эффекты (1). Это связано с тем, чтобы втиснуть все параметры для разных целей в одно место (2). И множество вариантов входных данных будет достигать разных ветвей кода, и о них трудно рассуждать (3).

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

Вот один.

Модель, предназначенная для использования с Profile экраном, способным отображать User человека, группу пользователей и / или несколько элементов управления для администраторов:

N-мерные объекты появляются там, где простая функция постоянно приобретает новые вариации без изменения модели данных. Или иногда серия дизайнерских решений приводит к пользовательскому интерфейсу с множеством различных «вкусов», и изменения выходят из-под контроля. В других случаях это контейнер пользовательского интерфейса, например Android Fragment или Activity, который имеет много разных режимов инициализации.

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

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

На этом пока все!

Коллин хранит свежий код в Livefront, и он благодарит вас за чтение.