Jestem zwolennikiem dobrze wykonanych przedrostków .
Myślę, że (systemowa) notacja węgierska jest odpowiedzialna za większość „złego rapu”, jaki dostają przedrostki.
Ta notacja jest w dużej mierze bezcelowa w językach silnie typowanych, np. W C ++ "lpsz", aby powiedzieć, że twój łańcuch jest długim wskaźnikiem do łańcucha zakończonego znakiem nul, kiedy: segmentowana architektura jest starożytną historią, łańcuchy C ++ są według zwykłej konwencji wskaźniki zakończone znakiem nul char tablice i nie jest aż tak trudno stwierdzić, że „customerName” to ciąg znaków!
Jednak używam prefiksów, aby określić użycie zmiennej (zasadniczo „Aplikacje węgierskie”, chociaż wolę unikać terminu węgierski, ponieważ ma on złe i niesprawiedliwe skojarzenia z systemem węgierskim), co jest bardzo przydatne i pozwala zaoszczędzić czas i podejście do redukcji błędów .
Używam:
- m dla członków
- c dla stałych / readonlys
- p jak wskaźnik (i pp jak wskaźnik do wskaźnika)
- v dla lotnych
- s dla statycznego
- i dla indeksów i iteratorów
- e dla wydarzeń
Tam, gdzie chcę, aby typ był jasny, używam standardowych sufiksów (np. List, ComboBox itp.).
To sprawia, że programista jest świadomy użycia zmiennej za każdym razem, gdy ją widzi / używa. Prawdopodobnie najważniejszym przypadkiem jest "p" dla wskaźnika (ponieważ użycie zmienia się z var. Na var-> i musisz być dużo bardziej ostrożny ze wskaźnikami - NULL, arytmetyka wskaźników itp.), Ale wszystkie inne są bardzo przydatne.
Na przykład, możesz użyć tej samej nazwy zmiennej na wiele sposobów w jednej funkcji: (tutaj przykład w C ++, ale dotyczy to jednakowo wielu języków)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Możesz zobaczyć tutaj:
- Brak pomyłki między elementem a parametrem
- Brak pomyłki między indeksem / iteratorem a elementami
- Użycie zestawu jasno powiązanych zmiennych (lista pozycji, wskaźnik i indeks), które pozwalają uniknąć wielu pułapek związanych z nazwami rodzajowymi (niejasnymi), takimi jak „liczba”, „indeks”.
- Prefiksy ograniczają pisanie (są krótsze i działają lepiej z automatycznym uzupełnianiem) niż alternatywy, takie jak „itemIndex” i „itemPtr”
Kolejną wielką zaletą iteratorów „iName” jest to, że nigdy nie indeksuję tablicy z niewłaściwym indeksem, a jeśli skopiuję pętlę do innej pętli, nie muszę refaktoryzować jednej ze zmiennych indeksu pętli.
Porównaj ten nierealistycznie prosty przykład:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(co jest trudne do odczytania i często prowadzi do użycia „i” tam, gdzie „j” było zamierzone)
z:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(który jest znacznie bardziej czytelny i eliminuje wszelkie nieporozumienia związane z indeksowaniem. Dzięki funkcji autouzupełniania we współczesnych środowiskach IDE jest to również szybkie i łatwe do wpisania)
Następną korzyścią jest to, że fragmenty kodu nie wymagają żadnego kontekstu do zrozumienia. Mogę skopiować dwa wiersze kodu do wiadomości e-mail lub dokumentu, a każdy, kto czyta ten fragment, może odróżnić wszystkie elementy członkowskie, stałe, wskaźniki, indeksy itp. Nie muszę dodawać „och, i bądź ostrożny, ponieważ „dane” to wskaźnik do wskaźnika ”, ponieważ nazywa się„ ppData ”.
Z tego samego powodu nie muszę odrywać oczu od wiersza kodu, aby go zrozumieć. Nie muszę przeszukiwać kodu, aby dowiedzieć się, czy „dane” są lokalnymi parametrami, składowymi lub stałymi. Nie muszę przesuwać ręki do myszy, więc mogę najechać kursorem na „dane”, a następnie poczekać, aż pojawi się podpowiedź (która czasami nigdy się nie pojawia). Dzięki temu programiści mogą znacznie szybciej czytać i rozumieć kod , ponieważ nie tracą czasu na wyszukiwanie w górę iw dół lub czekanie.
(Jeśli uważasz, że nie tracisz czasu na szukanie w górę iw dół, aby coś rozwiązać, znajdź kod, który napisałeś rok temu i od tamtej pory nie przeglądałeś. Otwórz plik i przeskocz mniej więcej do połowy, nie czytając go. Zobacz, jak daleko możesz przeczytać od tego punktu, zanim nie będziesz wiedział, czy coś jest elementem członkowskim, parametrem lub lokalnym. Teraz przeskocz do innej losowej lokalizacji ... To jest to, co wszyscy robimy przez cały dzień, gdy przechodzimy przez czyjś kod lub próbując zrozumieć, jak wywołać ich funkcję)
Prefiks „m” pozwala również uniknąć brzydkiej i rozwlekłej notacji „to->” (IMHO) oraz niespójności, którą gwarantuje (nawet jeśli jesteś ostrożny, zwykle kończy się to mieszanką „this-> data” i „dane” w tej samej klasie, ponieważ nic nie wymusza spójnej pisowni nazwy).
„ten” zapis ma na celu rozwiązanie niejednoznaczności - ale dlaczego ktoś miałby celowo pisać kod, który może być niejednoznaczny? Niejednoznaczność będzie prowadzić do błędów prędzej czy później. W niektórych językach „this” nie może być używane dla statycznych elementów członkowskich, więc musisz wprowadzić „specjalne przypadki” w swoim stylu kodowania. Wolę mieć jedną, prostą regułę kodowania, która ma zastosowanie wszędzie - wyraźna, jednoznaczna i spójna.
Ostatnią ważną zaletą jest Intellisense i automatyczne uzupełnianie. Spróbuj użyć Intellisense w formularzu Windows, aby znaleźć zdarzenie - musisz przewinąć setki tajemniczych metod klasy bazowej, których nigdy nie będziesz musiał wywoływać, aby znaleźć zdarzenia. Gdyby jednak każde zdarzenie miało przedrostek „e”, byłoby automatycznie wymienione w grupie pod „e”. W ten sposób prefiksowanie działa w celu grupowania członków, stałych, wydarzeń itp. Na liście Intellisense, dzięki czemu znalezienie żądanych nazw jest znacznie szybsze i łatwiejsze. (Zwykle metoda może mieć około 20-50 wartości (lokalne, parametry, składowe, stałe, zdarzenia), które są dostępne w jej zakresie. Ale po wpisaniu prefiksu (chcę teraz użyć indeksu, wpisuję „i. .. ”), mam tylko 2–5 opcji autouzupełniania.„ Dodatkowe wpisywanie ”
Jestem leniwym programistą, a powyższa konwencja oszczędza mi dużo pracy. Potrafię kodować szybciej i popełniam znacznie mniej błędów, ponieważ wiem, jak należy wykorzystać każdą zmienną.
Argumenty przeciw
Więc jakie są wady? Typowe argumenty przeciwko prefiksom to:
„Schematy przedrostków są złe / złe” . Zgadzam się, że "m_lpsz" i im podobne są słabo przemyślane i całkowicie bezużyteczne. Dlatego radziłbym używać dobrze zaprojektowanej notacji zaprojektowanej tak, aby spełniała twoje wymagania, zamiast kopiować coś, co jest nieodpowiednie dla twojego kontekstu. (Użyj odpowiedniego narzędzia do pracy).
„Jeśli zmienię użycie czegoś, muszę zmienić nazwę” . Tak, oczywiście, że tak, o to właśnie chodzi w refaktoryzacji i dlaczego IDE mają narzędzia do refaktoryzacji, które wykonują tę pracę szybko i bezboleśnie. Nawet bez prefiksów zmiana użycia zmiennej prawie na pewno oznacza, że należy zmienić jej nazwę .
„Prefiksy mnie mylą” . Jak każde narzędzie, dopóki nie nauczysz się go używać. Gdy twój mózg przyzwyczai się do wzorców nazewnictwa, automatycznie odfiltruje informacje i nie będziesz mieć nic przeciwko temu, że prefiksy już tam są. Ale musisz solidnie używać takiego schematu przez tydzień lub dwa, zanim naprawdę staniesz się „płynny”. I wtedy wiele osób patrzy na stary kod i zaczyna się zastanawiać, jak sobie radzili bez dobrego schematu prefiksów.
„Mogę po prostu spojrzeć na kod, aby rozwiązać ten problem” . Tak, ale nie musisz tracić czasu na szukanie w innym miejscu kodu lub zapamiętywanie każdego najmniejszego szczegółu, gdy odpowiedź jest natychmiastowa, na której Twoje oko jest już skupione.
(Niektóre z tych informacji) można znaleźć, po prostu czekając na wyświetlenie podpowiedzi w mojej zmiennej . Tak. Tam, gdzie jest to obsługiwane, dla niektórych typów prefiksów, gdy kod kompiluje się bezproblemowo, po odczekaniu możesz przeczytać opis i znaleźć informacje, które prefiks by przekazał natychmiast. Czuję, że prefiks jest prostszym, bardziej niezawodnym i wydajniejszym podejściem.
„To więcej pisania” . Naprawdę? Jeszcze jeden znak? A może tak jest - dzięki narzędziom do automatycznego uzupełniania IDE często ogranicza to pisanie, ponieważ każdy znak prefiksu znacznie zawęża przestrzeń wyszukiwania. Naciśnij "e", a trzy wydarzenia w twojej klasie pojawią się w trybie Intellisense. Naciśnij "c", aby wyświetlić pięć stałych.
„Mogę użyć this->
zamiast m
” . Cóż, tak, możesz. Ale to po prostu dużo brzydszy i bardziej rozwlekły przedrostek! Tyle, że niesie ze sobą dużo większe ryzyko (szczególnie w zespołach), ponieważ dla kompilatora jest opcjonalny , a zatem często jego użycie jest niespójne. m
z drugiej strony jest zwięzła, jasna, jednoznaczna i nie jest opcjonalna, więc przy jej użyciu o wiele trudniej jest popełnić błąd.