NET: лучшие практики / рекомендации по разделению пространств имен между файлами? - PullRequest
10 голосов
/ 27 января 2009

Какими должны быть общие рекомендации / рекомендации по разделению кода приложения (App_Code) на отдельные файлы?

Я обнаружил, что со временем исходные файлы плохо совпадают с тем, как развивается иерархия пространства имен. Как сохранить контейнеры кода приложения интуитивно организованными со временем?

Какова ЦЕЛЬ, к которой должны стремиться деления файлов? Переносимость кода? Разделение проблем? Общий функциональный контекст? Частота смены? Должны ли они стремиться к 1-1 отношениям с классами?

Каковы последствия разбиения кода на МНОГИЕ меньшие файлы по сравнению с объединением в несколько файлов?

Я часто думал об этом, но никогда не делал общих выводов, применимых ко всем ситуациям.

Ответы [ 5 ]

11 голосов
/ 27 января 2009

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

Классы

Вообще говоря, у классов должен быть свой собственный файл, так как это упрощает процесс навигации по решению кода, помогая в разработке и обслуживании (например, объединить изменения гораздо сложнее, когда все изменяют одни и те же файлы). Может быть приемлемо разделить один класс на несколько файлов в некоторых ситуациях, таких как:

  • При наличии вложенных классов каждый вложенный класс может иметь свой собственный файл.

  • Когда в классе есть автоматически сгенерированные части, например код конструктора.

  • Когда в классе есть фиксированные части, такие как общий набор скрытых свойств или общая реализация интерфейса.

В одном из наших проектов у нас есть общая реализация интерфейса, которую предоставляют многие классы. Поскольку у нас нет множественного наследования, мы используем смешанный подход, при котором мы автоматически генерируем дополнительный файл для каждого класса. Это можно сделать вручную, а не автоматически (и было изначально).

Существуют и другие ситуации, но это несколько субъективно и зависит от требований вашего собственного проекта.

1025 * Namespaces * Пространства имен обычно должны фокусироваться на разумных группировках ваших типов. Пространство имен должно позволить разработчику интуитивно найти то, что он ищет. Для многих небольших проектов достаточно одного пространства имен, например MyAwesomeTool, но для более крупного проекта со многими классами потребуется более логичная группировка. Такие крупные проекты, такие как SDK или .NET BCL, полагаются на пространства имен, чтобы разбить огромную коллекцию типов. Каждый уровень пространства имен предоставляет дополнительную информацию о том, что там может быть найдено, например, System.Windows.Forms или System.Drawing или Microsoft.VisualBasic. При создании пространств имен необходимо учитывать все цели этого пространства имен и связанного с ним проекта. Если проект внутренний и небольшой, назовите пространство имен так, как вам нравится, поскольку это просто необходимость группировки ваших типов; если проект является видимым извне или содержит большое количество типов, тщательно продумайте логические и содержательные группировки, которые позволят другим интуитивно найти нужные им типы. Заключение

Нет жестких и быстрых правил, которые работают в любой ситуации. То, как вы организуете свой код в файлы, зависит от ваших собственных процессов разработки, влияющих на вас и вашу команду; все ваши классы в одном файле будут адскими разработками, но скомпилированный продукт не будет действовать по-другому (при условии, что подход с одним файлом не приведет к ошибкам), тогда как расположение ваших пространств имен относится к будущей разработке и потребителям эти пространства имен, поэтому последствия неправильного понимания могут быть более серьезными.

  • Целью организации ваших занятий таким образом, чтобы упростить текущую разработку и дальнейшее обслуживание.
  • Стремитесь организовать свои пространства имен таким образом, чтобы упростить всю разработку и, при необходимости, опыт ваших конечных пользователей.
6 голосов
/ 27 января 2009

Между классами и исходными файлами должно быть взаимно-однозначное соответствие.

Пространства имен следует рассматривать как пакет, который может включать в себя один или несколько классов. Там, где это возможно, полезно представлять их как папки / фильтры в окне проекта Visual Studio.

Если вы найдете большой класс, который, по вашему мнению, выиграет от разделения на отдельные файлы, вместо этого рассмотрите возможность рефакторинга и разделения самого класса.

(Допустимым) исключением является код, который генерирует пользовательский интерфейс, который Visual Studio помещает в отдельный файл. Я бы порекомендовал оставить это в своем собственном файле и рассматривать его как прозрачный файл, принадлежащий редактору.

4 голосов
/ 27 января 2009

Большинство рекомендаций, которые я видел, говорят, что каждый публичный тип должен быть в своем собственном файле, а пространства имен должны представлять структуру папок приложения.

1 голос
/ 02 октября 2009

Что касается классов, я склонен следовать правилу Java: «Один открытый класс на файл» Я могу включить частный класс в общедоступный, если этот публичный класс является единственным пользователем. (Хотя перечисления делают это менее важным фактором); Однако, если он используется многими открытыми классами в одном и том же пространстве имен, я помещу его в отдельный файл.

Я буду стремиться использовать пространства имен по направлениям:

MyAwesomeApp.UI
MyAwesomeApp.Business
MyAwesomeApp.Data

для отражения разделения слоев.

1 голос
/ 27 января 2009

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

Пространства имен должны быть организованы сначала по разделению интересов. Например, объекты данных должны находиться в другом пространстве имен, чем объекты домена. Тогда у вас может быть меньший поддомен для каждой группы объектов на уровне «совокупного корня». Обычно каждое из этих наименьших пространств имен соответствует своему проекту и DLL.

...