Generalnie wolę używać małych metod, zalecanych między innymi przez Boba Martina w Clean Code . Przeczytałem również wystarczająco dużo o wewnętrznych elementach Objective-C, aby mieć przynajmniej pojęcie o tym, jak działa wysyłanie wiadomości ( seria bbums jest szczególnie pouczająca na ten temat).
Niezależnie od przedwczesnej optymalizacji, chciałbym wiedzieć, czy cała ta praca, którą wykonuje Objective-c z objc_msgSend, jest w praktyce wystarczająco znacząca, aby podejście „wiele małych metod” było niewskazane dla projektów Objective-C.
Szczególnie mile widziane są ustalenia empiryczne (może kiedyś sami przygotuję test). Świetne byłoby również doświadczenie każdego, kto napisał duże projekty typu C.
Wyjaśnienie
Ogólny ton pytania jest zamierzony. Nie pytam o dostrajanie wydajności określonych aplikacji (dlatego pytam tutaj, a nie na SO), ale raczej o to, czy cechy językowe Objective-C zniechęcają do określonego podejścia projektowego. Zauważyłem, że znaczna część kodu, który widziałem od Apple, i innych stron (na github itp.) Zmierza w kierunku dużych metod (i klas) i zastanawiam się, czy jest to błąd, który wkradł się z powodu języka samo. Oczywiście mogłem czytać niewłaściwy kod lub mogą to być czynniki kulturowe, a nie techniczne, które doprowadziły do tendencji, jeśli taka istnieje.
(O ile warto, obecnie piszę Objective-C i używam małych metod)
Dalsze zapytanie
Zgadzam się z obydwoma udzielonymi odpowiedziami. Kolejną rzeczą, którą chciałbym, jest to, aby ktoś wskazał mi (miejmy nadzieję, że znaczną) otwartą (lub w inny sposób widoczną) bazę kodu Objective-C, która wykorzystuje ładne krótkie metody (i małe klasy). Nie widziałem jeszcze nic w Objective-C, aby porównać (na przykład) źródło fitnesse .
Odpowiedzi:
Naprawdę nie wiem, czy koszty ogólne są znikome, czy nie. Wolałbym jednak zaprojektować system tak, aby był najpierw zrozumiały i łatwy w utrzymaniu , co zwykle oznacza małe, skoncentrowane metody i klasy. Pomoże to nawet w późniejszym strojeniu kodu (tylko dlatego, że kod jest łatwiejszy w utrzymaniu). Ważne jest również profilowanie kodu, aby znaleźć prawdziwe wąskie gardła, które mogą nawet nie być związane z narzutem wywołania metody. Jeśli wykonujesz jakieś operacje poza procesem (np. Wywołania bazy danych, sieci, systemu plików), i tak mają one tendencję do dominowania w czasie wykonywania programu.
Ale jak zwykle przebieg może się różnić ...
źródło
Zdecydowana większość kodu nie będzie miała krytycznego wpływu na wydajność w żadnej aplikacji, więc nawet jeśli narzut metody byłby znaczny w porównaniu z innymi językami, optymalnym podejściem nadal byłoby posiadanie wielu małych metod w większości miejsc i umieszczanie tylko tych profilujących okazało się mieć krytyczne znaczenie dla wydajności.
Oczywiście jest wiele osób, które nie wiedzą, jak właściwie zoptymalizować, a niektóre z nich mogą wiedzieć o narzutach metod i angażować się w akty globalnej przedwczesnej optymalizacji, ale nie sądzę, że grupa jest wystarczająco duża, aby mieć znaczący wpływ w ekosystemie Objective-C.
Duże metody i klasy są znacznie bardziej prawdopodobne, że będą dziełem dużej grupy ludzi, którzy nie wiedzą ani nie dbają o profilery, narzut metody lub odpowiedni projekt i którzy będą mieli tendencję do tworzenia Big Balls of Mud w dowolnym języku. I tak, niektóre z tych osób pracują nad znanymi bazami kodów w największych firmach programistycznych.
źródło