Это немного касательная, основанная на ответе "Митч Уит".
Как правило, каждый раз, когда я вижу, что люди цитируют руководящие принципы проектирования фреймворка, я всегда хочу упомянуть следующее:
В большинстве случаев вы должны игнорировать рекомендации по проектированию каркаса.
Это не из-за каких-либо проблем с рекомендациями по разработке структуры. Я думаю, что .NET Framework - это фантастическая библиотека классов. Большая часть этой фантастики вытекает из руководящих принципов проектирования фреймворка.
Однако рекомендации по проектированию не применяются к большинству кода, написанного большинством программистов. Их цель состоит в том, чтобы сделать возможным создание большой инфраструктуры, которая используется миллионами разработчиков, а не для того, чтобы повысить эффективность написания библиотек.
Множество предложений в нем могут помочь вам сделать то, что:
- Может быть, не самый простой способ реализации чего-либо
- Может привести к дополнительному дублированию кода
- Может иметь дополнительные накладные расходы времени выполнения
.NET Framework большой, действительно большой. Он настолько велик, что было бы абсолютно неразумно предполагать, что кто-то обладает детальными знаниями о каждом его аспекте. На самом деле гораздо безопаснее предположить, что большинство программистов часто сталкиваются с частями инфраструктуры, которые они никогда не использовали ранее.
В этом случае основными целями дизайнера API являются:
- Держите вещи в соответствии с остальной частью структуры
- Устранить ненужные сложности в области поверхности API
Руководящие указания по проектированию инфраструктуры подталкивают разработчиков к созданию кода для достижения этих целей.
Это означает выполнение таких действий, как обход слоев наследования, даже если это означает дублирование кода или выталкивание всего кода, генерирующего исключения, в «точки входа» вместо использования общих помощников (чтобы трассировка стека имела больше смысла в отладчике), и много других подобных вещей.
Основная причина, по которой эти рекомендации предлагают использовать атрибуты вместо интерфейсов маркеров, заключается в том, что удаление интерфейсов маркеров делает структуру наследования библиотеки классов гораздо более доступной. Диаграмма классов с 30 типами и 6 уровнями иерархии наследования очень сложна по сравнению с диаграммой с 15 типами и 2 уровнями иерархии.
Если ваши API действительно используют миллионы разработчиков, или ваша кодовая база действительно велика (скажем, более 100K LOC), то выполнение этих рекомендаций может помочь.
Если 5 миллионов разработчиков тратят 15 минут на изучение API, а не на 60 минут на его изучение, то получается чистая экономия в 428 человеко-лет. Это много времени.
Однако в большинстве проектов не участвуют миллионы разработчиков или 100K + LOC. В типичном проекте, скажем, с 4 разработчиками и около 50 тыс. Лок, набор предположений сильно отличается. Разработчики в команде будут гораздо лучше понимать, как работает код. Это означает, что имеет больше смысла оптимизировать процесс быстрого создания высококачественного кода и уменьшения количества ошибок и усилий, необходимых для внесения изменений.
Трата 1 недели на разработку кода, соответствующего .net Framework, против 8 часов написания кода, который легко изменить и содержит меньше ошибок, может привести к:
- Поздние проекты
- Нижние бонусы
- Увеличено количество ошибок
- Больше времени проводите в офисе и меньше времени на пляже и пейте маргариту.
Без 4,999,999 других разработчиков, чтобы покрыть затраты, это обычно не стоит.
Например, тестирование интерфейсов маркеров сводится к одному выражению "is" и приводит к меньшему количеству кода, который ищет атрибуты.
Так что мой совет:
- Строго следуйте руководящим принципам структуры, если вы разрабатываете библиотеки классов (или виджеты пользовательского интерфейса), предназначенные для широкого распространения.
- Подумайте о принятии некоторых из них, если у вас более 100K LOC в вашем проекте
- В противном случае игнорируйте их полностью.