Często, gdy składnia języka wymaga, abym nazwał zmienną, która nigdy nie jest używana, nadam jej nazwę _
.
Moim zdaniem zmniejsza to bałagan i pozwala skupić się na znaczących zmiennych w kodzie. Uważam, że jest dyskretny, dlatego wywołuje efekt „poza zasięgiem wzroku, poza zasięgiem umysłu”.
Typowym przykładem tego, co robię, jest nazywanie podkwerend w SQL.
SELECT *
FROM
(
SELECT *
FROM TableA
JOIN TableB
ON TableA.ColumnB = TableB.ColumnB
WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC
Innym przykładem jest zmienna pętli, która nie jest używana.
array = [[] for _ in range(n)] # Defines a list of n empty lists in Python
Używam tej techniki bardzo oszczędnie, tylko wtedy, gdy czuję, że opisowa nazwa nic nie dodaje do kodu, iw pewnym sensie odbiera ją, dodając więcej nazw do zapamiętania. Pod pewnymi względami postrzegam to jako podobne do var
słowa kluczowego w C #, którego również używam oszczędnie.
Moi współpracownicy się nie zgadzają. Mówią, że nawet posiadanie pojedynczej (alfabetycznej) nazwy znaku jest lepsze niż _
.
Czy się mylę? Czy to jest złą praktyką?
źródło
[table].[column]
identyfikatorów, bardzo ułatwia to czytelność[T].[column]
. To oczywiście zależy od scenariusza. Taka mała selekcja jest w porządku, ale jeśli skrypt byłby bardzo duży, mógłbym użyć bardziej opisowych nazw.Odpowiedzi:
Wszystkie imiona powinny mieć znaczenie. Gdyby
_
był dobrze znanym standardem w Twojej firmie lub w szerszej społeczności, miałby znaczenie jako „nazwa, która nie ma znaczenia”. Jeśli nie, powiedziałbym, że to zła praktyka. Używaj opisowej nazwy do tego, do czego się odwołujesz, zwłaszcza że nazwa może mieć znaczenie w przyszłości.źródło
dummy
byłoby dobrze,joined_ab
byłoby lepiej.Powiedziałbym, że jest to dopuszczalna praktyka. Jest to rzadki przypadek, w którym uważam, że większość jest błędna i potrzebuje aktualizacji wiedzy na temat najnowszych pomysłów programistycznych. W wielu językach, szczególnie w językach funkcjonalnych opartych na ML, takich jak Haskell i OCaml, niezwykle często stosuje się je
_
jako „nieużywane” zmienne. Nawet Lua, która nie oferuje wsparcia dla jawnego języka, zachęca do korzystania z niego_
jako symbolu zastępczego zgodnie z konwencją.Kilka języków (Haskell, Lua i DI myślą z góry) również oferuje konwencję, w której zmienne, które prowadzą z podkreśleniem, nie generują ostrzeżeń kompilatora o „nieużywanej zmiennej lokalnej”, co czyni
_
najkrótszą nieużywaną nazwę zmiennej. Możesz użyć czegoś takiego,_unused
ale zgadzam się z tobą, że to po prostu bałagan.źródło
*
w selekcjach jest bardzo złą rzeczą, ponieważ jeśli tabela zmieni się, zestaw wyników również zmieni się nieoczekiwanie. Dlatego zwykle potrzebuję aliasu jednoznakowego do identyfikacji kolumn, które wybieram. Jeśli przestaniesz używać*
, przestaniesz potrzebować „nieużywanej” nazwy._
jest wzorem, a nie zmienną. Jest to subtelna różnica, ale oznacza to, że możesz użyć jej wiele razy w czymś podobnym(x, _, _) = ...
, podczas gdy wielokrotne wiązanie tej samej zmiennej byłoby błędem.W Pythonie
_
jest definitywnie akceptowalny. Może jednak powodować konflikt zgettext
aliasem_()
.Inne częste konwencje
dummy
,unused
; sam lub jako prefiks.Niektóre narzędzia do analizy kodu znają te konwencje i nie wydają nieużywanych ostrzeżeń o zmiennych:
_
lubdummy
_
,unused
lubdummy
źródło
_
zmiennych zastępczych w pythonie będzie kolidowało z_
ostatnią zwróconą wartością. Np. W tłumaczu, jeśli robisz to5*5
na linii 1; wtedy w wierszu 2_
będzie wartość25
. Jeśli jednak ustawiszx,_ = (3,'not used')
, przekonasz się, że_
jest to teraznot used
zamiast ostatniej zwróconej wartości do ciebiedel _
. Prawdopodobnie nie powinieneś używać_
ostatnio zwracanej wartości w prawdziwym kodzie; ale często przydaje się w tłumaczu podczas wypróbowywania nowych rzeczy._
ponieważ ostatnia zwrócona wartość działa tylko w interaktywnej powłoce.Zależy to od ekosystemu, w którym ten kod będzie żył. Jeśli
_
jest akceptowanym standardem wskazującym „zmienną fikcyjną” / „nieużywaną moc wyjściową”, to należy go trzymać. Jeśli nie, dowiedz się, co to jest i skorzystaj z niego.Niektóre języki programowania (np. Haskell) mają nawet ten „specjalny” identyfikator wbudowany w ich składnię do dokładnie wymienionych celów.
źródło
Ostrożnie, _ ma już pewne znaczenie w niektórych językach
W Pythonie:
Jest też inna wzmianka w PEP 8 (Przewodnik po stylu dla kodu Python):
W C #:
Zwykle służy do oznaczania zmiennych prywatnych, które mają właściwości publiczne / wewnętrzne. Ale w tych czasach praktyka jest ogólnie odrzucana .
W JavaScript:
Istnieje biblioteka o nazwie underscore.js, która używa podkreślenia jako prefiksu niestandardowych rozszerzeń prototypów.
Przykład:
Co prowadzi mnie do mojego punktu. Co jest nie tak z klasycznymi konwencjami zmiennych zastępczych.
Po co używać niestandardowej konwencji, którą niektórzy mogą błędnie interpretować, skoro dostępnych jest już wiele popularnych konwencji?
źródło
Używam do tego „manekina”. Lub „bzdura”, jeśli tylko coś testuję :) Nazwij swoje zmienne, aby opisać, jakie są. Jeśli są to atrapy nieużywane zmienne, nazwij je jako takie.
źródło
Uważam to za złą praktykę, ponieważ
nie powinieneś mieć niewidocznej zmiennej w swoim kodzie. Jeśli uważasz, że powinieneś, powód może być prawdopodobnie omówiony.
język Go używa tego słowa kluczowego, aby wskazać, że żadna zmienna nie jest celem jednego z wielu zwrotów funkcji. Jeśli twój język nie ma wielu zwrotów, nie jest potrzebny. Konwencja nazewnictwa zaszkodzi Ci w dniu, w którym będziesz używać języka, używając _ jako standardowej notacji językowej.
(Nie znam Pythona: czy ten konstrukt jest naprawdę potrzebny?)
źródło
let (a,b,_) = f(x,y,z)
równie dobrzelet f(x,y,_) = (g(x),h(x),g(y))
, czy cokolwiek innego. - I tak, często przydatne są parametry zastępcze: nie jako jedyna definicja funkcji, ale dla funkcji polimorficznej lub z alternatywnymi definicjami dopasowanymi do wzorca jest to często rzeczą naturalną.Może być poprawny pod względem składniowym i może być OK jako część standardu.
Powiedziawszy to, chciałbym poprosić kogoś o zmianę w recenzji kodu. Nigdy też nie wprowadziłbym go do standardu kodowania i próbowałbym go usunąć z istniejącego. Jest po prostu trudniejszy do odczytania i nie ma wielkiego znaczenia.
źródło
Myślę, że to źle, ponieważ:
1) Trudniej to zobaczyć, ponieważ nie ma wielu pikseli.
2) Jeśli jest więcej niż jeden
_
, skąd wiesz, który? - lub że nowy programista „przestrzegał zasad” i utrzymywał ich wyjątkowo lokalny zasięg?3) Jest to praktyka, która nie jest pomocna. Używanie pojedynczych liter zmiennych to tak stara szkoła (tj. Moje oryginalne wykształcenie!). Zobaczę je ... a potem dodam komentarze, by powiedzieć, co robi kod, a to jest zła praktyka w dzisiejszym świecie. Używam długich nazw zmiennych tak często, jak to możliwe, więc każdy, bez względu na poziom programowania lub znajomość kodu, może po prostu „czytać” prawie jak angielski. Używanie nazw 1-literowych jest niezwykle powszechną praktyką w przypadku starszych kodów i starszych programistów (znowu obejmuje mnie), ale to nie czyni tego w porządku.
źródło
_
jest już używany w zasięgu zewnętrznym; ten zostanie wtedy ukryty (lub cokolwiek zrobi Twój język w takich przypadkach), ale i tak żaden z nich nie zostanie użyty.Aby uniknąć kolizji w przestrzeni nazw i umożliwić debugowanie, w przypadku gdy jedyną wskazówką jest nazwa zmiennej, lepiej nazwać ją „join_ab_unused”.
Zainspirowany przez Birfl.
źródło
Tak, to zła praktyka z dwóch powodów:
źródło
To, co próbujesz zrobić, to napisać w ładniejszej wersji SQL, która nie ma problemu z wymuszeniem wymyślenia nazwy czegoś bezużytecznego.
Podkreślenie jest prawie niewidoczne, więc wygląda na to, że jesteś w tym języku. Gdyby tylko identyfikator mógł być użyty jako identyfikator, byłoby idealnie, prawda?
Ale nie jesteś w innym języku, a to, co robisz, nie jest czystym sposobem na rozszerzenie języka.
źródło
To zależy od języka. W Javie tak, jest to złe i może być niebezpiecznym trendem do dodawania do twojego kodu, głównie dlatego, że narzędzia wykorzystujące odbicie nie radzą sobie zbyt dobrze z podkreśleniami, ponieważ są poza konwencjami nazewnictwa zmiennych Java. W Pythonie jest to również złe, ale nie tak złe. W clojure jest w 100% w porządku, aw rzeczywistości idiomatyczne jest używanie _ jako symboli zastępczych w instrukcji let.
Pamiętaj, że każdy język ma swoją własną składnię i zestaw idiomów, więc musisz oceniać dobre / złe pod względem tych idiomów, a nie w kategoriach bezwzględnych.
źródło
Byłoby źle w perlu, który używa $ _ (a czasami _) jako specjalnej zmiennej.
Ogólnie rzecz biorąc, trzymałbym się z dala od tego tylko dlatego, że _ wydaje się być specyficzną dla języka zmienną. Gdybym zobaczył twój kod, szukałbym w dokumentacji tego, czym był _, dopóki nie zdałem sobie sprawy, że to tylko manekin. Nic złego z DUMMY, $ DUMMY, cokolwiek.
źródło
Unikałbym podkreśleń na początku różnych wersji, chyba że byłeś pewien, że nie wskazują one na coś innego w danym języku lub frameworku, który jest często używany. Na przykład w Pythonie podwójny znak podkreślenia wskazuje na magiczną zmienność. W JQuery i innych bibliotekach JS pojedynczy znak podkreślenia wskazuje na zmienną rezerwową w przypadku zastępowania przestrzeni nazw. Jest to również popularna konwencja nazewnictwa dla plików dołączanych, które z kolei mają tendencję do przenoszenia na kod, który obsługuje zmienne w formie.
źródło