Я пытаюсь придерживаться общих соглашений о присвоении имен, таких как описанные в Руководстве по проектированию для Разработки Библиотек классов. Я поместил каждый тип в его собственный исходный файл (и частичные классы будут разделены через несколько файлов как описанные рассматриваемые Соглашения о присвоении имен для Частичных Файлов Класса), с помощью названия типа как имя файла.
Примеры:
namespace Demo.Bla // project
{
enum FlowDirection { } // in file FlowDirection.cs
class LayoutManager { } // in file LayoutManager.cs
}
namespace Demo.Bla.LayoutControllers // folder LayoutControllers in project
{
class StackPanelLayoutController { } // in file LayoutControllers/StackPanelLayoutController
}
Но я не уверен, что придумал умный способ назвать исходные файлы, которые содержат универсальные классы. Скажите, что у меня есть следующие классы, например:
namespace Demo.Bla.Collections // folder Collections
{
class Map { } // in file Map.cs (obviously)
class Bag { } // in file Bag.cs (obviously)
class Bag : Bag { } // also in file Bag.cs ???
}
Если я поместил код и недженерика и дженерика Bag
классы в то же Bag.cs
файл? Каковы Ваши привычки?
Обычно, если у меня есть несколько типов, "перегруженных" по количеству параметров типа, то это либо потому, что один происходит от другого, либо один используется для создания другого. Я просто помещаю их в один файл.
Одним из альтернативных вариантов было бы разделить их на разные файлы, сделать один файл "основным", а остальные "зависят" от него в файле сборки, как в случае с вопросом о частичном классе, на который вы ссылались в вопросе.
Таким образом, в итоге вы получите визуальную связь в Visual Studio, но все же по одному классу на файл, чтобы было проще с ними работать.
Я думаю, что обычным решением этой проблемы является присвоение файлу такого имени:
{ClassName}`{NumberOfGenericParameters}
Это даст вам это имя файла:
Bag.cs and Bag`1.cs
Таким образом Microsoft решает эту проблему в таких фреймворках, как Asp.net Mvc.
Я видел некоторые библиотеки, использующие
Bag.cs
Bag`1.cs
Bag`2.cs
, так как это то, что будет отображаться Type.Name
.
Я хочу быть более описательным с параметрами типа, поэтому в последнее время я склонен использовать
Bag.cs
Bag{T}.cs
Bag{TKey, TValue}.cs
Это формат, который также поддерживается XML-комментариями.
/// <summary>
/// ...
/// Uses the <see cref="T:MyLibrary.Bag{TKey, TValue}" /> class.
/// </summary>
Я добавляю суффикс «T» к именам моих общих классов.
class Bag { } // in file Bag.cs
class BagT<T> : Bag { } // in file BagT.cs
class BagInputs : BagT<Input> // in file BagInputs.cs
Вы спросили:
Следует ли мне поместить код неуниверсального и универсального классов Bag в один и тот же файл Bag.cs? Каковы ваши привычки?
Приведенное выше мое соглашение нестандартно; Я должен пояснить, что я отвечал «каковы мои привычки», а не обязательно «что вам следует делать».