Jednym ze zagrożeń związanych ze params
słowem kluczowym jest to, że po zakodowaniu wywołań metody
- ktoś przypadkowo / celowo usuwa jeden / więcej wymaganych parametrów z podpisu metody, oraz
- co najmniej jeden wymagany parametr bezpośrednio przed
params
parametrem przed zmianą podpisu był zgodny z typem params
parametru,
te wywołania będą się nadal kompilować z jednym / więcej Wyrażeniami uprzednio przeznaczonymi dla wymaganych parametrów traktowanych jako params
parametr opcjonalny . Właśnie natrafiłem na najgorszy możliwy przypadek: params
parametr był typu object[]
.
Jest to godne uwagi, ponieważ programiści są przyzwyczajeni do kompilatora uderzającego w nadgarstki w znacznie, znacznie bardziej powszechnym scenariuszu, w którym parametry są usuwane z metody ze wszystkimi wymaganymi parametrami (ponieważ liczba oczekiwanych parametrów zmieni się).
Dla mnie to nie jest warte skrótu. (Type)[]
bez params
będzie działał z 0 do nieskończoności # parametrów bez potrzeby zastępowania. Najgorsze jest to, że będziesz musiał dodać , new (Type) [] {}
do Połączenia, gdzie to nie dotyczy.
Btw, imho, najbezpieczniejszą (i najbardziej czytelną praktyką) jest:
przechodzą przez Nazwane Parametry (co możemy teraz zrobić nawet w C # ~ 2 dekady po tym, jak mogliśmy w VB; P) (ponieważ:
1.1 jest to jedyny sposób, który gwarantuje zapobieganie niezamierzonym wartościom przekazywanym do parametrów po zmianie kolejności parametrów, zgodności typu i / lub zmianie liczby po zakodowaniu wywołań,
1.2 to zmniejsza te szanse po zmianie parametru znaczenie, ponieważ prawdopodobnie nowa nazwa odzwierciedla identyfikator nowego znaczenia jest tuż obok wartości były przekazywane do niej,
1.3 unika się konieczności liczenia przecinków i przeskakiwania w przód i w tył od wezwania do podpisu, aby zobaczyć, jakie wyrażenie jest przekazywane dla danego parametru, oraz
1.3.1 Nawiasem mówiąc, sam z tego powodu powinny być dużo (jeśli chodzi o unikanie częstych naruszeń podatne na błędy suchej Principle tylko do odczytu kodu nie wspomnieć także modyfikować go), ale powodem może być wykładniczo ważniejsze, jeśli istnieje jeden / więcej przekazywanych wyrażeń, które same zawierają przecinki, tj. wielowymiarowe odwołania do macierzy lub wywołania funkcji o wielu parametrach. W takim przypadku nie można nawet użyć (a nawet gdybyś mógł dodać dodatkowy krok na parametr w parametrze wywołania metody) funkcji Znajdź wszystkie wystąpienia w elemencie Wybór w edytorze, aby zautomatyzować liczenie przecinków.
1.4 jeśli musisz użyć parametrów opcjonalnych ( params
lub nie), pozwala to na wyszukiwanie połączeń, w których przekazywany jest dany parametr opcjonalny (a zatem najprawdopodobniej nie ma go, a przynajmniej może nie być wartością domyślną),
(UWAGA: Powody 1.2. I 1.3. Mogą zmniejszyć i zmniejszyć ryzyko błędu nawet przy kodowaniu początkowych wywołań, nie mówiąc już o tym, kiedy połączenia muszą zostać odczytane i / lub zmienione.)
i
zrób to JEDEN - PARAMETR - PER - LINE dla lepszej czytelności (ponieważ:
2.1 jest mniej zagracony i
2.2 unika się konieczności przewijania w prawo i wstecz w lewo (i robienia tego PER - LINE, ponieważ większość śmiertelników nie może odczytać lewej części wielu linii, przewijać w prawo i czytać prawą część).
2.3 jest to zgodne z „najlepszymi praktykami”, do których już opracowaliśmy dla instrukcji przypisania, ponieważ każdy przekazywany parametr jest w istocie instrukcją przypisania (przypisywanie wartości lub odwołania do zmiennej lokalnej). Podobnie jak ci, którzy przestrzegają najnowszych „najlepszych praktyk” w stylu kodowania, nie marzyliby o kodowaniu wielu instrukcji przypisania w wierszu, prawdopodobnie nie powinniśmy (i nie raz, gdy „najlepsza praktyka” dogoni mojego „geniuszu”; P ) zrób to podczas przekazywania parametrów.
UWAGI :
Przekazywanie zmiennych, których nazwy odzwierciedlają parametry, nie pomaga, gdy:
1.1 podajesz Stałe Dosłowne (tj. proste 0/1, fałsz / prawda lub null, do którego nawet „Najlepsze praktyki” mogą nie wymagać użycia Nazwy Stałej, a ich celu nie można łatwo wywnioskować z nazwy Metody ),
1.2 Metoda jest znacznie niższa / bardziej ogólna niż wywołująca, tak że nie chcesz / nie będziesz mógł nazwać swoich Zmiennych tak samo / podobnych do parametrów (lub odwrotnie), lub
1.3 zamawiasz / zamieniasz parametry w podpisie, co może powodować kompilację wcześniejszych połączeń, ponieważ typy są nadal kompatybilne.
Posiadanie funkcji automatycznego zawijania, takiej jak VS, eliminuje tylko JEDEN (# 2.2) z 8 powodów, które podałem powyżej. Wcześniej, aż do VS 2015 r., NIE powodowało ono automatycznego wcięcia (!?! Naprawdę, MS?!?), Co zwiększa nasilenie przyczyny # 2.1.
VS powinien mieć opcję, która generuje fragmenty wywołania metody z nazwanymi parametrami (jeden na linię, oczywiście; P) oraz opcję kompilatora, która wymaga nazwanych parametrów (podobnie w koncepcji do opcji jawnej w VB, która, przy okazji, wymagała tego od razu równie oburzające, ale teraz jest „ wymagane ” przez „Najlepsze praktyki”). W rzeczywistości „z powrotem w moimdzień ";), w 1991 roku, zaledwie kilka miesięcy w mojej karierze, nawet zanim użyłem (lub nawet widziałem) język z Nazwanymi Parametrami, miałem anty-owczarek /" po prostu możesz, nie znaczy, że powinieneś " / nie ślepo „odcinaj końcówki pieczeni” wystarczająco, by go zasymulować (używając komentarzy w linii), nie widząc, że ktoś to robi. Nie musisz używać Nazwanych Parametrów (a także innej składni, która oszczędza „cenny” ” Kod źródłowy naciśnięcia klawiszy) jest reliktem epoki dziurkacza karty, gdy większość z tych składni zaczęło. nie ma usprawiedliwienia dla że z nowoczesnego sprzętu i IDE i znacznie bardziej złożonego oprogramowania gdzie czytelność jest dużo, dużo, dUŻOważniejsze. „Kod jest odczytywany znacznie częściej niż jest zapisywany”. Dopóki nie powielasz kodu nieaktualizowanego automatycznie, każde zapisane naciśnięcie klawisza może kosztować wykładniczo więcej, gdy ktoś (nawet ty) spróbuje go później przeczytać.