Co robisz, gdy twoja konwencja nazewnictwa koliduje z twoim językiem?

14

Okej, to jedna z tych małych rzeczy, które zawsze mnie denerwowały. Zazwyczaj nie skracam identyfikatorów, a jedyny raz, kiedy używam krótkiego identyfikatora (np. i), Jest dla ciasnej pętli. Więc denerwuje mnie, kiedy pracuję w C ++ i mam zmienną, którą należy nazwać operatorlub classmuszę ją obejść lub użyć skrótu, ponieważ w końcu wystaje. Zastrzeżenie: może się to zdarzyć nieproporcjonalnie często, ponieważ dużo pracuję nad projektowaniem języka programowania, w którym obiekty domeny mogą odzwierciedlać koncepcje w języku hosta i przypadkowo powodować konflikty.

Jak sobie z tym poradzisz? Skracać? ( op) Błędnie piszesz? ( klass) Coś jeszcze? ( operator_)

Jon Purdy
źródło
7
Czy oprócz przestrzeni nazw powinniśmy rozważyć zmianę naszych konwencji nazewnictwa? Przepraszam za oczywiste.
Chris
1
@Chris: Nigdy nie możesz ufać programistom w realizacji oczywistych rzeczy! (Chociaż w tym przypadku mam.)
Jon Purdy
7
Jeśli istnieje jakikolwiek powód, aby lubić $varskładnię PHP , to jest to.
Joey Adams,
3
@Joey Adams: Uśmiechnąłem się na krótko, gdy zobaczyłem to pytanie i przypomniałem sobie wszystkie pytania dotyczące PHP, które krążą wokół SE.
Chris
3
Oczywiście zmień kod źródłowy języka, aby zezwolić na moje konwencje nazewnictwa. Ma to również tę zaletę, że „chroni” mój kod, ponieważ będzie on działał / kompilował tylko na moim interpreter / kompilatorze.
dietbuddha

Odpowiedzi:

21
  1. Zaakceptuj, że być może będziesz musiał wprowadzić niewielkie zmiany w konwencji nazewnictwa, takie jak dodanie wielkich liter. Lepiej jest to zaakceptować jak najszybciej, aby cały kolejny kod był spójny.

  2. Zastanów się nad bardziej szczegółowym. Słowa kluczowe wydają się być dość szeroki, więc zwężenie classdół demonstrationClassnie działa tylko wokół zagadnień, ale również zwiększa czytelność.

Maks
źródło
10

To nie jest coś, z czym się zetknąłem, ale jeśli dostanę się w takiej sytuacji, spróbuję rozwiązać to z następującymi opcjami, w kolejności.

  1. Spróbuj znaleźć synonim.
  2. (szczególnie w przypadku zmiennych) spróbuj znaleźć prefiks lub postfiks
  3. (szczególnie dla klas) zmień pierwszą literę na wielką i zapomnij o regule kodowania, zgodnie z którą nazwy nie powinny się różnić tylko w przypadku. Z tej opcji prawdopodobnie skorzystałbym tylko, jeśli konflikt dotyczy słowa kluczowego.
  4. Użyj skrótu.
Bart van Ingen Schenau
źródło
1
Nie widzę, co jest nie tak z nazwami różniącymi się tylko w przypadku, szczególnie na listach argumentów, w których parametr typu const Foo&nie ma żadnej rozsądnej pełnej nazwy innej niż foo. To prawda, że ​​lepiej byłoby podać swoje Foobardziej opisowe imię, niż foogdyby żyło w ciele funkcyjnym i służy mniej wyspecjalizowanemu celowi.
Jon Purdy,
@Jon - zgadzam się, chociaż osobiście wolę prefiksy „p_”, „l_” i „m_”, a nie rozróżnianie wielkości liter. Przyjąłem tę konwencję ze względu na kwestię oczywistej nazwy. Oczywiście, którą konwencję stosujesz, aby sobie z tym poradzić, w dużej mierze nie ma znaczenia, o ile konsekwentnie używasz jej w konkretnym kontekście, oczywiście - podejście różniące się przypadkami jest z pewnością stosowane na tyle szeroko, że większość programistów powinna to rozpoznać.
Steve314,
@Jon - ten komentarz brzmi, jakbym selektywnie stosował konwencję tylko wtedy, gdy mam problem z tymi samymi nazwami, co nie o to mi chodziło. Kwestia kontekstu dotyczy języka, projektu itp. Konwencje są tak zaprojektowane, aby problem nie pojawiał się za każdym razem, gdy się pojawia (a raczej nie występuje), aby nie był selektywnie stosowany w razie potrzeby.
Steve314
@ Steve314: Mam znaczenie od pierwszego komentarza. Nie wiem, takie afiksy zawsze wydawały mi się zbyt bliskie węgierskim systemom dla mojego komfortu.
Jon Purdy
@Jon: Nie jest to reguła, którą stosuję religijnie, ale uważam, że łatwiej jest popełniać błędy, jeśli dwa identyfikatory różnią się tylko wielkością liter. Niektóre z tych błędów zostaną wykryte przez kompilator, niektóre są znacznie trudniejsze do znalezienia (zwłaszcza jeśli dwa identyfikatory nazywają to samo). Wolę mieć jedną ogólną zasadę, z wyjątkami dla poszczególnych przypadków, niż zasadę o pełnej wartości księgowej obejmującą wszystkie możliwe przypadki.
Bart van Ingen Schenau
6

Język wygrywa; nie możesz przechytrzyć kompilatora (ignorując takie obrzydliwości jak PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, ale wtedy PL / 1 nie spowodowałoby, że zadałeś pytanie w pierwszej kolejności). Zasadniczo musisz przestrzegać zasad języka i znaleźć alternatywę dla słów kluczowych tego języka na własny użytek - lub znaleźć inny język.

Tak więc, z wyjątkiem bardzo nietypowych okoliczności, dostosowujesz się do języka, a nie odwrotnie.

Jonathan Leffler
źródło
5

Zamiast skracać, co powiesz na wydłużenie? Jeśli implementujesz konstrukcję klasy w języku Foo, co powiesz na użycie FooClass i foo_class? (Modulo bez względu na preferencje dotyczące obudowy).

Winston Ewert
źródło
Czy użyłbyś prefiksu „java” na każdym identyfikatorze, którego używasz w kodzie Java? I nawet nie wspominajmy o problemach z prefiksem „C ++” na każdym identyfikatorze ...
Steve314
@ Steve314, nie użyłbyś przedrostka java w kodzie java, użyłbyś przedrostka java w kodzie c ++, który implementuje kompilator java. Używałbyś go również, gdyby reszta identyfikatora była słowem kluczowym.
Winston Ewert
OK - masz na myśli wydłużenie w kategoriach ogólnych, ponieważ mówiąc bardziej szczegółowo, co odnosi się do identyfikatora. W przypadku różnych aplikacji nazwa „class” może zostać zmieniona na „class_taught” lub „class_of_animal” lub „classiness_value” lub cokolwiek innego. Zgadzam się - po prostu uznałem przykład zorientowany na kompilatory za mylący.
Steve314
5

Niektóre skróty, których używałem class, w kolejności częstotliwości:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Jeśli wiem, jaką klasę Classreprezentuje instancja, mogę zawrzeć ją w nazwie zmiennej:

  • stringClass = Class.forName("java.lang.String");
Mike Clark
źródło
Nigdy wcześniej nie widziałem w tym „cls”. Najczęściej używam aClass.
Konstantin Petrukhnov
4

W C i C ++ słowa kluczowe są pisane małymi literami, a w języku rozróżniana jest wielkość liter, więc od czasu do czasu naciskaj klawisz Shift, a wiele problemów zniknie.

W Modula-2, słowa kluczowe są wielkie - ale tak długo, jak identyfikatory mają jakieś małe litery różnica jest oczywista i ściera się niemożliwe.

Poza tym absolutnie konwencje nazewnictwa do pewnego stopnia muszą odzwierciedlać normalne konwencje używanego języka, więc z pewnością napisałbym „myClass” w Javie, gdzie bardziej prawdopodobne byłoby napisanie „My_Class” w C ++.

Zasadniczo nie piszesz tylko dla kompilatora, ale to, co ludzie uważają za czytelne, zależy w pewnym stopniu od kontekstu i powiązanych oczekiwań.

Steve314
źródło
3
Nawet w przypadku języków, w których rozróżniana jest wielkość liter, wydaje mi się, że po zmieszaniu classi Classszkodzi to czytelności kodu.
Karmastan
@Karmastan - być może zależy to od tego, ile czasu spędziłeś na pracy z językami i konwencjami uwzględniającymi wielkość liter. Osobiście „C” z wielkimi i małymi literami jest wizualnie bardzo oczywiste - wzory użycia długich identyfikatorów widzę szybciej niż potrafię je odczytać.
Steve314
3

Nie często się na to natrafiam, ale kiedy to robię, zwykle nie jest to problemem, ponieważ używam Delphi i pozwala to obejść ten problem, przygotowując znak & do identyfikatora. Zatem „klasa” nie jest prawidłowym identyfikatorem, ale „& klasa” to.

Mason Wheeler
źródło
Ciekawy. Mam narzędzie do generowania kodu, które pozwala na użycie literałów łańcuchowych w dowolnym miejscu, w którym można użyć identyfikatora. Początkowo większość identyfikatorów generowanego kodu była zapisywana jako literały ciągów, aby uniknąć ryzyka kolizji słów kluczowych z rosnącym (i bogatym w słowa kluczowe) DSL. Teraz dla większości nazw używane są identyfikatory (zaskakujące, o ile bardziej czytelne jest w ten sposób źródło), ale literały łańcuchowe są zawsze dostępne jako rezerwowe. Myślałem, że to jest dobre do generowania kodu, ale obejścia kolizji słów kluczowych byłyby złym pomysłem w języku ogólnego przeznaczenia - ale może się mylę.
Steve314,
2

Dodałbym pewien rodzaj przestrzeni nazw do nazwy zmiennej. Załóżmy na przykład, że masz moduł o nazwie użytkownik, a następnie zmodyfikowałbym operator nazwy zmiennej tak, aby był jak użytkownik_operator lub użytkownik_operator.

Pemda
źródło
2
po prostu nie używaj „gładkiego”, „nie” lub „mojego” jako przedrostka
Steven A. Lowe
2
Absolutnie. Głosuję „Jon_Purdys_Carefully_Chosen_Identifier_Prefix_”.
Steve314,
1
@Steven: Nawet gorzej, widzę a, ani thestosować zakłócania częstotliwości przez początkujących CS studentów.
Jon Purdy,
1
@Jon Purdy, to nie nasza wina! Obwiniaj profesora, który postanowił nazwać swoją instancję klasy People () aPerson.
Ben L
@Jon: Konwencja nazewnictwa, w której pracuję, określa, że ​​zmienne lokalne powinny zaczynać się aod zmiennych zmiennych ścisłych: /
Matthieu M.
2

zmień lub dostosuj moją konwencję nazewnictwa

Muad'Dib
źródło