Мой друг работает в небольшой компании над проектом, который ненавидит каждый разработчик: он вынужден выпустить как можно быстрее, он единственный, кто, похоже, заботится о техническом долге, у клиента нет технической подготовки и т. Д.
Он рассказал мне историю, которая заставила меня задуматься о целесообразности шаблонов проектирования в подобных проектах. Вот история.
Пришлось выставлять товары в разных местах на сайте. Например, менеджеры контента могут просматривать продукты, а также конечных пользователей или партнеров через API.
Иногда в продуктах отсутствовала информация: например, у некоторых из них не было цены, когда продукт был только что создан, но цена еще не указана. У некоторых не было описания (описание представляло собой сложный объект с историями изменений, локализованным контентом и т. Д.). Некоторым не хватало информации о доставке.
Вдохновленный моими недавними чтениями о шаблонах проектирования, я подумал, что это отличная возможность использовать волшебный шаблон Null Object . Я так и сделал, и все было гладко и чисто. Нужно было просто позвонить,
product.Price.ToString("c")
чтобы отобразить цену илиproduct.Description.Current
показать описание; никаких условных вещей не требуется. До тех пор, пока однажды заинтересованная сторона не попросила отображать его по-другому в API, добавивnull
в JSON. А также по-разному для контент-менеджеров, показывая «Цена не указана [Изменить]». И мне пришлось убить мою любимую модель Null Object, потому что в ней больше не было необходимости.Таким же образом мне пришлось удалить несколько абстрактных фабрик и несколько сборщиков, в итоге я заменил свой красивый шаблон Facade прямыми и некрасивыми вызовами, потому что базовые интерфейсы менялись два раза в день в течение трех месяцев, и даже Singleton оставил меня когда требования говорят, что соответствующий объект должен быть различным в зависимости от контекста.
Более чем три недели работы состояли из добавления шаблонов проектирования, а затем разрыва их на месяц позже, и мой код, наконец, стал достаточно спагетти, чтобы его никто не мог поддерживать, включая меня самого. Не лучше ли вообще никогда не использовать эти шаблоны?
Действительно, мне приходилось работать над проектами тех типов, где требования постоянно меняются и диктуются людьми, которые на самом деле не имеют в виду сплоченность или согласованность продукта. В этом контексте не важно, насколько вы гибки, вы получите элегантное решение проблемы, и когда вы, наконец, внедрите его, вы узнаете, что требования изменились настолько радикально, что ваше элегантное решение не подходит больше
Каково было бы решение в этом случае?
Не использовать какие-либо шаблоны проектирования, перестать думать и писать код напрямую?
Было бы интересно провести опыт, когда одна команда пишет код напрямую, а другая дважды подумает, прежде чем набирать текст, рискуя тем, что несколько дней спустя выбрасывает оригинальный дизайн: кто знает, может быть, обе команды получат тот же технический долг. В отсутствие таких данных я бы только утверждал, что он не считает нужным набирать код без предварительного обдумывания при работе над проектом на 20 человеко-месяцев.
Сохранить шаблон проектирования, который больше не имеет смысла, и попытаться добавить больше шаблонов для вновь созданной ситуации?
Это тоже не кажется правильным. Шаблоны используются для упрощения понимания кода; положить слишком много шаблонов, и код станет беспорядок.
Начать думать о новом дизайне, который охватывает новые требования, а затем постепенно преобразовать старый дизайн в новый?
Как теоретик и тот, кто предпочитает Agile, я полностью увлечен этим. На практике, когда вы знаете, что вам придется возвращаться к доске каждую неделю и переделывать большую часть предыдущего дизайна, и что у клиента просто не хватает средств, чтобы заплатить вам за это, или не хватает времени ждать это, вероятно, не сработает.
Итак, есть предложения?