Po co dokonywać syntaktycznego rozróżnienia między typami standardowymi a typami zdefiniowanymi przez użytkownika?

13

Chociaż tutaj będę odnosił się konkretnie do konwencji nazewnictwa C ++ i Bjarne Stroustrup , w zasadzie widziałem, że ludzie używają nieco podobnych reguł dla innych języków tu i tam.

Zatem podstawową ideą jest to, że podczas czytania kodu należy odróżniać typy standardowe od typów zdefiniowanych przez użytkownika . Na przykład Bjarne Stroustrup sugeruje, aby użyć

pierwsza wielka litera dla typów (np. kwadrat i wykres)

który, biorąc pod uwagę to

Język C ++ i standardowa biblioteka nie używają wielkich liter

pozwala osiągnąć cel wymieniony powyżej.

Ale dlaczego musimy to zrobić? Jaki może być cel rozróżnienia typów standardowych i zdefiniowanych przez użytkownika?

Nie mogłem znaleźć żadnego rozumowania Bjarne Stroustrup w tej sprawie, a poza tym sam myślę w diametralnie przeciwny sposób. : Wiem, wiem: „Kim jestem, aby spierać się ze Stroustrupem?” Ale posłuchaj, kilka funkcji języka C ++, np. Przeciążenie operatora, służy temu, aby typy zdefiniowane przez użytkownika miały podobny poziom wsparcia składniowego jak typy standardowe. A potem wszystko to jest zaskoczone inną dyscypliną nazewnictwa ...

PS Nie wspominając już o tym, że często jedno słowo nie wystarcza do nazwania klasy, a słowo oddzielone podkreśleniem, które zaczyna się od dużej litery, wygląda tak obco.

Żbik
źródło
6
Na koniec można nazwać to również formą notacji węgierskiej (tj. Osadzanie informacji o typie / użyciu w nazwie), co zwykle jest niezadowolone. Stąd: dobre pytanie.
stijn
2
@stijn: Tak, ale czy wiesz, dlaczego jest to marne ? Wcześniej, kiedy wszyscy używali edytora tekstu do pisania swoich programów, warto było poznać typ, patrząc na identyfikator. Ale dziś możesz po prostu najechać kursorem na identyfikator w dowolnym nowoczesnym środowisku IDE, a zobaczysz typ.
Robert Harvey
4
@RobertHarvey Z wyjątkiem tego, że notacja węgierska jest również odrzucana w społecznościach, które nie mają potężnych IDE, a raczej najczęściej używają edytorów zwykłego tekstu.
1
@RobertHarvey Nie, znam oba („węgierskie aplikacje” i „węgierskie systemy”) iz mojego doświadczenia wynika, że ​​żadne z nich nie jest powszechne, na przykład w Pythonie i Rust.
3
@RobertHarvey Czy mówisz, że notacja węgierska istniała tylko w C, C ++ i VB? Niezależnie od tego, moim celem było zakwestionowanie powodu, dla którego podajesz, że jest zniesmaczony (że jest zbędny tylko, ponieważ mamy IDE, które informują o typie), ponieważ ten powód nie dotyczy języków, które nie mają takich ID i, według twojego rozumowania, powinien skorzystać z węgierskiego. To, że Python jest dynamicznie wpisywany, nie ma znaczenia, w rzeczywistości powinno poprawić rozumowanie, ponieważ zazwyczaj programista zna typy podczas pisania kodu, ale nie można ich wywnioskować automatycznie.

Odpowiedzi:

5

Nie ma w tym absolutnie żadnego celu ani korzyści. Jednym z celów C ++ było wymienne traktowanie UDT i prymitywów, i chociaż nie do końca się udało, jest to obszar, w którym nie trzeba różnicować.

Jeśli chodzi o nazewnictwo, Stroustrup jest szalony i jest to naukowo udowodniony fakt.

DeadMG
źródło
2
Zobaczę twoją RAII i podniosę ci SFINAE.
Robert Harvey
5
Widziałem, jak przydatne może być odróżnienie standardowych typów od UDT. Nie powinieneś zmieniać kodu w standardowej bibliotece, chyba że masz naprawdę dobry powód, więc zobaczenie małej litery oznacza, że ​​nie musisz patrzeć na kod, ponieważ, cóż, jest on w standardowej bibliotece.
Robert Harvey
4
@delnan: Tak. To nic innego jak apel do władzy ze strony „wielu ludzi”. Jeśli „wiele osób” chce się tu dostać i przedyskutować swoje rozumowanie, mogą to zrobić i do tego czasu nie mają nic do dodania. FTR, używam także wielkich liter dla UDT ... ale także dla prymitywów, ilekroć mam potrzebę ich aliasu.
DeadMG
2
@RobertHarvey: Zakłada się, że nie można rozpoznać typów standardowych w zasięgu wzroku. Lub najeżdżając na nie myszką w swoim środowisku i widząc „std ::”. Lub używając Go To Definition lub cokolwiek innego. Zasadniczo nie dotyczy.
DeadMG
1
Zawsze myślałem, że celem było odróżnienie standardowych typów przed pojawieniem się przestrzeni nazw. Obecnie jest to tylko relikt dawnego myślenia („najlepsza praktyka”, która jakiś czas temu przestała być najlepsza). FWIW, w moich osobistych projektach używam małych liter snake_casew swoich klasach i przestrzeniach nazw i nie miałem z tego powodu żadnych problemów - ani zamieszania.
utnapistim
3

Konwencje nazewnictwa dotyczą wspierania zrozumienia kodu przez człowieka (tj. Programistę i opiekuna).

UDT można określić tak, aby deklaracja zmiennych, inicjalizacja, wyrażenia i instrukcje działały na nich inaczej niż w przypadku typów standardowych. W celu znalezienia problemu przydatne jest, aby opiekun miał jakąś wskazówkę, że jakaś sekcja kodu może robić fajne rzeczy (np. Implementacja zdefiniowanego przez użytkownika typu integralnego używanego w niektórych funkcjach może mieć wadę w sposobie dodawania).

Istnieje wiele sposobów dostarczania takich wskazówek (komentarze, specyfikacje projektowe itp.). Zaletą konwencji nazewnictwa jest to, że są one obecne w kodzie, podczas gdy komentarze można pominąć, nieaktualne itp.

Obrabować
źródło
2

Jednym z powodów, dla których używam wielkich liter dla typów, jest odróżnianie zmiennych od typów. Pozwala to zadeklarować zmienną, która oprócz wielkich liter ma tę samą nazwę:

Foo foo;
Graph graph;

Może to być przydatne w przypadku klas, w których w każdym kontekście jest używana tylko jedna instancja, np. Ustawienia konfiguracji.

Sjoerd
źródło
IMHO to nie odpowiada na pytanie w nagłówku. Może dodać „pod tym względem, nazewnictwo standardowych typów małymi literami było tylko dla wstecznej kompatybilności z cstdlib”.
Vorac,