Zacznę od stwierdzenia, że zacząłem programować w Visual / Real Basic, a potem przeniosłem się na Javę, więc jestem przyzwyczajony do składni kropkowej. Jednak kiedy w końcu przeniosłem się do Objective-C i przyzwyczaiłem się do nawiasów, a potem zobaczyłem wprowadzenie Objective-C 2.0 i jego składni kropkowej, zdałem sobie sprawę, że naprawdę mi się to nie podoba. (dla innych języków jest dobrze, bo tak się toczą).
Mam trzy główne wołowiny ze składnią kropkową w Objective-C:
Wołowina nr 1: To sprawia, że nie jest jasne, dlaczego możesz otrzymywać błędy. Na przykład, jeśli mam wiersz:
something.frame.origin.x = 42;
Wtedy otrzymam błąd kompilatora, ponieważ something
jest to obiekt i nie można użyć struktur obiektu jako lwartości wyrażenia. Jeśli jednak mam:
something.frame.origin.x = 42;
Wtedy to kompiluje dobrze, bo something
jest sama struktura, która ma człon NSRect, a ja mogę użyć jako lvalue.
Gdybym adoptował ten kod, musiałbym poświęcić trochę czasu, próbując dowiedzieć się, co something
to jest. Czy to jest struktura? Czy to przedmiot? Jednak gdy używamy składni nawiasów, jest znacznie jaśniejsza:
[something setFrame:newFrame];
W tym przypadku nie ma absolutnie żadnej dwuznaczności, czy something
jest przedmiotem, czy nie. Wprowadzenie niejednoznaczności to moja wołowina nr 1.
Wołowina nr 2: W języku C składnia kropkowa jest używana do uzyskiwania dostępu do elementów struktur, a nie do wywoływania metod. Programiści mogą przesłonić metody setFoo:
i foo
obiektów, ale nadal mają do nich dostęp za pośrednictwem something.foo
. W mojej głowie, kiedy widzę wyrażenia używające składni kropkowej, spodziewam się, że będą one prostym przypisaniem do ivar. Nie zawsze tak jest. Rozważmy obiekt kontrolera, który pośredniczy w tablicy i widoku tabeli. Gdy zadzwonię , pomyślę: „Aha, metoda. Muszę zobaczyć definicję tej metody, aby upewnić się, że wiem, co ona robi”.myController.contentArray = newArray;
, spodziewałbym się, że zastąpi starą tablicę nową. Jednak pierwotny programista mógł przesłonić setContentArray:
nie tylko ustawienie tablicy, ale także ponowne załadowanie widoku tabeli. Z linii nic nie wskazuje na to zachowanie. Gdybym miał zobaczyć[myController setContentArray:newArray];
Więc myślę, że moje podsumowanie wołowiny # 2 jest takie, że możesz zastąpić znaczenie składni kropki za pomocą niestandardowego kodu.
Wołowina nr 3: Myślę, że wygląda źle. Jako programista Objective-C jestem całkowicie przyzwyczajony do nawiązywania składni, więc czytanie i zobaczenie wierszy i wierszy pięknych nawiasów, a następnie nagłe zerwanie foo.name = newName; foo.size = newSize;
itp. Jest dla mnie nieco rozpraszające. Zdaję sobie sprawę, że niektóre rzeczy wymagają składni kropkowej (struktury C), ale tylko wtedy ich używam.
Oczywiście, jeśli piszesz kod dla siebie, użyj tego, z czym czujesz się komfortowo. Ale jeśli piszesz kod, który planujesz w ramach open source, lub piszesz coś, czego nie spodziewasz się wiecznie utrzymywać, to gorąco zachęcam do używania składni nawiasów. To oczywiście tylko moja opinia.
Najnowszy post na blogu ze składnią kropek: http://weblog.bignerdranch.com/?p=83
Obalenie powyższego postu: http://eschatologist.net/blog/?p=226 (z oryginalnym artykułem na korzyść składni kropek: http://eschatologist.net/blog/?p=160 )