StyleCop SA1402 и дженерики

Я думаю, что SA1402 — отличное правило, но у меня проблемы с дженериками. У меня есть класс, который использует делегат Func, поэтому имена примерно совпадают с этой подписью. То есть у меня есть классы с именами Operation<TType>, Operation<T, TType>, Operation<T1, T2, TType> и так далее. Согласно SA1402, мне нужно все эти маленькие классы поместить в отдельные файлы и придумать какое-нибудь странное украшение для имени файла. Кроме того, если мне нужно изменить один из этих элементов, мне обычно нужно внести изменения в остальные. Это кажется менее поддерживаемым, чем один модуль.

Имеет ли смысл для SA1402 разрешать дженерикам одного и того же базового класса (а также партиалам) находиться в одном файле? В этом случае все перестановки класса Operation будут находиться в Operation.cs.


person Quarkly    schedule 31.08.2013    source источник
comment
Здесь несколько предложений: [Соглашение об именах файлов общих классов][1] [1]: stackoverflow.com/questions/804036/   -  person Benoit Blanchon    schedule 31.08.2013


Ответы (3)


Они несколько соглашений об именах. Кажется, самый популярный

Операция[TType].cs

Операция[T,TType].cs

Операция[T1, T2, TType].cs

Но вы также можете использовать что-то более классическое, например

Операция`1.cs

Операция`2.cs

Операция`3.cs

(см. Соглашение об именах файлов общих классов)

person Benoit Blanchon    schedule 31.08.2013

Я склонен с вами согласиться, в целом, SA1402 — хорошая идея. Но в этом конкретном случае и других подобных случаях (у меня есть универсальная и неуниверсальная реализация одного и того же класса). Как и многие другие, я думаю, что иметь более одного класса в файле совершенно нормально, если это имеет смысл< /сильный>. Я предпочитаю игнорировать это предупреждение на очень конкретном уровне Scope и Target:

[assembly: SuppressMessage(
    "StyleCop.CSharp.MaintainabilityRules",
    "SA1402:FileMayOnlyContainASingleType",
    Justification = "How else would we name generic and non generic (https://stackoverflow.com/a/4063061/516433).",
    Scope = "type",
    Target = "~T:Pastdev.Cli.AppResources`1<!!0>")]
person Lucas    schedule 29.12.2018
comment
Вы указали цель для универсального класса с одним параметром типа. Есть ли у вас какие-либо сведения о том, как обозначать общие классы с более чем одним параметром типа? - person Yoshiya; 15.01.2019
comment
У меня нет ссылки, но при использовании Visual Studio для ее создания появляется: [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "<Pending>", Scope = "type", Target = "~T:Mitre.CliApp.IO.CircularBuffer`2")]. Кроме того, вероятно, стоит отметить, что я не думаю, что у вас может быть несколько целей на одной линии. - person Lucas; 15.01.2019

Использование подхода Operation<TType>.cs будет работать, если вы переопределили настройку fileNamingConvention StyleCop (Соглашения об именах файлов).

В противном случае он работает автоматически, если вы назовете свой файл, например: Operation{TType}.cs и т. Д. (Обратите внимание на фигурные скобки)

person crgolden    schedule 30.01.2020
comment
Да, я знаю, как переопределить настройки Stylecop. Вся идея состоит в том, чтобы изменить свой код так, чтобы вы проходили без изменения настроек. - person Quarkly; 31.01.2020