Czasami najbardziej logiczną nazwą czegoś (np. Zmiennej) jest zastrzeżone słowo kluczowe w wybranym języku lub środowisku. Kiedy nie ma równie odpowiedniego synonimu, jak się go nazywa?
Wyobrażam sobie, że istnieją heurystyki najlepszych praktyk dla tego problemu. Mogą być one dostarczone przez twórców lub zarządców języków programowania i środowisk. Na przykład, jeśli python.org (lub Guido van Rossum) mówi, jak sobie z tym poradzić w Pythonie, byłoby to dobrą wskazówką w mojej książce. Link do MSDN, jak sobie z tym poradzić w języku C # byłby również dobry.
Alternatywnie, wartościowe powinny być również wytyczne dostarczone przez głównych wpływowych inżynierów oprogramowania. Być może Google / Alphabet ma fajny przewodnik po stylu, który uczy nas, jak sobie z tym poradzić?
Oto tylko przykład: w języku C # „default” jest zastrzeżonym słowem kluczowym. Kiedy używam wyliczenia, chciałbym nazwać wartość domyślną „default” (analogicznie do instrukcji „switch”), ale nie mogę.
(W języku C # rozróżniana jest wielkość liter, a stałe wyliczeniowe powinny być pisane dużymi literami, więc „Domyślny” jest tutaj oczywistym wyborem, ale załóżmy, że nasz obecny przewodnik stylu dyktuje, że wszystkie stałe wyliczeniowe mają być
pisane małymi literami.) Możemy rozważyć słowo „defaultus ”, ale nie jest to zgodne z zasadą najmniejszego zdziwienia . Powinniśmy również rozważyć „standardowe” i „początkowe”, ale niestety „domyślne” to słowo, które dokładnie przekazuje swój cel w tej sytuacji.
clazz
jest de facto standardem. Zasadniczo jest to część konwencji nazewnictwa platformy. Robienie czegokolwiek innego byłoby pogwałceniem oczekiwań, że inni mogą odczytać Twój kod, więc powinno to być zrobione tylko w razie absolutnej konieczności.Odpowiedzi:
W przypadku opcji wyliczania należy użyć wielkości liter takich jak
Default
. Ponieważ w C # rozróżniana jest wielkość liter, nie będzie kolidować z zarezerwowanym słowem kluczowym. Zobacz Wskazówki dotyczące nazewnictwa .net .Ponieważ wszyscy członkowie publiczni powinni mieć wielkość liter w .net, a wszystkie zastrzeżone nazwy są małymi literami, tak naprawdę nie powinieneś tego napotykać poza zmiennymi lokalnymi (w tym parametrami). A miejscowi zwykle używają rzeczowników lub fraz jako nazw, więc rzadko zdarza się, że najbardziej naturalna nazwa koliduje ze słowem kluczowym. Na przykład.
defaultValue
byłoby zwykle bardziej naturalną nazwą niżdefault
. W praktyce nie jest to duży problem.W języku C # możesz użyć
@
prefiksu „ ”, aby uniknąć zarezerwowanych słów kluczowych, aby można je było wykorzystać jako identyfikatory (jak@default
). Ale należy tego używać tylko wtedy, gdy naprawdę nie masz innej opcji, tj. Jeśli korzystasz z biblioteki innej firmy, która używa zastrzeżonych słów kluczowych jako identyfikatora.Oczywiście inne języki mają inną składnię i słowa kluczowe, a zatem różne rozwiązania tego problemu.
SQL ma dość dużo słów kluczowych, ale bardzo często po prostu ucieka się od identyfikatorów, takich jak
[Table]
. Niektóre nawet robią to dla wszystkich identyfikatorów, niezależnie od tego, czy kolidują ze słowem kluczowym, czy nie. (W końcu w przyszłości można wprowadzić sprzeczne słowo kluczowe!)Program PowerShell (i kilka innych języków skryptowych) poprzedza wszystkie zmienne znakiem sigil, takim jak $, co oznacza, że nigdy nie będą kolidować ze słowami kluczowymi.
Lisp w ogóle nie ma słów kluczowych, przynajmniej nie w konwencjonalnym sensie.
Python ma oficjalnie uznaną konwencję w PEP-8 :
Niektóre języki, takie jak Brainfuck lub Whitespace, w ogóle unikają definiowania słów, elegancko omijając problem.
Krótko mówiąc, nie ma niezależnej od języka odpowiedzi na twoje pytanie, ponieważ w dużym stopniu zależy to od składni i konwencji danego języka.
źródło
#define
, ale prawy operand zawsze byłby interpretowany jako rozróżniający wielkość liter. Umożliwiłoby to rozwiązanie wielu rodzajów konfliktów nazw (w tym, w przypadku języków bez rozróżniania wielkości liter, import symboli, które są identyczne, z wyjątkiem wielkości liter).Dołączę podkreślenie (default_)
Plusy:
Dlaczego nie lubię innych rozwiązań:
Synonim:
Dołączanie / przygotowywanie słowa:
Zmiana liter (clazz zamiast klasy):
Dołączanie numeru (domyślnie 1):
Dołączanie / przygotowywanie listu:
Escaping słowa kluczowego (@default (c #), `default` (scala))
Kiedy nie powinienem go używać:
źródło
klass
znaleźć zmienną, w którejclass
jest słowo zastrzeżone. Nigdy nie widziałem,defawlt
ale to ten sam pomysł. Wolałbymdefault_
(i prawdopodobnie,class_
gdyby tak nie deptać nad ustalonymi konwencjami).„Domyślne” prawdopodobnie nie jest przydatną wartością wyliczenia. Reprezentuje zachowanie, które może się zmienić w zależności od kontekstu, w którym jest używane.
Biorąc to pod uwagę, jeśli w twoim języku rozróżniana jest wielkość liter, użyj innego słowa dla tego słowa. (Domyślne vs domyślne)
Lub jeszcze lepiej, włóż dodatkowy wysiłek, aby wpisać jeszcze kilka liter i nazwać go DefaultValue.
źródło
enum ErrorHandlingLevel { Default = 0, ... }
vsenum ErrorHandlingLevel { None = 0, ... }
. W drugim przykładzie fakt, żeNone
jest domyślny, można podać, ustawiając wartość wyliczenia na 0, używając xmldoc lub jawnie w kodzie. Dostajesz dodatkową korzyść, wiedząc, co to znaczy, gdy obiekt maErrorHandlingLevel
ustawioneNone
. Porównaj to do inspekcji obiektu zErrorHandlingLevel
ustawioną wartością domyślną.Gorąco polecam NIE lokalną zmianę konwencji nazewnictwa (lub dodawanie bezsensownych znaków) w celu ujednoznacznienia (jak sugerowano w innych postach). Powoduje zamieszanie, jeśli zamiar nie jest oczywisty, i może rodzić pytania, dlaczego tak się nazywa. Bez tego można to rozwiązać.
W każdym przypadku powinno być możliwe użycie słowa o znaczeniu synonimicznym lub sprecyzowanie nazwy (lub nawet pełne określenie). Nawet jeśli może wprowadzić powtórzenie kontekstu, może być lepszym rozwiązaniem.
Załóżmy na przykład, że masz wyliczenie,
Mode
które powinno ujawniać wartość domyślną, jak w twoim przypadku. Nazewnictwodefault_mode
może nie wydawać się najlepsze ze względu na powtarzalność, ale pozwala uniknąć dwuznaczności przy przekazywaniu pożądanego znaczenia.źródło
Musisz użyć innego lub zmodyfikowanego słowa, co jest jasne.
To zazwyczaj oznacza albo
Innym czynnikiem, który należy ustalić, jest sposób łączenia wielu słów, a opcje są zwykle
Moja sugestia to użycie prefiksu lub sufiksu oraz podkreślenia / myślniki, np
local_default
ma tę zaletę, że wszyscy miejscowi są wyrównani i dlatego szybko się wyróżniają, ale wadą jest to, że zawsze musisz czytać drugą część, aby uzyskać unikalną nazwę.default_local
ma tę zaletę, że unikalna nazwa zmiennej jest szybko widoczna, ale miejscowi nie zawsze są tak łatwo grupowani wizualnie.Kilka przykładów podejścia specyficznego dla domeny, które widziałem, to:
vehicle_model
zamiastmodel
którego było słowo zastrzeżone;room_table
dla tabeli SQL jakotable
słowa zarezerwowanego.Pozostałe dwie opcje, z których widziałem języki lub skrypty, to:
źródło
words_with_underscores-or-dashes
przywoływane z dwoma nazwami -snake_case
podczas korzystania z podkreślenia ikebab-case
podczas używania myślnika. Uważam to drugie za zabawne.Oczywiście rób, co możesz, aby uniknąć tej sytuacji. Piszę oprogramowanie od późnych lat siedemdziesiątych, a czasy, w których naprawdę musiałem sfałszować zarezerwowane słowo, są znacznie poniżej dziesięciu, prawdopodobnie bliżej pięciu.
Istnieje wiele rzeczy, które możesz zrobić, takich jak podwojenie pierwszej lub ostatniej litery (
reservedd
) lub dodanie wiodącego lub końcowego znaku podkreślenia (reserved_
). To, co będzie odpowiednie, będzie w dużej mierze zależeć od używanych przez ciebie konwencji, szczególnie w odniesieniu do wiodących lub końcowych znaków podkreślenia. Staraj się również nie robić rzeczy z przypadkami, które mogą być źle odczytane przez ludzi (np. Używanie,Reserved
gdy różni się odreserved
).Gdy już coś wybierzesz, umieść to w swoich wytycznych dotyczących kodowania, upewnij się, że ludzie o tym wiedzą i że są używane konsekwentnie. Posuwam się nawet do dodania komentarza przypominającego, aby czytelnicy nie myśleli, że to literówka i wiedzą, że zobaczą go ponownie:
źródło
classs
?)W języku C # możesz wstawić nazwę identyfikatora za pomocą @ . Mówi to kompilatorowi, aby traktował nazwę jako nazwę identyfikatora, a nie jako możliwe słowo kluczowe.
źródło