Jak nazwać coś, gdy logiczna opcja jest zastrzeżonym słowem kluczowym? [Zamknięte]

64

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.

Protektor jeden
źródło
15
Użyłbym czegoś takiego jak „default_value”. Znaczenie pozostaje takie samo, ale musisz wpisać kilka dodatkowych znaków.
Mael
26
@Darkhogg, jeśli znalazłem jeden z tych w moim kodzie, zmieniłbym je natychmiast. Błędy ortograficzne lub naruszenia konwencji nazewnictwa są niedopuszczalne.
MetaFight
26
@MetaFight - z wyjątkiem tego, że w Javie wywołanie zmiennej, która przechowuje klasę, clazzjest 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.
Periata Breatta
6
domyślnie, ponieważ wartość wyliczona wydaje się przeciwna do produktywnej. Powinna to być nazwa specyficzna dla domeny, która opisuje wartość domyślną. Jednak powinna istnieć metoda zwracania wartości domyślnej.
qwerty_so
18
@AndresF. Nie zgadzam się. Często bardzo łatwo spieram się z projektantami Javy. Ale nie mam tego przeciwko nim. Pracowali na dzikim zachodzie.
MetaFight

Odpowiedzi:

63

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. defaultValuebył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 :

Zawsze używaj cls jako pierwszego argumentu do metod klas.

Jeśli nazwa argumentu funkcji koliduje z zarezerwowanym słowem kluczowym, ogólnie lepiej jest dołączyć pojedynczy końcowy znak podkreślenia, niż używać skrótu lub korekty pisowni. Zatem class_ jest lepszy niż clss. (Być może lepiej jest unikać takich starć, używając synonimu).

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.

JacquesB
źródło
2
Nie należy jednak polegać wyłącznie na rozróżnianiu wielkości liter. Chociaż w praktyce nie jest to problem, nie we wszystkich językach .NET rozróżniana jest wielkość liter, dlatego w pewnym momencie mogą wystąpić nieoczekiwane problemy.
Vivelin
6
@Vivelin: Nie powinieneś mieć publicznych członków ani wpisywać nazw, które różnią się tylko w przypadku, ponieważ może to prowadzić do problemów w innym języku. Nie ma to jednak związku z tym, co sugeruję, ponieważ słowa kluczowe nie są identyfikatorami (a inne języki będą miały inne słowa kluczowe).
JacquesB
Nawet jeśli dostępna jest składnia @, jest najlepiej zarezerwowana dla scenariuszy, w których należy wchodzić w interakcje z bibliotekami języków pisanych z różnymi słowami kluczowymi. Nawet tam myślę, że lepiej byłoby mieć jakąś funkcję językową #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).
supercat
@Vivelin nie we wszystkich językach .NET rozróżniana jest wielkość liter - znam VB.NET i Powershell; czy są jeszcze jakieś?
Zev Spitz
@ZevSpitz OP specjalnie powołał się na C #, dlatego myślę, że Vivelin użył go jako swojego przykładu, jednak, jak mówisz, VB.NET nie rozróżnia wielkości liter, więc jak zwykle sądzę, że sprowadzałoby się to do podstawy językowej . Nie wszystkie języki mają takie same zastrzeżone słowa
Shaggy13spe
22

Dołączę podkreślenie (default_)

Plusy:

  • prosty
  • oczywiste (dlaczego miałbyś dodawać podkreślenie?)
  • zgodny
  • łatwy w użyciu
  • działa we wszystkich znanych mi językach
  • najbliżej opcji logicznej

Dlaczego nie lubię innych rozwiązań:

Synonim:

  • ciężko znaleźć
  • często nie to samo znaczenie (niuanse)

Dołączanie / przygotowywanie słowa:

  • niespójne (defaultValue, defaultItem)
  • zwiększona gadatliwość bez zwiększonej czytelności

Zmiana liter (clazz zamiast klasy):

  • niespójne (clazz, klass, klazz)

Dołączanie numeru (domyślnie 1):

  • podnosi pytanie o default2

Dołączanie / przygotowywanie listu:

  • nieoczywisty (programista musi zgadywać, że został użyty do nazewnictwa, a nie skrót do czegoś innego)

Escaping słowa kluczowego (@default (c #), `default` (scala))

  • możliwe tylko w niektórych językach
  • rzadko używana funkcja, głównie ze względu na zgodność z innymi językami
  • utrudnia korzystanie z interfejsu użytkownika (muszą wiedzieć, jak to zrobić i pamiętać, jak to zrobić)

Kiedy nie powinienem go używać:

  • istniejąca, szeroko stosowana inna konwencja
  • Znam już odpowiedni synonim
  • w twoim konkretnym przypadku wyliczenia śledziłbym odpowiedź @JacquesB
Siphor
źródło
7
Jest to rozwiązanie często używane w Pythonie. Nie opowiadam się za najbardziej eleganckim, ale działa.
fralau
1
@fralau Python jest szczególnie zły - naprawdę nie znoszę identyfikatorów takich jak „input”
Christian Sauer
W wielu językach można klassznaleźć zmienną, w której classjest słowo zastrzeżone. Nigdy nie widziałem, defawltale to ten sam pomysł. Wolałbym default_(i prawdopodobnie, class_gdyby tak nie deptać nad ustalonymi konwencjami).
nigel222
Nie uwzględniłeś opcji zmiany znaczenia słowa kluczowego.
CodesInChaos
1
Podajesz uzasadnione, rozsądne argumenty, chociaż nie jestem pewien, czy to „oczywiste, dlaczego użyto podkreślenia”. Rzadko pracuję z owocami znającymi wszystkie słowa kluczowe języków, w których pracują!
Protektor jeden
18

„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.

Kent A.
źródło
3
Zgadzam się. „Domyślne” nie podaje żadnej wartości. Rozważmy enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. W drugim przykładzie fakt, że Nonejest 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 ma ErrorHandlingLevelustawione None. Porównaj to do inspekcji obiektu z ErrorHandlingLevelustawioną wartością domyślną.
Harrison Paine
9

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, Modektóre powinno ujawniać wartość domyślną, jak w twoim przypadku. Nazewnictwo default_modemoże nie wydawać się najlepsze ze względu na powtarzalność, ale pozwala uniknąć dwuznaczności przy przekazywaniu pożądanego znaczenia.

Sopel
źródło
Masz rację, ale wciąż nie jestem pewien, co powoduje więcej zamieszania: mieć konsekwentnie dołączany fragment lub używać różnych słów w każdej sytuacji. Argumentem przeciwko tej pierwszej opcji jest oczywiście to, że sytuacje, w których byłaby ona użyta przede wszystkim, są (miejmy nadzieję) tak rzadkie, że nie można wywnioskować spójności z istniejącego kodu.
Protektor jeden
3

Musisz użyć innego lub zmodyfikowanego słowa, co jest jasne.
To zazwyczaj oznacza albo

  • zupełnie inne słowo
  • przedrostek
  • sufiks

Innym czynnikiem, który należy ustalić, jest sposób łączenia wielu słów, a opcje są zwykle

  • allonewordnoseparators
  • words_with_underscores-or- dashes ( snake_case )
  • CapitalizationForClarityAndReadability ( CamelCase )

Moja sugestia to użycie prefiksu lub sufiksu oraz podkreślenia / myślniki, np

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaultma 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_localma 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_modelzamiast modelktórego było słowo zastrzeżone; room_tabledla tabeli SQL jako tablesłowa zarezerwowanego.

Pozostałe dwie opcje, z których widziałem języki lub skrypty, to:

  • cudzysłowy lub podpowiedzi, aby otaczać nazwy zmiennych, a tym samym pozwalają na użycie słów zastrzeżonych. Podobnie do tego, mogłem sobie wyobrazić, że niektóre języki mogą pozwalać znakom specjalnym, takim jak backspace, na ucieczkę nazwy.
  • spacje w nazwach zmiennych.
Michael Durrant
źródło
Jako trochę może interesująca uwaga: widziałem words_with_underscores-or-dashesprzywoływane z dwoma nazwami - snake_casepodczas korzystania z podkreślenia i kebab-casepodczas używania myślnika. Uważam to drugie za zabawne.
VLAZ
2

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, Reservedgdy różni się od reserved).

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:

int ccase;  // Name dodges a reserved word
Blrfl
źródło
10
Nie downvoter, ale sugestia „podwojenia pierwszego lub ostatniego listu” spowodowała dreszcz po moim kręgosłupie ....
Willem van Rumpt
@WillemvanRumpt Też mi się nie podoba, ale raz na jakiś czas sprowadza się do wyboru pomiędzy ćwiczeniami gimnastycznymi, aby uniknąć zarezerwowanego słowa, które powoduje podskakiwanie po głowie lub dziwnie wyglądającego identyfikatora, który zachęca tylko trochę .
Blrfl
6
Brak zamierzonego osądu, tylko ... dreszcze ... zimne ...;)
Willem van Rumpt
1
Przesunięcie podkreślenia jest lepsze niż podwojona ostatnia litera. (Jakieś głosy za classs?)
nigel222
1
Wskazówki dotyczące kodowania! Byłoby miło mieć! Słuszna uwaga.
Protektor jeden
2

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.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
Robert Stiffler
źródło
3
zastanawiam się, kto zagłosowałby za tą „odpowiedzią”, która jedynie powtarza punkt, który już został (i o wiele lepiej przedstawiony) w najlepiej głosowanej odpowiedzi dzień wcześniej
zgodzi się