Пример, который вы привели, на самом деле хорош, на мой взгляд. Вы объявляете внутренние классы , поэтому совершенно разумно хранить их в одном файле . Единственный способ обойти это - сделать ваш Items
класс частичным и разделить его на несколько файлов. Я бы посчитал это плохой практикой. Моя общая политика для вложенных классов заключается в том, что они должны быть небольшими и частными. Есть два исключения из этого:
- вы проектируете кластер классов (более распространенный в target-c), поэтому может быть целесообразно использовать частичный подход к классам
- вам нужен enum, который используется только с открытым API родительского класса. В этом случае я предпочитаю объявить открытый enum внутри родительского класса, а не загрязнять мое пространство имен. Перечисление, являющееся «внутренним перечислением», эффективно приводит к тому, что оно четко определено.
Если вы зададите вопрос немного по-другому и спросите: «Должен ли я поместить каждый класс уровня пространства имен в отдельный файл», мой ответ будет «да».
При разработке классов мы соблюдаем принцип единой ответственности. Чтение кода становится намного проще, если его форма соответствует семантике, поэтому целесообразно разделять файлы по классам.
С механической точки зрения наличие файла на класс имеет несколько преимуществ. Вы можете открыть несколько классов одновременно в разных окнах. Это особенно важно, поскольку ни один серьезный разработчик не работает с менее чем двумя экранами. Возможность иметь больше контекста перед моей головой означает, что я могу держать больше контекста в своей голове. (Большинство IDE позволяют открывать один и тот же файл дважды, но я нахожу это неловким).
Следующим важным аспектом является контроль источников и слияние. Сохраняя ваши классы отдельно, вы избегаете больших хлопот, когда вносятся изменения в один и тот же файл, потому что необходимо изменить отдельные классы.
Йоханнес Рудольф
источник
Честно говоря, не добавляйте в файл более одного корневого класса. На моей последней работе были файлы не только с несколькими классами, но и с несколькими пространствами имен, которые растянулись на несколько тысяч строк кода. Очень трудно пытаться следовать.
Если есть классы, которые тесно связаны, то либо назовите их файлы одинаково, либо поместите их в подпапку.
Физическое разделение файлов классов помогает (заметьте, не всем конец) порождать разделение проблем и более слабую связь.
С другой стороны, ваш пример не показывает более одного корневого класса. Есть несколько вложенных классов (примечание: старайтесь ничего не делать во вложенных классах, но
private
если вы можете спроектировать это), и это прекрасно, если вы поместите их в один файл.источник
Если файлы очень сплоченные, например, если это альтернатива наличию нескольких очень коротких файлов с одинаковыми именами, то это может быть хорошей идеей.
Например, я считаю , что при использовании Fluent NHibernate это легче , если я держать
Entity
иEntityMap
в одном файле, несмотря на то , что мои инструменты , возможно , придется сказать об этом.В большинстве случаев это просто затрудняет поиск классов. Используйте с осторожностью и с осторожностью.
источник
Проще говоря, это нехорошо для этого, и я скажу вам, почему, чуть позже, когда ваше решение станет большим, вы забудете, где находятся классы, так как имя файла больше не будет представлять, каково содержимое, каково имя файла. AnimalPersonObject.cs это просто невозможно.
Конечно, вы можете обойти это, используя функции инструментов, таких как resharper, для перехода к типам, но 1 класс на файл (включая интерфейсы) действительно является основой любого стандарта кода, который я когда-либо видел, не только в .net, но и в java и c ++ и многие другие языки, те, которые не часто имеют проблемы с сопровождением, и вы найдете младших разработчиков, которым сложно понять код.
Почти все инструменты оптимизации кода скажут вам переместить классы в отдельный файл, так что для меня да, это запах кода, и его нужно нейтрализовать :)
источник
Другая проблема заключается в том, что с очень большими и похожими классами в одном файле - когда вы не можете видеть объявление класса все время - вы можете в конечном итоге поставить точки останова в неправильном классе и задаться вопросом, почему они не получают удар ... гррр! :)
источник
По сути, если вам нужно использовать этот класс только из «родительского» класса (с точки зрения области видимости), то обычно целесообразно определить его как вложенный класс.
источник