17

Możliwe duplikaty:
Is there any advantage of being a case-sensitive programming language?
Why are many languages case sensitive?Jaki jest cel rozróżniania wielkości liter w językach?

Coś Zawsze zastanawiałem się, dlaczego są języki zaprojektowany jako wielkość liter?

Mój groszek nie może zgłębić żadnego możliwego powodu, dla którego jest pomocny.

Ale jestem pewien, że jest tam jeden. I zanim ktokolwiek to powie, posiadanie zmiennej o nazwie dog i Dog zróżnicowanej według wielkości liter jest naprawdę bardzo złą praktyką, prawda?

Wszelkie uwagi są mile widziane, a być może każda historia w tej sprawie! Jestem niewrażliwy na ogólną wrażliwość na wielkość liter, ale wrażliwy na wrażliwość na wielkość liter, więc zachowajmy wszystkie odpowiedzi i komentarze na głos!

+1

Rozróżnianie wielkości liter ułatwia czytanie ... Chociaż nie jest związane z przypadkiem, ale spójrz na wcięcie; języki takie jak Python odnoszą sukces z powodu "wcięcia", które w pewnym sensie może być wrażliwe na wielkość liter. –

+2

Sposób, w jaki widzę, to to, że wszelkie mikro-zalety są znacznie mniejsze od negatywów wynikających z missuse, debugowania itp. –

+1

@Tom: Powiedzmy, że masz klasę o nazwie PIT i masz stałą o nazwie TAX ... Lub co jeśli masz regularną zmienną o nazwie hEllO. –

Odpowiedz

17

Nie jest złą praktyką posiadanie dwóch członków, którzy są różnicowani tylko przez przypadek, w językach, które go wspierają. Na przykład, tutaj jest dość powszechne trochę C#:

private readonly string name; 
public string Name { get { return name; } } 

Osobiście jestem bardzo zadowolony z wielkości liter - szczególnie, gdyż pozwala kod jak wyżej, gdzie zmienna członkiem i konwencje follow własność i tak, aby uniknąć nieporozumień.

Zauważ, że sprawa czułości ma aspekt kultury zbyt ... nie wszystkie kultury uzna te same znaki za równoważne ...

+0

Dzięki za odpowiedź, czy mógłbyś rozwinąć aspekt kulturowy? Nie jestem pewien, czy w pełni rozumiem. –

+4

Najczęściej podawanym przykładem są tureckie odmiany "I". Angielski niewrażliwość na wielkość jest niewrażliwa na to, ponieważ "i" =/= "I" w tym przypadku. – maxwellb

+3

+1 Jon, ponieważ również wspieram moje właściwości małymi samplami. Osobiście nie lubię używać prefiksów "_" dla pól prywatnych. – maxwellb

3

Wyobraź sobie, że masz obiekt o nazwie dog, który ma metodę o nazwie Bark(). Również zdefiniowałeś klasę o nazwie Dog, która ma statyczną metodę o nazwie Bark(). Piszesz dog.Bark(). Więc co zamierzasz zrobić? Wywołać metodę obiektu lub metodę statyczną z klasy? (w języku, w którym :: nie istnieje)

+3

Dlaczego nie nazwać ich innymi rzeczami, aby nie zmiksować ich w dalszej linii? Posiadanie klasy o nazwie Dog i obiektu o nazwie dog będzie kłopotliwe. Tego nie rozumiem. –

+2

Pies jest zbyt ogólny ... Obiekt od psa, taki jak labrador, miałby większy sens. –

+3

Teraz kompilator wie, jaką metodę wywołać, ale czytelnik nadal będzie zdezorientowany. Myślę, że powinieneś użyć czegoś lepszego, aby odróżnić te dwa od wielkich liter z 1 litery. – Miel

1

Case-wrażliwy porównanie jest (od naiwnego punktu widzenia, że ​​ignoruje kanoniczny równoważność) trywialne (po prostu porównywać punkty kodowe), ale porównywanie bez względu na wielkość nie jest dobrze zdefiniowane i niezwykle skomplikowane we wszystkich przypadkach, a reguły są niemożliwe do zapamiętania. Wdrożenie tego jest możliwe, ale nieodwracalnie doprowadzi do niespodziewanego i zaskakującego zachowania. BTW, niektóre języki jak Fortran i Basic zawsze były niewrażliwe na wielkość liter.

+1

Myślę, że porównanie "wrażliwych" przypadków byłoby bardziej banalne. W jaki sposób jeden "porównać codepoints", aby powiedzieć, że "a" ~ "A"? W jednym kodowaniu znaków można porównywać wielkość liter, wykonując proste porównanie binarne ... – maxwellb

+1

Pomyliłem rozróżnianie wielkości liter w zależności od wielkości liter. – Philipp

+0

Każdy wyszukiwarka, z której korzystałem, może wykonywać wyszukiwania bez rozróżniania wielkości liter. Wiele (np. Emacs) robi to domyślnie. Tak, rzeczy stają się błotniste, gdy masz do czynienia z językami innymi niż angielski, ale tak długo, jak reguły dla twojego kompilatora i wyszukiwarki są takie same, nie ma tam prawdziwego problemu. –

2

Jestem pewna, że ​​początkowo był to czynnik wydajności. Konwersja ciągu na wielkie lub małe litery w przypadku porównania bez użycia kodu nie jest dokładnie kosztowną operacją, ale nie jest też darmowa, a w przypadku starych systemów może być bardziej złożona, ponieważ systemy dnia nie były gotowe do obsługi.

A teraz, oczywiście, języki lubią być ze sobą kompatybilne (VB na przykład nie potrafi rozróżnić klas C# lub funkcji, które różnią się tylko w przypadku), ludzie są przyzwyczajeni do nazywania rzeczy tym samym tekstem, ale z różnymi przypadki (patrz odpowiedź Jona Skeeta - robię to bardzo często), a wartość języków bez precedensu nie była wystarczająca, aby przeważyć nad tymi dwoma.

+2

Jestem równie pewny, że pierwotnie nie miało to nic wspólnego z wydajnością, ale ta sprawa została zignorowana w językach programowania. Zamiast tego wykorzystano 5-bitowe schematy kodowania używane w (wielu) teleprottach z lat 50., które po prostu nie miały wielkich i małych liter. NIE POTRZEBUJESZ UPPERCESU LUB PUNKTUACJI W STOPIE TELEGRAMOWYM –

+1

Sądzę, że liczy się to z teorią wydajności, że języki niewrażliwe na wielkość znaków, takie jak Fortran i Basic, są jednymi z najstarszych ze wszystkich języków. – Philipp

+1

Heh, Philipp wygrywa. Nawet o tym nie myślałem. –

8

Jedną z największych przyczyn rozróżniania wielkości znaków w językach programowania jest czytelność. Rzeczy, które mają na myśli to samo, powinny również wyglądać tak samo.

znalazłem następujący interesting example M. Sandin w pokrewnej dyskusji:

Kiedyś uwierzyć czułość przypadek był błędem, aż zrobiłem to w przypadku języka niewrażliwy PL/SQL (składnia teraz entierly zapomniane):

function IsValidUserLogin(user:string, password :string):bool begin 
    result = select * from USERS 
      where USER_NAME=user and PASSWORD=password; 
    return not is_empty(result); 
end 

ten przeszedł niezauważony przez kilka miesięcy na produkcji małoseryjnej system, i nie zaszkodziło to. Ale to jest paskudnym błędem, wyrzucanym z przypadku niewrażliwości, konwencjami kodowania i sposobem w jaki ludzie czytają kod. Lekcja dla mnie była taka: rzeczy, które są samo powinny wyglądać tak samo.

Czy widzisz problem od razu? Nie mogłem ...

+4

Jest to kod nieuwzględniający wielkości znaków, więc 'PASSWORD = password' jest zawsze prawdziwe. – Blorgbeard

+1

@ Tom Gullen: Wyjaśniono [dalej] (http://lambda-the-ultimate.org/node/1114#comment-12098) w połączonym wątku. –

+1

Zgaduję? PASSWORD = hasło zawsze jest prawdziwe? Stąd każda ważna nazwa użytkownika zaloguje się ... przynajmniej jeśli mam rację: P –

9

Lubię rozróżniać wielkość liter, aby odróżnić klasę od instancji.

Form form = new Form();

Jeśli nie można tego zrobić, możesz skończyć z zmiennych zwanych myForm lub form1 lub f, które nie są tak czyste i opisowe jak zwykły stary form.

Rozróżnianie wielkości liter oznacza również, że nie ma żadnych odniesień do form, FORM i Form, które oznaczają to samo. Trudno mi odczytać taki kod. Znacznie łatwiej jest zeskanować kod, w którym wszystkie odniesienia do tej samej zmiennej wyglądają dokładnie tak samo.

+1

Pracując dużo w językach niewrażliwych na wielkość liter, stwierdzam, że wymyślanie różnych nazw klas i obiektów jest dobrą umiejętnością do zdobycia. –

+1

Ten problem nie pojawia się w np. Visual Basic, ponieważ identyfikatory typów i identyfikatory obiektów są tam wyraźnie oddzielone ('Dim Form As Form' itd., Tylko typy mogą pojawiać się po' As'). Znowu jest to składnia C, która jest wadliwa, a nie ogólny pomysł. – Philipp

+3

@ T.E.D. To zależy.Czasami jest to najbardziej oczywiste i użyteczne imię - czasami tak nie jest. Miło jest przynajmniej mieć taką opcję. –

2

Powodem, dla którego nie można zrozumieć, dlaczego wrażliwość na przypadek jest dobrym pomysłem, jest fakt, że tak nie jest. To tylko jeden z dziwnych dziwactw C (takich jak tablice 0), które teraz wydają się "normalne", ponieważ tyle języków skopiowało to, co zrobił C.

C używa rozróżniania wielkości liter w indentyfikatorach, ale z perspektywy projektowania języka, który był dziwnym wyborem. Większość języków zaprojektowanych od zera (bez uwzględniania w jakikolwiek sposób "jak C") nie było rozróżniane wielkości liter. Obejmuje to Fortran, Cobol, Lisp i prawie całą rodzinę języków Algol (Pascal, Modula-2, Oberon, Ada, itp.)

Języki skryptów są mieszane. Wiele z nich było rozróżnianych wielkości liter, ponieważ system plików Unix był rozróżniany wielkością liter i musieli z nim rozsądnie współdziałać. C rodzaj wyrósł organicznie w środowisku Unix i prawdopodobnie podjął filozofię rozróżniania wielkości liter.

+0

Komputery były znacznie mniej wydajne w latach siedemdziesiątych niż dziś; ale zastanawiam się, czy może nie był to przypadek przedwczesnej optymalizacji 40 lat temu. –

+0

Cały język C można spojrzeć w ten sposób. Na przykład przyrosty i dekrementy przed i po zostały ujęte jako operatory, ponieważ oryginalny procesor C (CISC) miał warianty kodu operacyjnego dla większości operacji, które to wykonały. –

4

Zawsze zastanawiałem się, dlaczego języki są tak rozróżniane?

Ostatecznie dzieje się tak dlatego, że łatwiej poprawnie poprawnie rozróżnić wielkość liter; po prostu porównujesz bajty/znaki bez żadnych konwersji. Możesz również robić inne rzeczy, takie jak mieszanie bardzo proste.

Dlaczego to jest problem? Cóż, niewrażliwość na wielkość liter jest raczej trudna do dodania, chyba że jesteś w niewielkiej domenie obsługiwanych postaci (szczególnie US-ASCII).Reguły przeliczania skrzynek różnią się w zależności od ustawień narodowych (reguły tureckie nie są takie same jak w pozostałych częściach świata) i nie ma gwarancji, że przerzucenie pojedynczego fragmentu zrobi to, co trzeba, lub że zawsze będzie to samo i pod tym samym warunki wstępne. (IIRC, w niektórych językach obowiązują bardzo skomplikowane reguły dotyczące wyrzucania znaków diakrytycznych podczas konwersji samogłosek na wielkie litery i ponownego wprowadzania ich przy konwersji na małe litery.) Zapomniałem dokładnie, jakie są szczegóły.)

Jeśli masz na myśli po prostu to zignoruj; to po prostu prostsze. (Pamiętaj, że nadal powinieneś zwracać uwagę na formularze normalizacji UNICODE, ale to już inna historia i stosuje się do wszystkich reguł, których używasz).

+1

Ciesz się również, że nikt nie zautomatyzował tworzenia tytułów dla języków komputerowych (i nie jestem pewien, jak to by działało); zasady * są * bardziej złożone! –

Powiązane problemy