Il sovraccarico del metodo di obiett-c rende sconsigliabile un approccio alla progettazione di "molti piccoli metodi"?


15

In genere preferisco utilizzare metodi di piccole dimensioni, come raccomandato, tra gli altri, da Bob Martin in Clean Code . Ho anche letto abbastanza degli interni di Objective-C per avere almeno qualche idea su come funziona la sua spedizione di messaggi (la serie di bbum è particolarmente istruttiva su questo).

Nonostante le preoccupazioni sull'ottimizzazione precoce, vorrei sapere se tutto quel lavoro che Objective-c fa con objc_msgInvia è, in termini pratici, abbastanza significativo da rendere sconsigliabile l'approccio dei "molti piccoli metodi" per i progetti Objective-C.

I risultati empirici sono particolarmente ben accetti (forse un giorno organizzerò un test da solo). Anche l'esperienza di chiunque abbia scritto grandi progetti con obiettivi-c sarebbe fantastica.

Una precisazione

Il tono generale della domanda è intenzionale. Non sto chiedendo informazioni sull'ottimizzazione delle prestazioni di app specifiche (motivo per cui chiedo qui piuttosto che su SO), ma piuttosto se le caratteristiche del linguaggio di Objective-C scoraggiano un certo approccio progettuale. Ho osservato che gran parte del codice che ho visto da Apple e altre parti (su github ecc.) Tende a metodi (e classi) di grandi dimensioni, e mi chiedo se questo è un pregiudizio che si è insinuato a causa della lingua si. Naturalmente potrei aver letto il codice sbagliato, oppure potrebbero essere fattori culturali piuttosto che tecnici che hanno portato alla tendenza, se esiste.

(Per quello che vale, sto scrivendo Objective-C e sto usando piccoli metodi)

Ulteriore richiesta

Sono d'accordo con entrambe le risposte che sono state fornite. Un'altra cosa che mi piacerebbe è che qualcuno mi indicasse una base di codice Objective-C (o sostanzialmente visibile) open source (o altrimenti visibile) che utilizza simpatici metodi brevi (e piccole classi). Non ho ancora visto nulla in Objective-C da confrontare (ad esempio) con la fonte fitness .


1
Mike Ash ha alcuni bei post che mostrano numeri per Leopard e iOS . Non li ho digeriti completamente, ma sembrerebbe che per gli IMP memorizzati nella cache l'overhead sia trascurabile, e anche nelle spedizioni che richiedono la ricerca, è piuttosto piccolo. Se questa rapida impressione è giusta, sembrerebbe che piccoli metodi potrebbero resistere o cadere sugli stessi motivi di progettazione in ObjC come in qualsiasi altra lingua.
Cris,

1
Se si desidera evitare questo sovraccarico, utilizzare le funzioni C.
bendaggio

Tecnicamente possibile, ma molto è perso con le funzioni. Sostituirei i metodi con funzioni solo per porzioni di codice mirate e sensibili alle prestazioni. Sto chiedendo qui se l'overhead è abbastanza problematico da riconsiderare uno stile di codifica / design preferito.
Cris,

Vedi Costo dell'invio di messaggi in Objective-C su SO per alcune buone risposte.
Caleb,

Perché non semplicemente profilare il codice in Xcode? Capisco che stai chiedendo in astratto e non sul codice specifico, ma dal momento che apparentemente hai del codice con molti piccoli metodi, perché non eseguirlo e vederlo di persona?
Caleb,

Risposte:


4

Non so davvero se l'overhead sia trascurabile o meno. Ma, preferirei di progettare un sistema per essere facilmente comprensibile e mantenibile prima , e che normalmente significa piccolo, metodi e classi focalizzata. Questo aiuterà anche con la successiva ottimizzazione del codice (solo perché il codice è più gestibile). Inoltre, è importante profilare il codice per trovare veri e propri colli di bottiglia, che potrebbero anche non essere correlati al sovraccarico della chiamata del metodo. Se si eseguono operazioni fuori processo (ad es. Chiamate a database, rete, file system), queste tendono comunque a dominare il runtime del programma.

Ma, come al solito, il tuo chilometraggio può variare ...


Ovviamente sono d'accordo con tutto ciò (vedere la domanda "Zio Bob" nella domanda). Ma se un linguaggio non si prestasse in generale a un certo approccio progettuale nel migliore dei casi, i programmatori potrebbero fare altre scelte. Non ho visto molto codice Objective-C che segue davvero i piccoli metodi (e le classi, per quel che riguarda l'approccio), e mi chiedo perché. Aggiungerò una nota alla domanda.
Cris,

@Cris: "Non ho visto molto codice Objective-C che segue davvero i piccoli metodi" -> Solo curioso: da quale corpo di codice hai tratto una conclusione del genere? Ci credo, ma credo anche che non sia a causa della consapevolezza della micro-ottimizzazione, ma più di programmatori che non si concentrano sui principi di una buona progettazione e manutenibilità. In altre parole, il loro Java, C #, Ruby o qualunque altro codice devono seguire le stesse pratiche ...
Jordão,

Sì, è del tutto possibile. Non avevo in mente una base di codici specifica; proprio quello che ho visto nel corso dell'anno o così ho lavorato con Objective-C. La più grande serie di codice che ho visto era roba open source del gruppo Omni e IIRC che aveva molti metodi grandi. Anche il codice di esempio di Apple lo fa spesso. Ma ovviamente (a) il codice di esempio è proprio questo, e (b) il mio campione può essere ponderato in base al codice UI, in particolare per visualizzare i controller e questi possono essere codificati in modo diverso dai livelli più profondi.
Cris,

2

La stragrande maggioranza del codice non sarà critica per le prestazioni in nessuna applicazione, quindi anche se l'overhead del metodo fosse significativo rispetto ad altre lingue, l'approccio ottimale sarebbe comunque quello di avere molti piccoli metodi nella maggior parte dei luoghi e incorporare solo quelli che profilano ha dimostrato di essere critico per le prestazioni.

Certo, ci sono molte persone che non sanno come ottimizzare in modo corretto, e di quelle che alcuni potrebbero conoscere il metodo overhead e impegnarsi in atti di ottimizzazione prematura globale, ma non credo che il gruppo sia abbastanza grande da avere un impatto significativo sull'ecosistema Objective-C.

Metodi e classi di grandi dimensioni hanno molte più probabilità di essere il lavoro di un folto gruppo di persone che non sanno o si preoccupano di profiler, metodi generali o design adeguato e che tenderanno a produrre Big Balls of Mud in qualsiasi lingua. E sì, alcune di queste persone lavorano su basi di codice di alto profilo nelle principali società di software.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.