Postanowiłem zadać to pytanie tutaj zamiast przepełnienia stosu, ponieważ jest to raczej subiektywne.
W języku C # zazwyczaj widzę typy ogólne o bardzo złych nazwach. W szczególności „T” jest powszechnie używane, ale samo w sobie nie jest znaczącą nazwą. Na przykład:
class Fruit<T>
{
T fruit;
}
Chociaż jest to typowe podejście, czy ktoś by tego nie zalecił? A jeśli tak, to jaka byłaby rozsądna konwencja nazewnictwa dla typów ogólnych w kontekście C # dla funkcji ogólnych i klas?
W poprzednim przykładzie załóżmy, że rodzaj ogólny T
musi zawsze być rodzajem owocu, takim jak Apple
lub Orange
. Ten typ T
musi wyraźnie wskazywać FruitType
, że jest to rodzaj owocu, więc być może lepsza nazwa to , więc otrzymamy:
class Fruit<FruitType>
{
FruitType fruit;
}
To po prostu dać wam wyobrażenie o tym, czego szukam. Jaka jest akceptowalna „ogólna zasada” dla tego problemu?
Odpowiedzi:
To jest rzeczywiście subiektywne ... ish .
Ponieważ niektórzy ludzie uważają, że
i
jest całkowicie poprawny dla zmiennej pętli for, niektórzy uważają, żeT
jest całkowicie poprawny dla typu zastępczego w klasie ogólnej.Osobiście popieram to podejście, jest to wspólna konwencja i ludzie ogólnie wiedzą, co masz na myśli.
Tam, gdzie typ jest znaczący, użyłbym znaczącej nazwy, ale generalnie zacznę od T. Ostatnio opracowałem ogólną klasę słownika (nie pytaj) i deklaracja była
Jednak w przypadku czegoś takiego jak Tuple, w którym typy są w zasadzie bez znaczenia, uważam następujące za całkowicie do przyjęcia.
źródło
i
iT
pracy, i jest to w zasadzie mierzalne (tj. można zmierzyć, czy zrozumienie kodu źródłowego wzrasta, jeśli powiedzmy, że indeksy pętli otrzymują różne identyfikatory). To, że trudno to zmierzyć, nie oznacza, że musimy oznaczać etykietę „subiektywną” na wszystkim. Biorąc pod uwagę szerokie zastosowanie bez oczywistych problemów, całkiem rozsądne jest stwierdzenie nawet bez pomiaru, że to faktycznie działa.i
iT
są źli . Nigdy nie wolno używać nazw jednoliterowych” odpowiedź typu. Dodałem ish, aby wszyscy zadowalali się :)T
ma sens, gdy mówimy o typie bez ograniczeń,TFruit
ma sens, ponieważ mówi mi „Każdy typ z ograniczeniem, że jest owocem”. Wydaje się to dobrą „praktyczną zasadą” do nazywania parametrów typu ogólnego. Dzięki!!Myślę, że masz rację, chociaż T stało się standardem. Prawdopodobnie pochodzi ze starych czasów C ++ i słowa „typu T”. Uważam, że dobrą praktyką jest jak najbardziej opisowe, ale to subiektywne.
Możesz wybrać T jako prefiks, podobnie jak wiele osób wybiera I dla interfejsów. A zatem
byłoby moim zdaniem dobrym imieniem. W większości przypadków wolę prefiksy niż sufiksy, ponieważ od razu widać, co się dzieje, gdy się na nie natkniesz, i łatwiej jest wyszukiwać za pomocą takich funkcji, jak Intellisense. Jest to dobra praktyka również w przypadku kontrolek interfejsu użytkownika, gdy najprawdopodobniej zawsze znasz typ (np. TextBox), ale nie jesteś w 100% pewien co do opisowej nazwy, którą mu nadałeś.
Negatywną stroną tego jest to, że źle wygląda, gdy sam typ zaczyna się od T. Dlatego myślę, że dobrze byłoby sufikować typ ogólny w szczególnych przypadkach, takich jak ten poniżej.
Pamiętaj, że to tylko moja opinia i bardzo subiektywna. Ale myślę, że mam drobny problem z tym, że wolę prefiks niż sufiks.
źródło
T
przedrostka dla parametrów typu iI
nazw interfejsów jest wyraźnie wymagane ( reguły „ DO ...”) w Wytycznych dotyczących projektowania ram.TFruit
tutaj przynosi na stółT
. Używanie nazwy takiej jakTType
lub zTypeT
pewnością jest nonsensem. Nie dodaje żadnych informacji, a jedynieT
. Przekazywane są dokładnie te same informacje.Firma Microsoft ma oficjalne wytyczne dotyczące leków generycznych: Nazwy klas, struktur i interfejsów (cytowane tutaj oraz w formie książkowej: Wytyczne dotyczące projektowania ram ).
W odniesieniu do konkretnego pytania napisano:
źródło
Chodzi przede wszystkim o delegowanie funkcjonalności - klasa ogólna robi jedną rzecz, jej argument robi inną. Przykład podręcznika to ogólna kolekcja: kolekcja przechowuje „rzeczy”, ale nie obchodzi ich, czym one są. Nazwa ogólna (sic!) Ma zatem pewną logikę - nie chcemy, aby była opisowa, ponieważ nie ma nic do opisania poza „to argument typu rodzajowego”, który to określenie
T
obejmuje wyczerpująco (biorąc pod uwagę Konwencji). Bycie opisowym jest dobre, ale zbyt opisowe sugeruje ograniczenia, których nie ma.Czasami jednak ogólna klasa lub metoda ma więcej niż jeden parametr typu, i w tym momencie sensowne jest nadanie im bardziej opisowych nazw, aby ich rola stała się oczywista. Dobrym przykładem może być typ kolekcji klucz-wartość, w którym zarówno klucz, jak i wartość są rodzajowe; dzwonienie do nich
T
iS
(lubQ
cokolwiek innego) byłoby mniej przydatne niż dzwonienie do nich, mówienie,KeyType
iValueType
, lubTKey
iTVal
.źródło
Odpowiedź jest rzeczywiście subiektywna. Ma jednak sens jako pytanie, ponieważ kod powinien samok dokumentować, i moglibyśmy wszyscy nauczyć się lepszych sposobów na zrobienie tego.
Oto konwencje, których się nauczyłem i których przestrzegam:
Ogólne parametry typu nigdy nie powinny być mylone z konkretnymi klasami. Zasadniczo zachęca to do wstępu na temat
T
tego, co następuje, podobnie jak interfejsy są zazwyczaj poprzedzoneI
.Pojedynczy parametr typu ogólnego w klasie lub metodzie powinien być zazwyczaj oznaczony
T
. To prawie powszechnie rozumiana konwencja sięgająca szablonów C ++.Wiele parametrów typu ogólnego w tej samej deklaracji klasy lub metody powinno zaczynać się od T, ale powinno być zróżnicowane za pomocą zwięzłych, ale zrozumiałych środków.
TIn
iTOut
, na przykład, są powszechnymi i dobrze zrozumiałymi GTP dla metody, która akceptuje typowe dane wejściowe o silnym typie i generuje dane wyjściowe o silnym typie.Wiele zróżnicowanych, ale nieistotnych typów, takich jak klasa zawierająca, takich jak Tuple .Net lub typy delegatów, takie jak Func, Predicate i Action, mogą być oznaczone jako T1, T2, T3 itp. Jednak „niezwykłe” deklaracje GTP (mające określony cel i / lub bardzo specyficzne ograniczenia typów) powinny mieć coś bardziej opisowego.
Pojedynczy typ ogólny w metodzie, który różni się od ogólnego typu zawierającej klasy, może albo postępować zgodnie z poprzednią regułą dotyczącą wielu typów w klasie lub metodzie, LUB jeśli typ jest nietypowy, inny niż inny, można mu podać inny jedna litera, często
U
lubV
. To znowu konwencja sięgająca szablonów C ++.Cokolwiek wybierzesz, zachowaj spójność; nie oznaczaj GTP dla jednej klasy
T
, a następnejTParam
, chyba że druga klasa jest zagnieżdżona w pierwszej, co uniemożliwi jejT
użycie w drugiej.źródło