Często widzę m_
prefiks używany dla zmiennych ( m_World
, m_Sprites
...) w samouczki, przykłady i innego kodu, związanych głównie z rozwojem gry.
Dlaczego ludzie dodają przedrostki m_
do zmiennych?
hungarian-notation
kravemir
źródło
źródło
m_
, ale połowa odpowiedzi tutaj to komentarz na temat tego, dlaczego wszyscy uważają, że ich obecny ulubiony jest najlepszy.Odpowiedzi:
Jest to typowa praktyka programistyczna służąca do definiowania zmiennych, które są zmiennymi składowymi. Więc kiedy używasz ich później, nie musisz widzieć, gdzie są zdefiniowane, aby poznać ich zakres. Jest to również świetne, jeśli znasz już zakres i używasz czegoś takiego jak IntelliSense , możesz zacząć od
m_
i zostanie wyświetlona lista wszystkich zmiennych składowych . Część notacji węgierskiej, patrz część dotycząca zakresu w przykładach tutaj .źródło
m_
.W Clean Code: A Handbook of Agile Software Craftsmanship znajduje się wyraźne zalecenie dotyczące używania tego przedrostka:
Istnieje również przykład (kod w C #) tego:
Zła praktyka:
Dobra praktyka:
Liczymy z konstrukcjami językowymi w odniesieniu do zmiennych składowych w przypadku jawnie dwuznaczności ( tj ,
description
zarejestrował idescription
parametrów)this
.źródło
Jest to powszechna praktyka w C ++. Dzieje się tak, ponieważ w C ++ nie możesz mieć takiej samej nazwy dla funkcji składowej i zmiennej składowej, a funkcje pobierające są często nazywane bez przedrostka „get”.
Stany „m_” dla „członka”. Przedrostek „_” jest również powszechny.
Nie powinieneś go używać w językach programowania, które rozwiązują ten problem przy użyciu różnych konwencji / gramatyki.
źródło
m_
Prefiks jest często używany do zmiennych składowych - Myślę, że jego główną zaletą jest to, że pomaga tworzyć wyraźne rozróżnienie między własności publicznej i prywatnej zmiennej członkiem podkładzie go:Pomocna może być spójna konwencja nazewnictwa dla zmiennych bazowych, a
m_
prefiks jest jednym ze sposobów osiągnięcia tego celu - takim, który działa w językach bez rozróżniania wielkości liter.To, jak przydatne jest to, zależy od języków i narzędzi, których używasz. Nowoczesne IDE z silnymi narzędziami do refaktoryzacji i inteligencją mają mniejsze zapotrzebowanie na takie konwencje i z pewnością nie jest to jedyny sposób na zrobienie tego, ale w każdym przypadku warto mieć świadomość tej praktyki.
źródło
this.
w swoim języku,m_
jest to naprawdę bezużyteczne.m_
ma odróżnić ją od właściwości, której się cofa - tak więcthis.Something
w przypadku właściwości, athis.m_something
w przypadku członka wspierającego. To nie jest konwencja, którą wolę siebie, ale widziałem ją głównie w językach niewrażliwych na wielkość liter (takich jak VB).this.Something
ze względu na majątek ithis.something
wsparcie? Lubthis._something
na podkład?this.m_something
jest zbędny. Używam,_something
aby przypadkowo nie wpisywać go, kiedy idę do pisaniaSomething
, nie ma to nic wspólnego z członkostwem lub nie_
przedrostek wystarczyłby, alem_
taka jest konwencja. Nie jest to taki, którego bym użył osobiście, ale jeśli widzisz to w kodzie, taki był zamysł autora.Jak stwierdzono w innych odpowiedziach,
m_
przedrostek służy do wskazania, że zmienna jest członkiem klasy. Różni się to od notacji węgierskiej, ponieważ nie wskazuje typu zmiennej, ale jej kontekst.Używam
m_
w C ++, ale nie w innych językach, w których „this” lub „self” jest obowiązkowe. Nie lubię, gdy „this->” jest używane w C ++, ponieważ zaśmieca kod.Inna odpowiedź brzmi:
m_dsc
„zła praktyka” i „opis”; to „dobra praktyka”, ale to jest czerwony śledź, ponieważ problem polega na skrócie.Inna odpowiedź mówi, że wpisywanie
this
wyskakuje IntelliSense, ale każde dobre IDE będzie miało klawisz skrótu do wyskakiwania IntelliSense dla bieżących członków klasy.źródło
m_description
vsdescription
.Jak stwierdzono w wielu innych odpowiedziach, m_ jest przedrostkiem oznaczającym zmienne składowe. Jest / był powszechnie używany w świecie C ++ i rozpowszechniany także w innych językach, w tym w Javie.
W nowoczesnym IDE jest to całkowicie zbędne, ponieważ podświetlanie składni pokazuje, które zmienne są lokalne, a które są członkami . Jednak do czasu, gdy podświetlanie składni pojawiło się pod koniec lat 90., konwencja istniała już od wielu lat i była mocno ustalona (przynajmniej w świecie C ++).
Nie wiem, do których tutoriali się odnosisz, ale zgadnę, że używają konwencji z powodu jednego z dwóch czynników:
źródło
Lockheed Martin używa schematu nazewnictwa z trzema prefiksami, z którym wspaniale się pracuje, zwłaszcza podczas czytania kodu innych osób.
Więc...
Weź to za to, co jest warte.
źródło
Aby uzupełnić bieżące odpowiedzi, a pytanie nie jest specyficzne dla języka, niektóre projekty C używają przedrostka
m_
do definiowania zmiennych globalnych, które są specyficzne dla pliku - ig_
dla zmiennych globalnych, których zasięg jest większy niż plik, w którym są zdefiniowane.W tym przypadku zmienne globalne zdefiniowane z przedrostkiem
m_
powinny być zdefiniowane jakostatic
.Zobacz konwencję kodowania EDK2 (implementacja UEFI Open-Source), aby zapoznać się z przykładem projektu korzystającego z tej konwencji.
źródło
Jednym z argumentów, których jeszcze nie widziałem, jest to, że przedrostek taki jak
m_
może być używany do zapobiegania kolizji nazw z makrami#define
„d”.Wyszukiwanie wyrażeń regularnych
#define [a-z][A-Za-z0-9_]*[^(]
w/usr/include/term.h
z curses / ncurses.źródło