Не давайте классам и пространствам имен одинаковые названия. Часть 3
Часть 3: Проектирование неудачных иерархий
Причина, по которой люди изобретают иерархии, прежде всего заключается в желании организовать груду замысловатой ерунды таким образом, чтобы было четко определенное место для каждой штуковины. Каждый раз, когда вы видите иерархию, в которой два уровня имеют одинаковые имена, это означает, что с дизайном такой иерархии что-то не в порядке. И каждый раз, когда вы видите иерархию, в которой один из внутренних узлов содержит лишь одного потомка, что-то тоже, видимо, не так.
Как указывает Кжиштоф (Krzysztof) в книге “Framework Design Guidelines”, фундаментальная цель пространства имен заключается не только в возможности устранения неоднозначности между двумя типами с одинаковыми именами. (Идеально, чтобы ситуация, когда две сущности имели одинаковые имена вообще не возникала; предлагать механизм, допускающий появление проблемы, а затем механизм для ее решения, выглядит неэффективным.) На самом деле, назначение пространств имен скорее заключается в организации типов в легко понимаемые иерархии.
Т.е. задача пространств имен заключается не просто в разделении сущностей с одинаковыми именами, а, скорее, в группировке сущностей по некоторым общим признакам, что упрощает их поиск. Если вы думаете, что нельзя добавить еще две или более сущности в это пространства имен, то это, скорее всего, не лучшее пространство имен.
В моем исходном примере пространство имен MyContainers.List содержало класс List. Может ли какой-либо другой класс входить в пространство имен MyContainers.List? Нет. Правильный дизайн заключается либо в переносе класса List в пространство имен MyContainers, либо переименовать пространство имен в множественное число: MyContainers.Lists, и добавить в него дополнительные классы, скажем, MutableList и ImmutableList.
Общность, по которой группируются типы в пространство имен может заключаться в чем угодно. Пространство имен System.Collections.Generic группирует коллекцию типов по одной из деталей реализации: все типы являются обобщенными (generic). Пространство имен System.IO группирует типы по функциональности. Пространства имен самого высокого уровня, такие как “System” и “Microsoft” группируют типы по признаку того, являются ли они ключевой частью функциональности платформы или являются расширениями компании Microsoft. Но ключевой момент заключается в том, что каждое из этих пространств имен группирует огромное количество сущностей по некоторой общей для всех них характеристике. Пространство имен, которое содержит тип с тем же именем, указывает на проблему в дизайне иерархии.
В следующей статье: что делает ситуацию еще хуже.