2009-04-29 18 views
38

Chcę móc odróżnić rodzajową i regularną (nie generyczną) wersję klasy. Podobnie jak w przypadku platformy .NET, istnieją ogólne i nietypowe wersje kilku jego interfejsów i klas kolekcji. (Queue, Queue(T))Konwencja nazw plików klas ogólnych

Ogólnie lubię przestrzegać konwencji jednej klasy na plik (tak jak w Javie). Czy istnieje wspólna konwencja nazywania plików zawierających pojedynczą klasę generyczną? Najbardziej interesuje mnie system Windows (w szczególności NTFS), ale wygląda na to, że dobra konwencja byłaby (przynajmniej trochę) przenośna.

+0

Mógłbyś podać przykład klasy, która zarówno specyficzny typ rodzajowy i o tej samej nazwie (co prawdopodobnie nie jest to fantastyczny pomysł, aby zacząć?) .NET nie- typy ogólne są dostępne tylko w celu zapewnienia zgodności wstecznej. –

+2

"Czy możesz podać przykład klasy, która jest zarówno typowa, jak i rodzajowa, o tej samej nazwie" - sam podałeś jedną odpowiedź: bibliotekę klas, która wymaga kompatybilności wstecznej! – Joe

Odpowiedz

29

W firmie Microsoft, używają ClassNameOfT.cs

+0

Jak to, całkiem jasne. Chociaż prawdopodobnie nadal będę określać klasę tak samo, jak wersja nietypowa. –

+3

Sądzę, że zastanawiałbym się, w jaki sposób zrobiliby coś jak słownik. DictionaryOfKT? – user7116

+8

W kodzie źródłowym ASP.NET MVC 1.0 używają konwencji Dictionary'2.cs. – mckamey

1

Jak o:

Type.cs 

i

TypeGeneric.cs 

Ilekroć zrobili to w przeszłości zawsze umieścić oba rodzaje w jednym pliku typu non-generic jak nazwa pliku. Myślę, że to sprawia, że ​​rzeczy są całkiem jasne, ponieważ .NET nie ma konwencji/ograniczeń dla jednego typu na plik taki jak Java.

Ale jeśli musisz wtedy zaproponowałbym coś takiego jak powyżej, a użycie sufiksu spowoduje, że pliki pojawią się razem na dowolnej liście alfabetycznej (Eksplorator rozwiązań, Eksplorator Windows itp.).

Oto kolejny pomysł:

Type`1.cs 

Pozwoliłoby to, aby wyrwać się różne typy generyczne przez liczbę ogólnych parametrów typu one przyjęte. Jest to tylko myśl, ale nadal uważam, że łatwiej byłoby po prostu umieścić wszystkie typy w jednym pliku.

0

Prawdopodobnie będę mieć dwa foldery w projekcie, takie jak Gereric, NonGeneric lub coś w tym stylu. Mogą nadal znajdować się w tej samej przestrzeni nazw, a następnie obie mogą mieć tę samą nazwę pliku. Tylko jedna myśl ...

+5

Osobiście staram się unikać zajęć w tej samej przestrzeni nazw w różnych folderach. Lubię hierarchię folderów, aby dopasować hierarchię przestrzeni nazw, na korzyść przyszłych programistów. – Joe

+0

Wystarczająco fair. Prawdopodobnie i tak miałbym je w oddzielnej nazwie. Coś jak MyProj. i MyProj.Generic. – BFree

0

Wszystkie nowe klasy Microsoft używają generycznych. Queue i ArrayList były tam, zanim pojawiły się leki generyczne. Generics jest drogą naprzód.

Konwencja dla pojedynczej klasy dla pojedynczego pliku to nazwa nazwy pliku po nazwie klasy (bez względu na to, czy jest to rodzaj ogólny). W przypadku MyClass będziesz mieć MyClas.cs. Dla każdego nowego obszaru nazw musisz utworzyć nowy folder. W ten sposób działa również Visual Studio.

1

Prawdopodobnie ustawiłbym je w folderach i użyłbym mechanizmu przestrzeni nazw. Możesz porównać z System.Collections vs. System.Collections.Generic. Z drugiej strony, jeśli jest bardziej powszechne niż to, że klasy używają generycznych, być może lepiej jest wskazać te, które nie są. To znaczy, jeśli naprawdę chcesz oddzielić klasę generyczną od innych klas. Osobiście zwykle tego nie robię, ponieważ nie widzę w tym żadnej praktycznej korzyści.

1

Z dotychczasowych odpowiedzi wynika, że ​​nie ma konsensusu.

Używanie tej samej nazwy pliku w pod-przestrzeni nazw (i podfolderze) "Generics" (np. System.Collecctions.Generics) jest opcją. Ale nie zawsze jest pożądane tworzenie nowej przestrzeni nazw.

Na przykład w istniejącym obszarze nazw z nietypowymi klasami, które są utrzymywane z kompatybilnością wsteczną, ale są oznaczone ObsoleteAttribute, prawdopodobnie lepiej będzie przechowywać wersje ogólne w tej samej przestrzeni nazw.

Myślę, że sufiks jest rozsądnym rozwiązaniem. Mam przyjęła konwencję za pomocą parametrów typu jako przyrostek (tak: MyClassT dla MojaKlasa < T> lub MyDictionaryKV dla MyDictionary < K, V>

36

Wystarczy.. znaleziono na to pytanie po patrząc na to, co konwencje inni ludzie używają do ogólnych nazw klasowych

Ostatnio używam ClassName[T].cs naprawdę lubię tej konwencji, a myślę, że jest lepszy od innych, z następujących powodów:..

  • Parametry typu wyskakują na ciebie o wiele bardziej niż w przypadku konwencji Microsoft (np. ClassNameOfT.cs).
  • To pozwala mieć wiele parametrów typu bez zbytniego zamieszania : Dictionary[TKey, TValue].cs
  • To nie wymaga żadnych specjalnych tworzyć foldery, lub mieć swój klas generycznych w specjalnej przestrzeni nazw. Jeśli masz tylko kilka ogólnych klas, posiadanie specjalnego obszaru nazw poświęconego im po prostu nie jest praktyczne.

pożyczyłem tej konwencji od składni rodzajowego Boo jest, aczkolwiek nieznacznie zmodyfikowany (Boc stosuje ClassName[of T]).

Niektórzy programiści wydają się mieć fobię nazw plików, które zawierają tylko litery i znaki podkreślenia, ale gdy już uda się je pominąć, ta konwencja wydaje się działać bardzo dobrze.

+35

+1 Używam DOS/Windows przez prawie 30 lat i nigdy nie spotkałem nikogo z piłkami, aby użyć przecinka w nazwie pliku. –

+7

@ I.J.Kennedy PRAWDZIWY mężczyźni używają średników (;) w nazwach folderów i umieszczają je w zmiennych środowiskowych (PATH). – enzi

+0

Uwielbiam tę konwencję, kiedy ją po raz pierwszy przeczytałem, ale z jakiegoś powodu niektóre rozszerzenia (ahem, CodeMaid) odstraszają, gdy masz pliki nazwane przy użyciu tej konwencji, takie jak 'IFoo.cs' i' IFoo [T] .cs'. Kiedy rozszerzenie jest uruchamiane w celu wyczyszczenia nietypowego dokumentu, zawsze wpływa na ogólny dokument ... Dziwne zachowanie. – Dan

8

widzę, że ten temat został porzucony ponad rok temu, ale nadal chciałbym podzielić się moją opinią na temat tej konwencji.

Przede wszystkim posiadanie wielu klas o tej samej nazwie, ale różniących się tylko wielkością parametrów, nie zawsze jest zgodne z poprzednią wersją. Z pewnością nie widzisz tego zbyt często, ale nowe klasy Action i Func .NET zostały zaprojektowane właśnie w ten sposób, a ja obecnie wdrażam coś podobnego.

Dla jasności i rozróżnialność używam następującą konwencję, że tylko określa liczbę ogólnych argumentów dla danego typu:

  • MyClass.cs
  • MyClass.T1.cs
  • MyClass.T2 .cs

W ten sposób moje nazwy plików pozostają krótkie i proste, a jednocześnie wyraźnie przekazują nazwę klasy i różną ilość parametrów typu kosztem prostej dodatkowej kropki (co jest, moim zdaniem, powszechnie przyjętą rzeczą do zrobienia w nazwie pliku i wygląda znacznie lepiej niż przecinki i inne niealfanumeryczne postacie, ale to tylko kwestia gustu, jak sądzę).Umieszczanie nazw (lub akronimów) parametrów typu tylko wydłuża nazwy plików, podczas gdy na tym poziomie nie jestem tak naprawdę zainteresowany rzeczywistymi nazwami parametrów typu, tak czy inaczej ...

+0

Nadal uważam. Dzięki za wejście. :-) –

+0

+1, Naprawdę podoba mi się to! Jest prosty, krótki, wystarczająco jasny/dostatecznie pouczający (na poziomie nazwy pliku) i nie powinien wywoływać zbyt wielu "symboli-fobii". Jednak jako wariant pierwszą kropkę można zastąpić podkreśleniem dla przypadków, w których wiele kropek nie jest pożądane. Tak jak w przypadku mnie: używam wielu kropek dla klas wewnętrznych (chyba że są one mniejsze niż ~ 10 linii). Na przykład: 'MyClass.InnerClass.cs' lub przykład w połączeniu z tym dla generycznych' MyClass_T2.InnerClass.cs'. (Lubię używać kropek dla klas wewnętrznych, ponieważ odzwierciedla to sposób, w jaki są one przywoływane w kodzie). – AnorZaken

0

Osobiście nie użyłbym akcentu grobowego notacja:

Foo.cs 
Foo`1.cs 

Z tego prostego powodu, że boję się poważnego akcentu. Nie tylko ma przerażającą nazwę, ale nie jestem pewien, jak będzie on obsługiwany przez różne systemy plików, systemy kontroli wersji i adresy URL. Dlatego wolałbym trzymać się zwykłych znaków alfanumerycznych.

NameOfT.cs wydaje się być używane w ASP.NET Core MVC zgodnie z wyszukiwaniem na GitHub. 12 wyników. Reference.

Ograniczone użycie w CoreFX. 3. Wyniki. Reference.

Przykład:

Foo.cs 
FooOfT.cs 
Powiązane problemy