Czy zachęca się do korzystania z literowych zmiennych? [Zamknięte]

13

Czy w Javie zaleca się stosowanie zmiennych jednowoliterowych? We fragmentach kodu lub samouczkach często je widzisz. Nie wyobrażam sobie, aby korzystanie z nich było zachęcane, ponieważ sprawia, że ​​kod jest stosunkowo trudniejszy do odczytania i nigdy nie widzę, aby były używane w innych językach programowania!

William Edwards
źródło
3
Tak i nie. Całkowicie zależy od sytuacji.
Zavior
1
Nie zawsze trudniej jest odczytać kod. Na przykład, gdy implementujesz kod oparty na równaniach matematycznych, zwykle sensowne jest użycie tych samych nazw zmiennych, które są używane w równaniach. (Komentarze wskazują na artykuł / tekst, w którym znajdują się oryginalne równania, lub jeśli jesteś podobny do mnie, czasami
dołączasz

Odpowiedzi:

32

Właściwe nazywanie rzeczy jest trudne. Bardzo trudny. Jeśli spojrzysz na to z innej strony, możesz również wziąć to pod uwagę, że właściwie nazwane rzeczy są ważne. (W przeciwnym razie, dlaczego miałbyś tyle wysiłku nazwać to?)

Ale czasami nazwy rzeczy nie są ważne. Właśnie dlatego mamy takie funkcje jak anonimowe funkcje („lambdas”), na przykład: ponieważ czasami po prostu nie warto nazywać rzeczy.

Istnieje wiele przykładów, w których odpowiednie są jednoliterowe (lub bardzo krótkie) nazwy zmiennych:

  • i, j, k, lO indeksach pętli
  • koraz vdla klucza i wartości na mapie
  • ndla numeru (np. w Math.abs(n))
  • a, b, cO dowolnych obiektów (np max(a, b))
  • edla elementu w ogólnej for eachpętli
  • f dla funkcji w funkcji wyższego rzędu
  • p dla funkcji predykatu w filtrze
  • T, T1, T2, ... dla zmiennych typu
  • E dla zmiennych typu reprezentujących typ elementu kolekcji
  • R dla zmiennej typu reprezentującej typ wyniku funkcji
  • exdla wyjątku w catchklauzuli
  • op do operacji na mapie lub fold
  • dodanie litery w scelu oznaczenia liczby mnogiej, tj. zbioru (np. nsdla zbioru liczb xsi ysdla dwóch dowolnych zbiorów obiektów ogólnych)

Nigdy nie widzę ich używanych w innych językach programowania!

Są bardzo popularne w prawie każdym języku, który znam (i prawdopodobnie także w tych, których nie znam.) Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, nazywasz to.

Jörg W Mittag
źródło
5
-1 Używanie 1-literowych nazw zmiennych jest leniwym programowaniem. Czasami jest dobrze być leniwy, ale jeśli do wstawania ki lindeksów pętli, to jest zbyt daleko (nie powinien mieć, że wielu zagnieżdżonych pętli zacząć; ekstrakt ich funkcji) . Osobiście nigdy nie używam więcej niż jednej 1-literowej zmiennej na funkcję, ale strzelam do 0.
BlueRaja - Danny Pflughoeft
Ponadto, llub lenjest używany dla długości i arrtablicy (np for(var i=0; l=arr.length; i<l; i++).:). Ponadto, fnmogą być stosowane zamiast f, gdy odnoszą się do funkcji.
Ismael Miguel
4
@ BlueRaja-DannyPflughoeft Wolę myśleć o tym jak o wydajnym programowaniu. Jorg prawdopodobnie rozwinąłby się, gdy pojedyncze litery są odpowiednie, nie tylko gdzie, ale szczerze mówiąc, wyobrażam sobie, że większość programistów rysuje linię inaczej. Jeśli chodzi o indeksy pętli, mogę argumentować, że każdy kod, w którym indeksy nie potrzebują nazw o wartości semantycznej, jest wystarczająco prosty, aby uzasadnić wielopoziomowe zagnieżdżanie się nad niepotrzebną ekstrakcją. Mogą być również używane w osobnych pętlach, aby uniknąć możliwych problemów związanych z określaniem zakresu, które porusza Nelson .
Lilienthal
2
@Lilienthal: Kod powinien być wydajny w czytaniu, a nie wydajny w pisaniu. Zwykle są to to samo, ale nie zawsze, jak w tym przypadku.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Nie we wszystkich programach nie, ale nie widzę nic złego w sugestiach Jorga. Jak to ujął Killian : „Nic już nie może uczynić semantyki bardziej oczywistym, ale czytanie zajmuje dużo więcej czasu”. Ale prawdopodobnie jest to w dużej mierze kwestia osobistych preferencji i stylu.
Lilienthal
20

Jeśli twoja pętla nie robi nic, użyj zmiennej do zliczania

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

tak, to najlepsze imię, jakiego możesz użyć. Nic już nie może uczynić semantyki bardziej oczywistym, ale czytanie zajmuje dużo więcej czasu.

Jeśli zmienna jest używana w pętli, przydatna może być znacząca nazwa.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Jeśli twoja zmienna jest używana dla całej metody, jej nazwa powinna być dłuższa; jeśli jest używany w całej klasie, jego nazwa powinna być całkowicie zrozumiała, w przeciwnym razie prawie na pewno zmniejszy przejrzystość twojego kodu.

Krótko mówiąc, im większy zakres zmiennej, tym dłuższa musi być jej nazwa.

Kilian Foth
źródło
Szczerze mówiąc, doszedłem do tego, że nie użyję nazw zmiennych jednej postaci, kropki. Staram się używać nazw, które określają użycie, nawet dla liczników. Zwykle używałbym na przykład zmiennej nazwanej indexpodczas iteracji po tablicy.
Michael
13
@Michael: Moim zdaniem programowanie żargonu jest własnym językiem, nie jest właściwe w języku angielskim. W tym języku ijest właściwe słowo o ściśle określonym znaczeniu, a mianowicie „indeks, o który nie musisz się zbytnio przejmować”. Ale myślę, że to kwestia znajomości. Jeśli dużo Haskell czytać, będziesz przyzwyczajeni czytać mjako monady , fjak funktora , xjak jakiś przedmiot , xsjak listy xs i tak dalej.
Jörg W Mittag
2
To naprawdę ogromne zastrzeżenie. Jednoliterowe nazwy zmiennych są OK tylko wtedy, gdy język ma właściwe zakresy zmiennych. Oczywiście zapytasz: „Jaki język nie ma właściwego zakresu?”. Cóż, zajęło mi trzy godziny, aby dowiedzieć się, że JavaScript nie obejmuje zmiennych w pętli FOR. Wypróbuj to z pętlą for wewnątrz pętli for, używając tej samej nazwy zmiennej. To rozwali twój umysł.
Nelson
@Nelson: To pytanie i ta odpowiedź dotyczą Javy. Oczywiście różne języki mogą mieć nieco inne względy. (JavaScript nie jest tym samym językiem co Java.)
ruakh
Jestem za jednuliterowymi nazwami zmiennych, gdy tylko mają one największy sens, ale nie zgadzam się, że ijest to „najlepsza nazwa, jakiej możesz użyć” dla pętli, która używa zmiennej tylko do zliczania. W takim przypadku wolałbym countużyć nazwy zmiennej: natychmiast zrozumiałej. for (int count = 0; count < 10; count++)lub while (count--).
Todd Lehman,
4

Czytając kod w odpowiedzi Kiliana, nie sądzę, że „istnieje pętla i istnieje zmienna, ma ona typ int i ma nazwę, a nazwa to i, i jest inicjowana na 0,. .. ”. Po prostu myślę „pętla ...”, gdzie trzy kropki oznaczają nieistotne szczegóły, o których nawet nie myślę. W mojej głowie programisty ta zmienna tak naprawdę nie istnieje, to po prostu artefakt, który muszę wpisać, podobnie jak for (;;) {}, co czyni ją pętlą.

Ponieważ ta zmienna nawet nie istnieje w moim umyśle, dlaczego miałbym nadawać jej nazwę poza tym, co jest absolutnie konieczne?

gnasher729
źródło
Powinienem dodać, że w tego rodzaju konstrukcjach często kusi mnie, by nie używać nawet i, ale _dla oczywiście bez znaczenia zmiennej. Ale nie wszyscy znają Prologa i prawdopodobnie spowodowałby więcej uwagi niż to, co usuwa.
Kilian Foth
Należy również rozważyć, jak zmienna jest używana wewnątrz pętli, a nie tylko w for (...)nagłówku.
@KilianFoth: tak też jest używany w Haskell, ML, F # i Scali, jak sądzę. I w Ruby, mimo że _jest legalnym identyfikatorem, jak każda inna, ostatnio zaszła zmiana, że ​​nieużywane zmienne lokalne o nazwie _(lub zaczynające się od _) nie generują ostrzeżenia „nieużywana zmienna lokalna”, mimo że Ruby normalnie o nich ostrzega.
Jörg W Mittag
-1

Jeśli używasz liter i, j, k jako wskaźników w pętli, jest to powszechna praktyka w Javie i innych językach programowania. Chociaż prawdopodobnie lepiej jest użyć pętli dla każdego stylu, na przykład

for(User user: users) {
  doSomethingWithTheUser(user);
}

zamiast

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

W Javie ten styl zapętlania został wprowadzony całkiem niedawno. Być może dlatego częściej zauważasz to w Javie, ponieważ zapętlanie indeksów było najczęstszym sposobem zapętlania tablicy lub listy.

Istnieje kilka innych przypadków, w których pojedyncze litery mogą być odpowiednie, na przykład podczas implementacji funkcji matematycznej, w której pojedyncze litery, takie jak n, x lub y, mogą być już powszechne. Ale ogólnie nie, nazwij swoje zmienne czymś znaczącym.

Nacięcie
źródło
5
„W Javie ten styl zapętlania został wprowadzony całkiem niedawno”… jak przed dekadą? ( Java 5 została wydana w 2004 r. )
meriton
1
Tak, to dość niedawno. Nie, nie jestem stary. Zamknij się. Cholerne dzieci zejdźcie z mojego trawnika. Istnieje jeszcze wiele starszych aplikacji Java od wersji wcześniejszej niż Java 5. I jeszcze więcej programistów Java, którzy nauczyli się języka Java 1.4 i odmawiają aktualizacji, jak to robią. A jeszcze więcej próbek kodu z tego okresu pochodzi z początku 2000 roku (tak, mieliśmy wtedy Internet; właśnie nazwaliśmy go Web 2.0).
Nick