2012-03-06 21 views
7

W Chapter 2: Meaningful Names Uncle Bob pisze:Objective-C klasa konwencja nazewnictwa vs Wujek Bob

Nie Dodaj nieodpłatnych kontekst

w wyimaginowanej aplikacji o nazwie "Gas Station Deluxe", to jest złe pomysł na prefiks każdej klasy z GDS. Szczerze mówiąc, pracujesz przeciwko swoim narzędziom. Wpisujesz G i naciśnij klawisz zakończenia i są nagradzani listy mil długości każdej klasy w systemie

Właściwie to, co odkryłem podczas moich pierwszych dni z Objective-C, nieco ponad rok temu. Po Jawie było to dość rozczarowujące, ale myślałem, że jestem tylko tym, który denerwuje się tym :) Rozumiem, że książka "Czysty kod" odnosi się do Javy przez większość czasu, a Java ma przestrzenie nazw (pakiety) w przeciwieństwie do Objective-C.

Czy używasz prefiksu 2-3 liter w swoich zajęciach, jeśli tworzysz aplikację, a nie bibliotekę? Co myślisz, czy to zły projekt językowy, "funkcja" językowa czy wujek Bob nie był tutaj?

+1

Być może zainteresuje Cię esej Mike'a Asha na temat stałych stałych z nazwami i funkcji w ObjC (http://www.mikeash.com/pyblog/friday-qa-2011-08-19-namespaced-constants-and- functions.html). –

Odpowiedz

13

Być może kluczowym słowem jest tutaj nieodpłatne. W Objective-C przedrostki służą ważnemu celowi zmniejszenia prawdopodobieństwa kolizji nazw. W innych językach, takich jak Java i C++, istnienie wsparcia dla przestrzeni nazw sprawia, że ​​używanie przedrostków jest nieodpłatne (i naruszenie często cytowanej zasady DRY). W Objective-C prefiksy są jednak znaczące, użyteczne i nie są bezpłatne.

+0

Dzięki. Rozumiem, że prefiksy klasy WHY są uwzględnione w konwencjach kodowania języka. Myślę jednak, że przestrzeń nazw jest znacznie lepszym rozwiązaniem i jest trochę dziwne, że całkiem nowoczesny język ich nie ma. – OgreSwamp

+2

@OgreSwamp Dwie rzeczy do zapamiętania na temat Objective-C to to, że jest tak stary jak C++ (oba pojawiły się w 1983) i że w wielu przypadkach unika funkcji i złożoności i zastępuje je konwencją i stylem. Być może przestrzenie nazw są tak przydatne i byłyby takim ulepszeniem języka, że ​​warto je wprowadzić jako funkcję językową. (Nie sądzę). W każdym razie moim celem nie było wyjaśnienie prefiksów, ale raczej wskazanie, że wskazówka nie oznacza, że ​​prefiksy są złe, tylko że przedrostki są złe, jeśli nie służą celom. – Caleb

0

Osobiście prawie nigdy nie używam prefiksów. Jedynymi wyjątkami są klasy, które są ze sobą w jakiś sposób połączone lub wszystkie powinny być obecne.

Przykład:

Aplikacja kliencka do czatu. Nazwijmy ten czat jako ExampleChat.

Następnie używałbym ECMessage, ECUser, ECRoom itp., Aby łatwo zobaczyć, które klasy powinny być.

Jeśli tworzę niestandardowe komórki dla UITableView, użyłbym prefiksów, aby zachować je wszystkie blisko siebie i nie walczyć z przeszukiwaniem ich na "liście milowej". Przykład:

ECTextMessageCell, ECSoundMessageCell, ECUploadMessageCell, ECJoinOrLeaveMessageCell itp

To moja osobista opinia, która nie może być najlepszym. Ale nadal jest to dla mnie najłatwiejsze.

Nadzieja pomaga

+0

Umieściłbym wszystkie te klasy w przestrzeni nazw lub pod-nazwach 'ExampleChat', na które pozwala język. Prefiksy są użyteczne tylko wtedy, gdy przestrzenie nazw nie są opcją (o czym rozmawiamy). –

+0

Jestem z wami w przypadku języków takich jak target-c, w których nie ma paczek/przestrzeni nazw lub jakiejś podobnej koncepcji dostępnej do strukturyzowania źródła. – GeT

+0

To jest dokładna sytuacja opisana w Czystym kodzie i jest wymieniona jako zła praktyka. Zgadzam się z wujkiem Bobem, ale myślę, że jest to wina składni języka (brak przestrzeni nazw dla klas). – OgreSwamp

0

Więc jeśli nie masz Przestrzenie nazw, konflikty nazw są prawdopodobne. Możesz zauważyć, że w wielu bibliotekach C używają one pewnego rodzaju prefiksu. Sądzę więc, że istnieją dobre powody, by mieć te prefiksy i inne powody, aby tego nie używać. Ale jaki powinien być duży problem z modyfikacją ukończenia, aby po prostu zignorować prefiks wpisywania trzech liter, a nie tylko jednego.

W końcu wydaje mi się, że to kwestia gustu. Sądzę, że ważniejsze byłoby mieć dobre klasy struktur z prefiksami zamiast bałaganu bez prefiksu ...

Nie ma to nic wspólnego z projektowaniem w języku niemieckim IMHO. Był czas, w którym oprogramowanie nie było wszędzie i dlaczego warto marnować dodatkowy wysiłek na przestrzeń nazw? I nadal widzimy, że w dzisiejszych czasach używane są języki bez przestrzeni nazw .....

+0

Objecive-C 3.0 ma około 1 roku życia. Mieli szansę naprawić problem z przestrzeniami nazw, więc argument o dawnych czasach nie działa tutaj IMHO – OgreSwamp

+0

Nie jestem zaznajomiony z "Objective-C 3.0." Czy możesz podać link do niego? –

+0

Przykro mi, to była literówka, 2.0. I popełniłem błąd w tym wieku. To jest około 5 lat temu. W każdym razie nie jest zbyt stary, prawda? :) – OgreSwamp

0

Powiedziałbym, że świat nie jest czarny ani biały.Robię programowanie w Javie, z pakietami i tak, denerwowanie ma prefiks w każdej klasie, a także irytujące i dyskusyjne jest uruchamianie interfejsów z I (podobnie jak .Net używane do tego).

Czasami denerwuje mnie to w celu-c, ale ma pewną legitymację, jeśli nie masz pakietów w swoim języku, ponieważ możesz "budować" sztuczne grupy klas, takie jak "NS", "UI", "MK" i tak dalej w objc i kakao.

+0

Ale to błąd językowy. Co więcej, szanse, że będę miał kolizję nazw z EXMessage, a następnie com.example.Message są milion razy wyższe. – OgreSwamp

+0

Nie jestem pewien, czy możemy oznaczyć to jako błąd, ale raczej cechę lub ograniczenie. Czy brak obiektów i przestrzeni nazw jest błędem językowym w C? Powiedziałbym raczej, że jest to część charakterystyki języka. I jeśli uważamy, że język jest rodzajem instrumentów, to każdy z nich ma swój własny sposób użycia. Niektóre praktyki są ważne, a nawet bardziej pożądane w jednym, ale absolutnie nie ma w innym. – GeT

3

Kusiło mnie, aby zamknąć to pytanie, ale nie sądzę, że widziałem wcześniej podobne pytanie i jest to ważne pytanie. Oto moje raczej niezorganizowane przemyślenia na ten temat.

Wiele języków ma funkcję o nazwie namespaces, gdzie nazwa klasy "w pełni kwalifikowana" jest poprzedzana hierarchiczną serią nazw. Na przykład klasa String w języku Java to odpowiednio java.lang.String, a klasa niestandardowa jest odpowiednio com.whatever.foobar.MyClass.

Niestety, przestrzenie nazw nigdy nie zostały dodane do Objective-C, co oznacza, że ​​symbole Objective-C (nazwy klas, nazwy protokołów i kilka innych typów) nie mogą być umieszczane w przestrzeni nazw nawet przy użyciu Objective-C++ (który ma funkcję przestrzeni nazw dla funkcji, stałych, struktur itp.).

Jedynym rozwiązaniem, które zapobiega kolizji symboli w kodzie wspólnym, jest użycie jakiejś formy wymieszania nazw, aby nazwy unikalnych symboli były niepowtarzalne. W Objective-C konwencja polega na użyciu przedrostka dwóch znaków (czasami ich liczba jest różna) dla wszystkich klas.

Ten wujek Bob jest twitem, który mówi ci, żeby tego nie robić, ponieważ podczas gdy skończysz z programem, który się nie kompiluje, stracisz wszelkie korzyści z przestrzeni nazw, które wciąż oferują prefiksy. Czy Twoja aplikacja używa wtyczek? Musisz przedrostkiem. Czy Twoja aplikacja ma publiczny interfejs API? Musisz przedrostkiem.

Teoretycznie kod w pojedynczej aplikacji, która nigdy nie styka się ze światem zewnętrznym, może obejść się bez prefiksów, ale przykręć go - zachowaj czysto kodowanie i dodaj tam nawet prefiks. Zaoszczędzi ci to później żalu.

0

Oprócz unikania kolizji, jedną z korzyści, jakie daje nazwa przedrostków, jest natychmiastowe zdawanie sobie sprawy z tego, z jakim typem mamy do czynienia. Załóżmy, że następujący kod:

Color c = ...; 
MultiValueMap m = ...; 

Od Rzut oka na kod i biblioteki w zależności od tego, co już używane, te typy mogą być z wielu różnych źródeł. Być może będziesz musiał sprawdzić, które z instrukcji include/import zostało wykonane, aby zrozumieć, co może zrobić typ (np. Chcesz go zmodyfikować, ale brakuje w nim pewnej metody, na którą masz pewność).

W świecie iOS od razu wiadomo, czy jest to UIColor vs. CGColor i zyskuje bezpośredni kontekst.

W przeszłości na konferencji WWDC firma Apple przeprowadzała sesję, w której wyjaśniała konwencje kodowania Cocoa/Objective-C. Wydaje mi się, że wspominają ten aspekt prefiksów nazw, więc możesz chcieć znaleźć jedno z nagrań, które zostały udostępnione. Inni twórcy C (np.Programiści jądra Linuksa) również nie wydają się wysoko myśleć o obszarach nazw C++ (wśród innych funkcji C++) z różnych powodów.

+0

Dzięki Bryant. Ale myślę, że posiadanie UIColor i CGColor w standardowej strukturze jest kolejnym przykładem "złego" projektu. – OgreSwamp

Powiązane problemy