Jakiej konwencji nazewnictwa należy zastosować dla parametrów funkcji C #

14

Zdarzają się sytuacje, gdy nazwa przekazana w parametrze zostanie rzutowana na nowy typ, ale nazwa obiektu przekazywanego powinna pozostać podobna. W przypadku atrybutów klas możemy użyć tego operatora, ale co z lokalną zmienną w funkcjach. Jaka konwencja kodowania jest szeroko stosowana.

przykład,

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

lub wręcz przeciwnie

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

lub dowolna inna konwencja

Shamim Hafiz
źródło
1
Niezależnie od innych odpowiedzi, które znajdziesz poniżej, istnieje małe narzędzie do analizy i egzekwowania reguł stylistycznych: archive.msdn.microsoft.com/sourceanalysis
Patrick Hughes

Odpowiedzi:

11

Prefiks parametrów lub zmiennych lokalnych znakiem podkreślenia nie jest bardzo idiomatyczny w języku C #, nie jest bardzo łatwy do odczytania i nie jest często używany (chociaż jest to legalne, więc możesz to zrobić, jeśli chcesz).

Najlepsza nazwa parametru i zmiennej to nazwa opisowa. Musisz pomyśleć, dlaczego zmieniasz typ, co jest przyczyną obsady. Powinieneś być w stanie wymyślić 2 różne nazwy. Np. Czy przekazałeś „osobę” i przekształciłeś go w „klienta”, to możesz użyć osoby i / lub klienta w nazwach zmiennych.

Jeśli naprawdę nie możesz pomyśleć o 2 różnych nazwach, użyłbym w nazwie „as” ( kilka dni temu na tej stronie było pytanie ). Np. Użyłbyś „myParaAsDerived” dla zmiennej lokalnej.

Gdybym w ogóle nie użył tego, zastanowiłbym się nad problemem, który rozwiązujesz, i jakie sensowne nazwy mogłyby zostać użyte, ale jeśli wszystko inne zawiedzie, jest to dość czytelne.

Steve
źródło
Tylko podwójne sprawdzenie (nie znam się na C #). Główny znak podkreślenia jest naprawdę „poprawnie” legalny w języku C #? W C i C ++ identyfikatory z wiodącymi (lub podwójnymi) znakami podkreślenia są zarezerwowane, więc chociaż są one w pewnym sensie legalne, nie należy definiować własnych identyfikatorów w ten sposób. csharp.comsci.us/etymology/identifiers.html sugeruje, że C # może być podobny (patrz dół, ostatnie z „ograniczeń”), ale tak naprawdę nie mówi „zastrzeżone”.
Steve314,
wiodące podkreślenia są całkowicie legalne w języku C # i nie są zastrzeżone na podstawie żadnych znanych mi konwencji.
Steve
9

Po pierwsze za pomocą

void MyFunc(BaseClass _myPara)
{
} 

Wyraźnie się myli! Ponieważ wiele standardów kodowania c # używa przedrostka „_” na wszystkich nazwach pól ! Kod musi być łatwy do zrozumienia przez innego programistę, więc kodu nie należy pisać w sposób, który wprowadzałby w błąd wielu programistów C #.

Biorąc pod uwagę wszystkie zalety małych metod, osobiście nie widzę potrzeby konwencji nazewnictwa w celu oddzielenia zmiennych lokalnych od parametrów. Jeśli metody mają tak wiele parametrów i zmiennych lokalnych, że nie można powiedzieć, co się dzieje bez konwencji nazewnictwa, masz większe problemy. (Jest to dobrze omówione w książce Java Clean Code Book , ale nadal uważam ją za wielką korzyść jako programista C #)

Ian
źródło
4

Jeśli chcesz poprzedzić je czymś, powinieneś użyć p_parametru: generalnie myślę, że prawdopodobnie zrobiłbyś to wielu ludziom. ALE bądź konsekwentny, nie rób tego tylko w jednym miejscu tylko dlatego, że potrzebujesz dwóch różnych nazw dla zmiennych, które chcesz nadać tej samej nazwie.

Tak wygląda dobra ogólna reguła z nazwami zmiennych;

  • Jeśli masz tylko jeden typ obiektu, nazwij go według funkcji:

    var builder = new PizzaBuilder();
  • Jeśli masz ich więcej niż jedną nazwę według ich funkcji i specjalizacji:

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();

źródło
Parametr p_ (lub po prostu p) dla parametru jest starą konwencją, która była często używana w C ++ i C. Zwykle idzie z l_ ​​dla lokalnych i (w C ++) m_ dla zmiennych składowych. Widziałem to również w Pascalu, Moduli 2 i Adzie, więc nie jest to tylko sprawa z rodziny C. To jest trochę love-it-or-hate-go, choć. Użyłem go niemal obsesyjnie, moim usprawiedliwieniem jest rozumowanie Steve'a Haighsa dla „As”. Np. Często robią to metody ustawiające m_Whatever = p_Whatever;- nadanie tym dwóm identyfikatorom znacząco różnych nazw byłoby niezręczne. Zacząłem jednak zastanawiać się, czy te przypadki są wystarczająco częste, aby uzasadnić spójną konwencję.
Steve314,
4

Konwencje nazewnictwa C # pozwolą Ci:

  • Używanie PascalCasing do metod, właściwości publicznych i nazw klas
  • Używanie IPascalCasing (zwróć uwagę na I na początku) dla nazw interfejsów
  • Użycie camelCasing do parametrów metody i zmiennych lokalnych
  • Użycie _underscoredCamelCasing dla prywatnych pól klasy

I proszę, trzymaj się z dala od węgierskiej notacji. Jest to bezcelowe i nie przestrzega konwencji C #.

Matteo Mosca
źródło
prywatne pola są obudowane pascal, jeśli są statyczne.
sara,
2

Podkreślanie w nazewnictwie zmiennych może być trochę niepotrzebne, ponieważ mamy słowo kluczowe „this” odnoszące się konkretnie do zmiennych na poziomie klasy. Jeśli chcesz dowiedzieć się więcej o konwencjach nazewnictwa zmiennych od ekspertów, proponuję rzucić okiem na niesławny artykuł zatytułowany „Reguły Ottingera dla zmiennych i nazewnictwa klas” Tima Ottingera, artykuł poparty przez mentora czystego kodowania Roberta C. Martina .

Ottinger stwierdza, że ​​twój kod musi pozostać tak czytelny, jak to możliwe, jak dobrze napisana proza, więc ...

public void Function(string p_Parameter1, string p_Parameter2)

... byłby bardziej czytelny jak ...

public void Function(string parameter1, string parameter2)

... gdzie parametry 1 i 2 są opisowymi nazwami odpowiednich zmiennych.

Oto link, zdecydowanie warty obejrzenia: Link

Luis Aguilar
źródło
-3

Wierzę w przyrostek parametrów: ciąg s_, int i_ itp

Uważam również, że nazwy parm powinny być krótkie i ogólne, jak to możliwe.

Teraz z powodów:

  • W tej funkcji nie chcesz w żaden sposób modyfikować parametru, jeśli potrzebujesz zmodyfikowanej wersji, utwórz nową zmienną, aby ją wstawić. Nazewnictwo parms z sufiksem sprawi, że nie przypiszesz im, jeśli płacisz Uwaga.
  • Wyjątki od tej reguły występują, gdy parm jest odnawiany lub wycofywany. Chociaż nadal używam na nich sufiksu.
  • Dlaczego krótkie nazwy ogólne? Powinieneś dokumentować swoją funkcję, abyś wiedział, co naprawdę jest s_ w sensie opisowym. Tak więc, nie przeszkadzając, używanie krótkich ogólnych jest przydatne, gdy tworzysz grupy podobnych funkcji lub przycinasz ciało funkcji, aby przenieść do innej funkcji jako punkt początkowy modyfikacji.
  • Prawdziwą zaletą nazw ogólnych jest to, że w większości przypadków nie musisz przypominać sobie tego, co nazwałeś tym parametrem. Wiesz, że otrzymujesz ciąg znaków, więc jest to s_ itd. I nie musisz się zastanawiać, czy jest to „nazwa pliku”, czy „ścieżka pliku”, czy też „pełna ścieżka”, to jedyny ciąg, więc „s_”.

Wszystko ma swoje kompromisy, a to, czy czegoś użyjesz, czy nie, będzie bardzo zależeć od tego, jak pasuje do twojego obecnego stylu.

znak
źródło
6
-1: a) Jesteś prefiksem, a nie sufiksem; b) jest to zapis węgierski i powinien iść w parze z do-do .
Peter K.,
1
Czy typ C # nie jest bezpieczny?
pyvi
1
@Peter K. - Wygląda mi na to si isą krótkimi nazwami, ponieważ to tylko przykład. IOW Nie sądzę, żeby to w ogóle był węgierski - myślę, że źle interpretujesz krótką nazwę, która jest po prostu klasyczna string slub nie int iumiem wymyślić lepszej nazwy, ale z przyklejonymi przyrostkami podkreślenia .
Steve314,
@ Steve314: Ach, masz rację! Zobaczmy, czy Mark zareaguje.
Peter K.,
S_ to chyba anonimowy HG i nie wynika to z przykładu.
Mark