2010-07-24 13 views
17

Recentemente, ho finito di leggere K & R con i suoi, quasi tutti, esercizi ed esempi. Stavo progettando di passare a "Accelerated C++" che ho trovato Axel Schreiner's book OOP con ANSI-C.Dovrei imparare a implementare OOP in C? Ci sono progetti che usano OOP in C?

Sono incuriosito e voglio impararlo. Ma prima di investire tempo in esso, voglio sapere il valore di implementare l'OOP in C. In modo che possa decidere quanto tempo devo dedicare a questo.

  1. L'implementazione di OOP in C, è davvero utilizzata? O è solo per esercizio mentale?
  2. I loro progetti C esistenti che utilizzano OOP?
  3. Quando è una buona idea utilizzare OOP in C?
  4. Dovrei investire il mio tempo in esso?

Penso che sia appropriato menzionare il mio background qui in modo che voi ragazzi potete guidarmi in un modo migliore. Ho finito la teoria di C, C++, Java e OOP circa un anno fa, ho anche un lavoro. Ma poi il blog Joel's e SO mi hanno fatto capire che mi mancano molte cose. Quindi ho ripreso i libri e ho iniziato a studiarli correttamente.

K & R, C++ accelerato, Algoritmo in C++ e altri libri sono il mio tentativo di migliorare le mie capacità. Non sono nuovo di OOP.
Quindi cosa suggeriresti?

Grazie per il vostro tempo.

+1

Ci sono alcuni veramente grandi risposte qui che ho pienamente d'accordo con! –

risposta

14

OO viene utilizzato in C tutte le volte che è necessario. Generalmente non sono d'accordo con l'opinione che non si può fare OOP in C, non appena si fornisce un insieme di funzioni che operano su un determinato tipo si dispone di OOP. Prendiamo ad esempio, si decide di creare una struttura dati. Se fornisci funzioni per creare, aggiungere, rimuovere e trovare elementi della struttura dati, è OO. In generale, altri linguaggi forniscono zucchero sintattico implicando automaticamente una variabile di istanza e l'ambito in varie proprietà dell'istanza automaticamente.

  1. Per quanto riguarda "è realmente utilizzato", la risposta è sì. Non è per l'esercizio mentale, è un paradigma valido in C.
  2. L'esempio migliore che viene in mente è GObject, utilizzato da GLib, GTK + e molti progetti non correlati a GNOME. GObject fornisce un modo per creare oggetti in C. Tuttavia non è necessario utilizzare il supporto di terze parti per avere OO in C. Molti progetti esistenti ce l'hanno, anche se potrebbe non essere presente nell'interfaccia (una cosa fantastica a mio parere), e utilizzato internamente per vari scopi (pulizia, protezione dei dati, tutte le solite giustificazioni OO).
  3. È consigliabile utilizzare OOP in C ogni volta che si riscontra la necessità di raggruppare comportamenti e/o dati. Quando puoi giustificare la piccola spesa extra sintattica nell'utilizzo dell'interfaccia degli oggetti e il tempo impiegato a non completare la tua soluzione. Non farti sviare.
  4. Non dovresti perdere tempo a imparare OO perché pensi che sia superiore, piuttosto dovrebbe integrare le tue soluzioni future e dovresti aggiungerlo al tuo toolkit. Usalo quando sembra la cosa giusta da fare. Acquisire familiarità con come si fa OO in C, il modo migliore sarebbe quello di fare qualche C++, o esaminare qualsiasi buon progetto che usi un piccolo OO in stile C. Dopo ti sembrerà naturale.
4

Ho avuto esperienza con diversi progetti C avanzati che fanno almeno un po 'uso di OOP. Il più noto è il kernel di Linux.

Il kernel è interamente C (eccetto per pezzi specifici della piattaforma in assembly per interfacce hardware).

Il kernel fa un uso pesante delle strutture con i puntatori di funzione in molti punti. Il primo che viene in mente sono i file system. I driver compilano la struttura file_operations (così come molti altri) con i callback alle loro implementazioni specifiche.

Il kernel inoltre utilizza molto le istruzioni goto che in alcuni contesti possono essere pensate come istruzioni di lancio rudimentali che portano un'etichetta alla fine della funzione per eseguire alcune operazioni di pulizia e di uscita. (Anche se usano anche goto per molto più della semplice gestione degli errori, è anche usato solo per "eccezioni" all'interno di una funzione, non per passarle all'esterno.)

+0

+1 per menzionare il kernel di Linux, un grande esempio, che ho dimenticato di menzionare. –

3

Ci sono persone che dicono che puoi scrivere oggetto codice orientato in qualsiasi lingua, e ci sono anche persone che dicono che puoi scrivere codice orribilmente non strutturato in qualsiasi lingua.

Il linguaggio "OO" reale fornisce una serie di meccanismi per l'implementazione della progettazione OO: i linguaggi hanno concetti integrati per oggetti e/o classi, per incapsulare codice con dati, per ereditarietà e così via. C non ha sostanzialmente nulla di tutto ciò, ma non c'è nulla che ti impedisca di eseguire la programmazione OO in C, date alcune tecniche e autodisciplina (come sicuramente ti dice il tuo libro).

Ma vorresti?

La mia opinione è questa: se stai solo imparando a fare la programmazione OO, potrebbe avere più senso imparare questo mentre è "tenuto per mano" da un linguaggio che già incorpora profondamente i concetti. Un linguaggio ben strutturato, semplice e interattivo sarebbe bello per questo: data una scelta libera, raccomanderei Ruby, Python o Groovy. Dato un linguaggio con la "magia" OO incorporata diventa molto ovvio quando stai facendo cose OO e quando sei solo strutturato, disciplinato e ben organizzato. Ci possono essere anche cose da imparare quando ci si sposta da C ad un'altra lingua: le caratteristiche comuni, le differenze.

Alcune persone consigliano di imparare il C++ come progressione OO naturale da C. Non lo sostengo con tutto il cuore, perché considero il C++ un bullismo piuttosto brutto delle funzionalità di OO su un linguaggio che era già più "pratico" di elegante. Quando si passa dalla programmazione C "standard" alla programmazione OO, penso che un programmatore dovrebbe prendere in considerazione l'idea di allontanarsi dalla manipolazione diretta dei puntatori, ad esempio, e certamente troverei gravoso dover gestire la memoria per i miei dati. I moderni linguaggi OO automatizzano questo in modo che un programmatore abbia più cellule cerebrali rimaste per compiti di livello superiore. L'attrazione del C++, ovviamente, è la velocità non elaborata. Poiché può cadere allo stesso livello di metallo vicino a C, di solito è il "più veloce" dei linguaggi OO.

Tutto ciò detto: se si dispone di un grande progetto in cui la lingua richiesta è C e si desidera utilizzare e praticare le tecniche OO, quindi con tutti i mezzi andare avanti! Altrimenti, potresti trarre vantaggio dall'imparare OO in un ambiente che incoraggia e supporta questo, e forse più tardi tornare a C con la tua conoscenza di OO. Le tecniche insegnate nel libro avranno quindi un senso per te, e sarai in una posizione migliore per decidere se vuoi davvero farlo in C o in un linguaggio OO "reale".

+2

Se stai gestendo la tua memoria in C++, quasi certamente stai sbagliando. Ecco a cosa serve RAII. – Puppy

+0

Devo ammettere che ho perso la cognizione del C++ circa 10 anni fa. Ho "Accelerated C++" di Koenig e Moo sul mio scaffale, e metà del tutto si occupa di come ripulire gli oggetti dopo aver finito con loro. Questo sembra anticipare la 'std :: auto_ptr' della libreria standard, perché l'evidenziazione del testo sembrava essere su come costruire i propri puntatori intelligenti.Ma questi puntatori intelligenti standardizzati eliminano tutto o il massimo potenziale per l'autoscatto con perdita di oggetti? –

+1

+1 per mostrare quanto sia brutto il C++ :) –

6

L'implementazione di OOP in C, è davvero utilizzata? O è solo per esercizio mentale?

Sì, è davvero usato, ma non sorprendentemente, non è così comune come OOP nei linguaggi che sono stati progettati per questo.

I loro progetti C esistenti che utilizzano OOP?

posso ricordare con una coppia:

Quando si è una buona idea usare OOP in C?

Alcuni problemi sono ben modellati da OOP. Le GUI, ad esempio, sono spesso progettate con ereditarietà tra tipi di finestre, usando il polimorfismo per sovrascrivere e specializzare il comportamento.

È necessario utilizzare OOP ogni volta che il problema ha una soluzione OOP bella. Con la nota a piè di pagina che non si dovrebbero incollare 100 linee di codice OOP in un progetto di linea 15000, solo perché è "kewl"! :)

Devo investire il mio tempo in esso?

Questo dipende molto da cosa pensi di fare. Non avrei mai sostenuto di non imparare nulla: è bello avere esposizione su come, perché e quando usarlo. È bello vedere un linguaggio che non è stato progettato per il supporto OOP OOP. Leggete il libro, quindi presumo che abbiate affinità con C e interesse per OOP. Fai un tentativo, magari unisci alcune applicazioni GUI in GTK +. D'altra parte, se stai cercando di diventare il prossimo sviluppatore web di modelli di progettazione, probabilmente non è l'approccio migliore, puoi prendere in considerazione altri linguaggi più focalizzati su quell'area.

Quindi cosa suggeriresti?

Ti suggerisco di utilizzare i migliori strumenti a tua disposizione che si adattino ai problemi che stai cercando di risolvere. Decidi quale problema risolvere. Un'app desktop GUI, un server Web, un gioco, un'utilità della linea cmd ... una volta deciso il problema, sarai in grado di decidere meglio quale tecnologia si adatta allo sviluppo di una soluzione. Ho scoperto che non si può veramente padroneggiare nulla con i "giocattoli", quindi è necessario fare qualcosa di reale.

0

Può essere, ma senza la funzione del tempo di distruzione, chiamate fornite da altri linguaggi OOP, non è così utile. Inoltre, se hai bisogno di OOP, c'è sempre C++, dove il tuo codice è virtualmente istantaneo.

+4

Ma C++ sux .... –

+0

@Matt Joiner: solo se non sai come usarlo. – Puppy

+1

No solo sux se sai come usarlo. Se non lo fai, invece ne sei terrorizzato. Anche se fai schifo, allora pensi che sux. Ma non sono io;) –