Apprendimento OO per programmatore C [chiuso]

6

Ho programmato professionalmente in C, e solo C, per circa 10 anni in una varietà di ruoli.

Come sarebbe normale aspettarsi, comprendo gli idiomi della lingua abbastanza bene e oltre a ciò anche alcune delle sfumature del design - quali API rendere pubbliche, chi chiama cosa, chi fa cosa, cosa dovrebbe rientrare e così sopra. Sono cresciuto leggendo 'Writing Solid Code', è la prima edizione C, non quella basata su C ++.

Tuttavia, non ho mai programmato mai in una lingua OO. Ora, voglio migrare alla scrittura di applicazioni per iPhone (forse Android), quindi voglio imparare a usare Objective-C e usarlo con un livello di competenza adatto ad un programmatore professionista.

Come faccio a girarmi intorno alle cose OO? Quale sarebbe il tuo suggerimento più piccolo per la lista di lettura.

Esiste un libro che contiene una sorta di esempio di mondo relativamente reale OO design Objective-C?

Inoltre, leggendo quale codice sorgente mi consiglieresti di seguire.

Come imparare il paradigma OO usando Objective-C?

    
posta Holysmoke 09.09.2012 - 21:40
fonte

8 risposte

4

Ho anche imparato la programmazione orientata agli oggetti derivante dalla programmazione procedurale (Pascal e C), così posso capire la difficoltà del passaggio: devi iniziare a pensare in modo diverso, e hai già molta esperienza in un altro paradigma (BTW, Mi piace ancora programmare in modo procedurale di volta in volta.

Oltre a leggere libri specifici per lingua, penso che sarebbe utile leggere un'introduzione generale all'orientamento agli oggetti e alla progettazione orientata agli oggetti .

Ad esempio, ho trovato Modellazione e progettazione orientata agli oggetti molto utile. Il libro non è molto recente, ma i concetti di base dell'orientamento agli oggetti non sono cambiati molto. Inoltre, mi piace questo libro perché si concentra sui concetti di design e solo nei capitoli successivi spiega come mappare questi concetti ai costrutti del linguaggio di programmazione. Inoltre, mostra che un progetto orientato agli oggetti può (anche) essere implementato in linguaggi non orientati agli oggetti (ad es. C) se è necessario.

Quindi, oltre ai libri specifici per Objective-C, raccomanderei una tale lettura agnostica per ottenere idee generali che non siano influenzate da un particolare linguaggio orientato agli oggetti.

    
risposta data 09.09.2012 - 23:16
fonte
5

Passaggio 1: le classi sono strutture con funzioni. È utile mescolare i dati con le funzioni.

Passaggio 2: in una classe si limita la visibilità di funzioni e variabili. Di solito avrete alcune funzioni pubbliche che sono l '"interfaccia" della classe. Il vantaggio di nascondere le cose è che puoi cambiarle senza che l'utente della tua classe debba cambiare. Finché conservi l'interfaccia pubblica, sei pronto. Rende anche più facile per le persone utilizzare la classe in quanto non si confondono nel tentativo di comprendere i dettagli privati e possono concentrarsi sull'interfaccia pubblica.

Passaggio 3: puoi ereditare campi e funzioni da una classe genitore. Questo può aiutare a prevenire alcune duplicazioni tra diversi sottotipi. Puoi anche sostituire la funzionalità delle funzioni ereditate, se lo desideri. L'ereditarietà è una delle funzioni meno utili di OOP, ma è così.

Passaggio 4: il polimorfismo consente di creare software "collegabile". Per aggiungere funzionalità, puoi creare una nuova classe che soddisfi un'interfaccia con le sue funzioni. Si crea la classe e si inserisce una sorta di plug-in. Non si apportano modifiche al codice del flusso di lavoro. Senza OOP avresti molte affermazioni "if-elseif-elseif" nel tuo flusso di lavoro per eseguire azioni diverse per cose diverse. Con OOP quelle se le istruzioni scompaiono perché chiami il metodo del tuo oggetto. La funzione dell'oggetto esegue ciò che ha bisogno di fare polimorficamente.

Ad esempio hai una classe "Motore". Ha figli "DirectXEngine", "OpenGLEngine". Il tuo gioco funziona bene per anni. Poi, 5 anni dopo, qualcuno fa un nuovo motore e tu vuoi sostenerlo nel tuo gioco. Crei una classe "SomeNewEngine" e si inserisce nel tuo videogioco. Supporta completamente il nuovo motore senza modifiche al codice del flusso di lavoro. Tutto quello che dovevi fare era creare una nuova classe. Tutto quello che devi testare (in teoria) è che le funzioni della tua nuova classe soddisfano l'interfaccia. (ma in realtà non è sempre possibile conformare le cose alla stessa interfaccia ...)

Passaggio 5: la comprensione del polimorfismo non è limitata a OOP. È possibile ottenere il comportamento polimorfico dalla programmazione generica. Considera una funzione "aggiungi"

T add(T val1, T val2) {
    return val1 + val2;
}

Funziona sia che passi in float, ints, doubles, stringhe, ecc. Anche se l'implementazione dell'aggiunta di questi tipi è molto diversa. Questo è polimorfismo a livello di codice sorgente. Se pensi all'operatore "+" come un comportamento supportato da tutti i tipi, allora tutti si conformano all'interfaccia "+".

È possibile concettualizzare tutti i comportamenti come funzioni. Che si tratti di una funzione reale o di una sintassi della lingua come +, -,%, ecc.

Fai un ulteriore passo avanti e rimuovi tutta la sintassi dalla lingua. Ora sei al punto in cui ogni funzione che crei è "la lingua". Crei la tua lingua mentre programmi nella tua lingua. Supportate tutti i paradigmi di programmazione ma non siete paradigmi. OOP diventa una definizione irrilevante di alcune tecniche che fanno parte del mondo naturale.

    
risposta data 10.09.2012 - 01:10
fonte
2

Non c'è nulla di intrinsecamente speciale riguardo a un background C (o qualsiasi altro linguaggio di programmazione procedurale) quando si apprende un nuovo paradigma di programmazione. Tranne il fatto che è molto facile attenersi ai vecchi modi per qualsiasi motivo; essere questo fraintendimento dei nuovi concetti, trovandoli stancanti a cui attenersi e così via.

L'unico vero e valido modo è praticare. Naturalmente, per prima cosa devi capire come cosa praticare. Per quanto riguarda un libro, non posso raccomandarne uno a parte consigliarti di dare un'occhiata a ciò che Amazon ha da offrire (leggi l'indice e alcune recensioni almeno). Qualsiasi libro decente dell'Obiettivo-C dovrebbe spiegare i concetti di base riguardanti la programmazione orientata agli oggetti per farti iniziare bene.

Tuttavia, un singolo libro spesso non è sufficiente. Esistono libri dedicati alla programmazione orientata agli oggetti e ai modelli di progettazione, come Modelli di progettazione: elementi di software orientato agli oggetti riutilizzabile (The Gang Of Quattro libri) . Ce ne sono anche molti altri, quindi scegli il tuo preferito tra i cataloghi con cui hai più familiarità.

    
risposta data 09.09.2012 - 22:17
fonte
2

Suggerisco di iniziare esplorando le nuove opzioni fornite dalla lingua. All'inizio sembravano un po 'inutili per me, ma con il tempo tutto è andato al suo posto. Per questo scopo ho usato cplusplus.com e cprogramming.com Avendo coperto (o aggiornato) le nozioni di base è necessario presentarsi con alcune filosofie C ++, che sono molto diverse da C. Ad esempio:

  • usa const o inline invece di macross
  • usa nuovo / elimina invece di malloc / gratuito
  • best practice quando si tratta di eccezioni / costruttori / ecc Per questo scopo raccomando Effective C ++: link

Oltre questo punto, penso che sia meglio trovare un progetto C ++ su cui lavorare. Con il vero lavoro risolverete i problemi reali e acquisirete esperienza, che come già sapete è inestimabile. Buona fortuna:)

    
risposta data 10.09.2012 - 08:43
fonte
2

La programmazione orientata agli oggetti è diversa ma non così diversa. La cosa principale è che è possibile unire stato e funzioni. Questo può essere fatto su una classe di livello oggetto (uno per tipo di oggetto) o a livello di oggetto. Darei un'occhiata ad alcune implementazioni di programmazione orientata agli oggetti per C. Come questo ad esempio:

link

La differenza con un linguaggio di programmazione nativamente orientato agli oggetti sarebbe chiamare Object_method (struct Object * object, args ..) e object.method (args ..), fondamentalmente solo che è possibile aggiungere metodi a una struct che è possibile chiamare sull'oggetto stesso.

Python è un linguaggio semplice per imparare la programmazione orientata agli oggetti in, python è anche abbastanza esplicito sulla variabile "self" che punta all'oggetto stesso. link

OTOH, trovo che la mia piccola esperienza con SmallTalk sia stata la cosa che ha reso davvero facile iniziare con Objective-C. Guardare alcuni esempi di SmallTalk è un ottimo modo per capire perché le cose sono come sono in Objective-C. Python è più facile per afferrare i fondamenti di OO anche se SmallTalk ha un aspetto più magico. link

EDIT: (una volta che hai capito cosa è la programmazione OO)

Darei un'occhiata alla lezione di Stanford sullo sviluppo di iOS disponibile gratuitamente su iTunes. Roba davvero buona e una solida introduzione allo stile accademico alla programmazione iOS. Il primo episodio passa attraverso le basi di Objective-C. link

Quindi vai su: link

    
risposta data 10.09.2012 - 11:58
fonte
1

Copia Apple il più possibile. Le API Objective-C di Apple per iOS sono chiaramente scritte, molto coerenti e fanno buon uso di un certo numero di schemi di progettazione OO. Apple ha anche un ottimo codice di esempio che di solito dimostra il modo idiomatico di fare iOS. Basta essere cauti e controllare le date su qualsiasi codice di esempio scaricato. Alcuni dei progetti di esempio più vecchi utilizzano paradigmi obsoleti.

Questo non ti darà una grande panoramica sulla scrittura del codice OO, ma se il tuo obiettivo è portare i tuoi progetti su iOS, questo ti darà un ottimo inizio nello scrivere un codice iOS buono e pulito.

    
risposta data 10.09.2012 - 05:13
fonte
1

L'obiettivo-C è un linguaggio scritto con una buona API. Ha anche un design innovativo e una metodologia di implementazione, ma soffre di molte limitazioni C che C ++ ha notevolmente migliorato o aggiunto completamente dal nulla.

Esempi notevoli di questo sono:

  • Generics / Template meta programming
  • Cast più sicuro
  • Entrambi stack e heap allocation - NOTA: questo non è qualcosa che C manca tecnicamente, ma Objective-c fa - dove come C ++ ha questa caratteristica. In poche parole, consente solo l'allocazione dell'heap per gli oggetti, dove i tipi primitivi sono solitamente allocati allo stack. Puoi fare l'allocazione dello stack con le strutture in stile C, ma questo è il tuo limite (e per la maggior parte perdi i principali vantaggi di OOP - quindi, puoi anche scrivere in C se segui quella strada - tuttavia, puoi incorporare il codice Objective-C nel codice di stile C)
  • Differenziazione tra ereditarietà / virtualizzazione del metodo protetto pubblico, privato, e
  • La capacità di passare semplicemente e ricevere dai riferimenti.
  • Puntatori intelligenti per facilitare la gestione della memoria.
  • Costruttori e distruttori incorporati che sono applicati più di un semplice standard.
  • Molte altre API e librerie di quante ne esistono nel mondo Objective-C / iOS.

Se la tua attenzione è più rivolta all'apprendimento di iOS rispetto a solo OOP, allora Objective-C è la scelta migliore che potresti davvero fare. Certo, tieni presente che questo ti porterà a concentrarti su altre cose incentrate sulla GUI (come la programmazione basata sugli eventi), che possono o meno essere ciò che vuoi iniziare. C'è anche il lato negativo del fatto che iOS e Objective-C, pur andando di pari passo, sono davvero buoni l'uno per l'altro e non sono pensati per qualcos'altro al di fuori di questo (in termini di prospettiva di un'applicazione).

Se vuoi conoscere OOP da una prospettiva più generale e applicare ciò che hai imparato a qualcosa di più generico e completo (nel senso che puoi prenderlo praticamente ovunque tu vada), vorrei consiglio di imparare C ++ o Java. Java è completamente diverso, semanticamente, di C, ma ha molte caratteristiche al suo interno che C ++ ha.

Non avrai il massimo controllo sul tuo programma, ma se hai bisogno puoi usare JNI (Java Native Interface) per scrivere codice Java che può essere inviato sia al codice C che al codice C ++.

In entrambi i casi, indipendentemente dalla lingua / piattaforma / ambiente che scegli, qualcuno con le tue abilità non dovrebbe avere difficoltà a trovare le basi per farlo. Potrebbe richiedere un po 'di tutto per sink in realtà, dato che hai scritto proceduralmente per così tanto tempo.

I miei due centesimi.

    
risposta data 10.09.2012 - 08:08
fonte
0

Stranamente suggerirei "Perl orientato agli oggetti: una guida completa ai concetti e alle tecniche di programmazione" di Damion Conway.

Vorrei quindi utilizzare Ruby per scrivere alcuni programmi OO.

Il SICP ha anche una sezione di programmazione OO.

La programmazione orientata agli oggetti di apprendimento è diversa dall'apprendimento del C ++. Puoi scrivere una programmazione funzionale molto bella in C ++ e potresti scrivere un programma OO in C. Quindi hai 2 cose per imparare la programmazione in C ++ e OO.

    
risposta data 09.09.2012 - 23:20
fonte

Leggi altre domande sui tag