Come le funzioni statiche sono migliori dei metodi di classe in Objective-C [chiuso]

2

Stavo passando attraverso questo post di Mattt Thompson in cui menziona che

Static functions are nicer than shoe-horned class methods

Semplicemente non vedo alcun difetto con i metodi Class in Objective-C e non potrei collegarlo alle funzioni statiche basate su C. Ha qualcosa a che fare con il fatto che le classi Objective-C sono esse stesse oggetti di metaclassi?

    
posta Evol Gate 13.02.2015 - 13:12
fonte

1 risposta

6

Alcune lingue come Java hanno "metodi statici" che vivono nello spazio dei nomi di una classe, ma non usano la spedizione dinamica. Invece, vengono inviati staticamente al momento della compilazione (da cui il loro nome). La spedizione dinamica è meno efficiente di quella statica, dal momento che dobbiamo cercare il metodo in tutte le classi dell'oggetto su cui stiamo chiamando un metodo. Un punto centrale di OOP è che non conosciamo la classe dell'oggetto che chiameremo metodi a priori.

In Java, le proprietà dei metodi statici ne fanno un buon candidato in due casi d'uso:

  • "Metodi di classe" (che Java non ha), ad es. qualche costruttore con un'interfaccia migliore. Questi sono problematici in Java poiché i metodi statici non possono essere ereditati e le classi non possono essere passate come oggetti. Il risultato è spesso un oggetto Factory extra.

    L'Objective-C può usare metodi di classe reale in questi casi, il che è una buona flessibilità. Dopotutto, Objective-C ha un protocollo metaobject e le classi sono .

  • Chiamate di metodo a basso costo. Poiché la chiamata di un metodo inviato staticamente è molto più economico rispetto al richiamo di un metodo inviato dinamicamente su un oggetto, è possibile utilizzare metodi statici per ottimizzare il codice.

    Poiché Objective-C si basa sul linguaggio C, possiamo sempre usare semplici vecchie funzioni C. C non ha dispatch dinamico e le chiamate di funzione sono molto efficienti. Tuttavia, C non ha concetti di classi e spazi dei nomi, quindi è necessario prestare molta attenzione per evitare conflitti di nomi.

Il paradigma orientato agli oggetti risulta essere molto efficace nell'incapsulare la complessità. Anche se ciò semplifica la progettazione dei sistemi, rende anche più difficile ragionare sulle prestazioni.

Il punto del post che hai menzionato sembra essere che usare il sottoinsieme C di Objective-C (cioè le caratteristiche procedurali) può essere una buona idea, dato che contiene un paio di caratteristiche sensibili delle parti orientate agli oggetti dell'Obiettivo -C non ti darà. La frase "Le funzioni statiche sono più belle dei metodi di classe con le corna di scarpe" è probabile che significhi che se si ha una funzione che non deve essere un metodo di istanza, usare una funzione C è probabilmente una buona - e sicuramente più performante - soluzione di metterlo in un metodo di classe (che mancherebbe anche il punto di classi-come-oggetti).

    
risposta data 13.02.2015 - 13:46
fonte

Leggi altre domande sui tag