Який найкращий спосіб структурувати та називати файли, що містять загальні класи з тим самим іменем?


14

У своєму поточному проекті я зіткнувся з вимогою створити загальні класи з однаковою назвою, але різною кількістю загальних параметрів. Наприклад:

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

З огляду на те, що я хочу, щоб усе це було в одному просторі імен, я збентежений, як структурувати та називати свої класи та файли?

Якщо ми дотримуємось ідеї про те, що у нас повинні бути класи, обмежені одним на файл, і що файли повинні бути в структурі папок, що представляє ієрархію простору імен, і що ім'я файлу повинно відповідати імені класу, як мені впоратися з цією ситуацією ?

Що я насправді запитую тут, що я повинен назвати файл, який містить MyClass<T1>, і що я повинен назвати файл, який містить MyClass<T1, T2>? Я не запитую, якими мають бути назви параметрів типу.


Наведіть кілька конкретних прикладів, які детальніше описують проблему. Наведені вами приклади занадто ... ем, загальні. Що ви маєте на увазі під "як структурувати та називати мої класи та файли?"
Роберт Харві

Microsoft робить це самостійно, просто додаючи номер до параметра типу. Дивіться документи Tuple
Піт

@ Pete: Це дійсно стосується лише Tuple. Microsoft також використовує TKey, TValueконвенцію. Функція має TResultпараметр типу. Хоча я згоден, що ви можете використовувати T1і T2т.д. для змінної кількості вхідних параметрів, які в іншому випадку не мають конкретного використання, як TKeyі TValue.
Роберт Харві

@RobertHarvey Ну, так, але лише в контексті фактичної колекції ключів / значень, наприклад словника. До всього, що складається із змінної кількості типів, вони додають номер. Ось ще один приклад: msdn.microsoft.com/en-us/library/dd402872(v=vs.110).aspx
Pete

1
Ну а ваші правки застаріли деякі коментарі. :) Чому ви не можете просто тримати заняття в одному фізичному файлі? Якщо вони настільки різні, що вам потрібно зберігати їх в окремих файлах, то чи можете ви сказати нам, що робить їх різними?
Піт

Відповіді:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

І так далі, де число після зворотного вибору - це параметри загального типу. Ця конвенція використовується Microsoft.

Як варіант, ви можете використовувати щось подібне

MyGenericCollectionClass[TKey, TValue].cs

що зберігає не тільки кількість параметрів родового типу, але й їх конкретні назви. Зрозуміло, це не зберігає кутових дужок, але ми не можемо мати все, що ми хочемо, чи не так?


1
Компілятор внутрішньо керує назвою загальних типів, додаючи backtick та кількість загальних параметрів, оскільки .NET не дозволяє декілька типів з одним іменем з різною кількістю загальних параметрів, але C # робить. Тож умова іменування файлів відповідає тому, що робить компілятор.
CodesInChaos

1
Я хотів довести свою помилку, але насправді ви праві: github.com/dotnet/corefx/tree/master/src/… Мені ця конвенція не подобається.
День

1
@Den, здається, зараз вони пошкодували від цієї конвенції. Може, це передбачало якусь проблему? github.com/dotnet/corefx/commit/…
Сем

@Sam Сподіваємось, це не проблема з комунікацією між командами Microsoft. Тому що ніхто інший цього не робить. Крім того, на мою думку вирішується команда-упорядник, а не колектив бібліотеки.
День

У мене не було б кульок для використання "" "у імені файлу.
Крістіан Е.

4

У разі Tupleі Actionщо Піт зазначив, Microsoft самі використовують єдиний файл - см Tuple.cs і Action.cs .

Я думаю, що це частково залежить від того, функціональність для всіх класів в основному однакова. Особисто мені не подобаються групуючі класи в один файл, але це може бути винятком. У вихідний код, де я працюю, я додав автогенерований (використовуючи T4) NamedTupleклас, який діє так само, як Tuple, але з назвою рядка як перший аргумент у конструкторі.

Щоб відповісти на ваше запитання, якщо ви не хочете використовувати один файл, можливо, використовуйте MyClass_1.cs для MyClass<T1>, MyClass_2.cs для MyClass<T1, T2>тощо.

Жоден варіант не є ідеальним, тому я схильний запропонувати аргумент "Microsoft зроби це так, тому ...".


2
Tupleі Actionвсі вони є делегатами; у них немає коду реалізації, тому розміщення всіх варіацій в окремих файлах було б у будь-якому разі безглуздим. Просто доводить, що кожне правило має виняток.
Роберт Харві

Так, загалом кажучи, розміщення кількох публічних делегатів в одному файлі вважається нормальним (за умови, що вони пов'язані).
Стівен

1
@RobertHarvey, Tupleне є делегатом, але кожна реалізація все одно коротка.
Артуро Торрес Санчес

@ ArturoTorresSánchez: Так, я думав Func.
Роберт Харві

0

Ви запитували себе, чи справді заняття мають однаковий намір? Якщо один клас є більш загальним, ніж інший, то це буде GenericClass , MoreGenericClass та MostGenericClass . Уявіть, що кожен тип параметра класу додає новий вимір до класу, тому це може допомогти запитати, що це за розмір.

Розглянемо цей приклад:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

Я усвідомлюю, що це не найкращий приклад, але дуже виразно показати три виміри:

  • внутрішній вимір, що він може завантажувати
  • метричний вимір, з якою метрикою він може бути завантажений, тільки за кількістю речей, або за квадратною мірою, або за кубічною ємністю, або за вагою
  • зовнішній розмір, куди він може бути завантажений.

Тож ви зможете моделювати перевезення автомобілів:

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

Транспортування рідин:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

Транспортування енергії:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

Перевезення цукру, круп:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

О, яка несподіванка: а List<T>має один вимір, який відображає те, що може містити список; і це Map<T, S>два аспекти, які відображають речі, на яких може зберігатися карта, та клавіші доступу.


1
Я не думаю, що ти зрозумів це питання. Подивіться на останній абзац питання.
Роберт Харві

1
@RobertHarvey Будь ласка, уважно прочитайте питання: ім'я класу повинно відповідати імені файлу. Це взаємозамінно. Проблема полягає в неправильному аналізі класу та неправильному називанні загальних класів загалом. Підводячи підсумок моєї відповіді: "Назвіть це тим, що воно є, а не тим, що здається."
shylynx


1
@RobertHarvey Прочитайте мою відповідь: Покладіть один клас в один файл!
shylynx

1
Я думаю, ви пропускаєте суть. Питання запитує: Як я кладу Tuple<T1>, Tuple<T1, T2>і Tuple<T1, T2, T3>в окремі файли CS стандартним способом, без імен зіткнень?
Роберт Харві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.