вторник, ноября 07, 2006

Расползание классов

Однажды на протяжении почти двух лет я участвовал в превращении симпатичного и аккуратного кода в бесформенный ужас. Происходило это медленно и потому незаметно. Только когда код готовился к передаче заказчику (женщина по имени Amber не захотела поднимать ставку), я осознал. COM-компонент с функциональностью однопроходного разбора PST-файла. Несколько потоков для обеспечения асинхронной работы подсистемы уведомлений, элегантные вызовы функций чтения данных из PST (100% reverse engineering, выполненный одним насколько умным, настолько же и странным парнем из Волжского, Волг. обл). При передаче я обнаружил, что этот же самый класс с некогда весьма высокоуровневой функциональностью содержал:

  1. Методы работы со строками
  2. Методы выбора временного имени
  3. Постоянно расширяемый if, в котором определялись имена папок-исключений
  4. Методы формирования сообщений в формате eml

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

Сейчас я больше всего боюсь именно этого эффекта в коде. Если класс начинает расширяться не свойственной ему функциональностью, я начинаю заметно нервничать. Вот только что закончил ревизию пары классов базовой библиотеки, которые ни с того, ни с сего обогатились новыми свойствами и специальной обработкой в методе set свойства, которые используются в одном единственном месте в другом (!!) проекте. Бывает, что устаёшь, пишешь абы как, расставляя комментарии и предупреждения для исправления безобразия завтра же. Я считаю, что это нормально: концепция подтверждена, можно подчистить. Но когда явно временная затычка, появившаяся в результате лени, начинает жить - код начинает умирать.

Почему об этом стоит думать? В самом деле, не один ли хрен, что там внутри, если оно работает. Это я слышал много раз на разные лады, вплоть до "пусть пока побудет так, в следующей версии поправим". Если слышите такое - не стесняйте себя в выражениях. Лучше один раз поругаться, чем потом неделями сталкиваться с последствиями неисправленной кривизны (если есть один архитектурный косяк, то непременно будут и другие, можно не сомневаться). Я считаю, что быстрое превращение структуры класса в тесто является очень плохим признаком, обнаружив который, надо бить во все колокола.

Комментариев нет: