2009-12-09 15 views
7

Ciao, sto scrivendo questa domanda perché sono un principiante in ObjC e molti dubbi mi sono venuti in mente quando ho provato a realizzare la mia app di allenamento con i pugni. Il fatto è che ho un forte background in C, ho iniziato a programmare in Java per l'ultimo anno e ho fatto alcuni collage con Smalltalk (lo mencione perché quelli sono i miei riferimenti di programmazione e quelli sono i linguaggi che ho m confronto ObjC con).Troppo stile C nei programmi Objective-C?

Il primo problema che ho riscontrato è che non so dove tracciare una linea tra ObjC e C, per esempio quando si tratta di operazioni matematiche, dovrei usare math.h o c'è un "oggetto- modo "come si può fare in Smalltalk (un numero elevato a 3)? In che modo una persona senza background in C apprende ObjC ?.

Un'altra cosa che non riuscivo a trovare era il protocollo di una raccolta (ho esaminato la documentazione di Framework Framework fornita da Apple). Perché voglio implementare una classe dell'albero di expresion e voglio sapere se ci sono metodi che tutte le collezioni dovrebbero implementare (come in Smalltalk o Java) o devo controllare a mano ogni collezione e vedere se c'è un metodo interessante che la mia nuova collezione dovrebbe avere.

Non so se sono troppo stupido o sto cercando funzionalità che il linguaggio/framework non ha. Voglio programmare in ObjC con lo stile ObjC non pensando in C, Java o Smalltalk.

Scusa se la domanda era troppo lunga.

+0

ObjC è un'estensione di C, continua a cercare ciò di cui hai bisogno prima o poi lo capirai. Se hai domande specifiche, pubblicale. Come sviluppatore di software, trascorrerai la maggior parte del tempo a cercare e studiare le API e a capire come fare le cose, quindi semplicemente la codifica. – stefanB

risposta

3

Il primo problema che ho incontrato è che non so dove tracciare una linea tra objC e C.

La mia regola è quella di utilizzare C ovunque ha senso per voi. Objective-C ha il vantaggio di permetterti di scegliere quando essere procedurale e quando essere orientato agli oggetti. Vai con ciò che si adatta meglio al codice che stai scrivendo.

Un'altra cosa che non ho trovato è stato il protocollo di una collezione [...] Voglio realizzare una classe albero expresion e voglio sapere se ci sono metodi che tutte le collezioni dovrebbero attuare (come in Java) oppure Devo controllare a mano ogni collezione e vedere se c'è un metodo che la mia collezione dovrebbe avere.

A differenza di Java, Objective-C non dispone di un protocollo master per raccolte come l'interfaccia java.util.Collection. Inoltre, non c'è una proliferazione di implementazioni di contenitori specifici come in Java. Tuttavia, questo ti dà la libertà di implementare una collezione in un modo che abbia senso per il tuo codice.

Per la costruzione di una struttura ad albero, è possibile dare un'occhiata a NSTreeNode per vedere se potrebbe essere utile fare leva. (Potrebbe essere più di quanto tu abbia bisogno o desideri, ma potrebbe valerne la pena.)

Per quanto riguarda la tua raccolta personale, ho imparato molto durante la creazione di CHDataStructures.framework e sei libero di usare qualunque cosa ti piaccia da quel codice, o semplicemente dai miei tentativi di creare strutture simili al Cocoa, progettate per integrare le collezioni della Fondazione e operare in modo simile. In bocca al lupo!

+0

Anche se tutte le risposte erano davvero buone, devo sceglierne una. Quindi questa è la risposta che sto scegliendo. Grazie – GuidoMB

11

Utilizzare assolutamente <math.h>. Non è possibile pagare il messaggio inviando un sovraccarico per le funzioni eseguite in 30 cicli. Anche l'overhead di chiamata di funzione sembra piuttosto ripida a quel punto.

Più in generale, utilizzare il massimo o il minimo di stile C come si desidera. Ho visto Objective-C che non era altro che un paio di moduli C incollati insieme con messaggi C oggettivi, e ho visto Objective-C che essenzialmente zero linee di codice senza parentesi quadre. Ho visto un codice bello ed efficace scritto in entrambi i modi. Un buon codice è un buon codice, comunque lo scrivi.

3

Prova ad utilizzare ogni lingua per ciò che è buono a. IMHO, questo includerebbe oggetti Obj-C ma metodi di implementazione del codice simile a C. Quindi usa math.h e il codice C conciso per implementare la logica, ma non esitare a usare le classi Obj-C per organizzare i tuoi più grandi blocchi di funzionalità in qualcosa che abbia senso.

Inoltre, prova a interagire con i framework utilizzando il loro stile in modo da non eseguire l'upstream.

6

In generale, verranno utilizzate le funzioni C per i calcoli numerici. Generalmente usi gli oggetti per la maggior parte delle altre cose. La ragione di ciò è che gli oggetti sono molto più pesanti di un semplice scalare: non c'è alcun vantaggio. Perché mai scrivere [[NSNumber numberWithInteger:1] numberByAddingNumber:[NSNumber numberWithInteger:2]] quando puoi semplicemente scrivere 1+2? Non è solo doloroso da leggere, è molto più lento e non ti guadagna nulla.

D'altra parte, Cocoa dispone di librerie di oggetti ricche per stringhe, matrici, reti e molte altre aree, e l'utilizzo di queste è una grande vittoria.

Sapere cosa c'è - e quindi qual è il modo più semplice per fare qualcosa - è solo una questione di apprendimento. Se pensi che qualcosa dovrebbe essere lì e non riesci a trovarlo, puoi chiedere qui o sulla mailing list Cocoa-Dev di Apple.

Come per un protocollo di raccolta - non ce n'è davvero uno. La cosa più vicina ad esso è il protocollo NSFastEnumeration, che definisce precisamente un metodo: countByEnumeratingWithState:objects:count:. Ciò consente di utilizzare la sintassi for (id someObject in someCollection) per enumerare gli oggetti in una raccolta. Altrimenti, tutte le collezioni definiscono le proprie interfacce indipendenti.

0

Come è stato detto, non esiste un vero protocollo per le classi di raccolta astratta (a parte il protocollo NSFastEnumeration che fornisce la sintassi for(id item in collection) quando implementato), ma ci sono convenzioni da seguire.

L'introduzione di Apple alle linee guida di codifica per il cacao copre alcune di queste e in effetti esiste una sezione sui nomi dei metodi di raccolta che copre i casi generali (sebbene si noti che classi di contenitori generici come NSArray utilizzano il termine "Oggetto" opposto a "Elemento" elencato negli esempi lì - ovvero addObject:, removeObject: e così via).

Seguire i modelli elencati qui (tra gli altri) è in realtà cruciale quando si desidera che le classi siano conformi a KVC, il che consente ad altri utenti di osservare i cambiamenti nelle proprietà dell'oggetto.

Problemi correlati