Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
ciao a tutti, come passatempo negli ultimi mesi stavo imparando le basi del c++.
forse la domanda può risultare un pò stupida e da noob, ma è giusto per togliermi una curiosità e capire meglio il linguaggio.
stavo dando un occhiata alla oop, ma non capisco quali sono i veri vantaggi che offre.
che vantaggi ha rispetto alle funzioni?
perchè usare la oop?
Il vantaggio principale è che l'essere umano vede tutto come un oggetto, quindi la programmazione ad oggetti è più produttiva, comprensibile(e manutentibile) e il codice è pienamente riutilizzabile(perchè ogni classe dovrebbe essere indipendente).
Ti faccio un esempio, se io volessi fare un gioco in cui alleno una serie di animali, dovrei fare una cosa del genere:
Classe animale:
metodi
-Mangia
-Bevi
-ecc...
variabili
-Salute
-Fame
-ecc...
Poi, grazie all'ereditarietà creerei una(o più) clase figlia di animale:
Classe cane(eredita da Animale):
metodi (ora non c'è bisogno di riscrivere i membri di animale, ma solo di cane)
-Abbaia
-Mordi
-ecc...
variabili
-fedeltà
-aggressività
-ecc...
Altra classe:
Classe gatto(eredita da Animale):
metodi (ora non c'è bisogno di riscrivere i membri di animale, ma solo di gatto)
-Miagola
-Mordi
-ecc...
variabili
-affettuosità
-ecc...
Avrei così creato una base per gestire degli animali. I vantaggi dell'oop non si limitano solo a questo, ma non è il caso di spiegarli tutti qui, quindi ti rimando ad una pagina di wikipedia che spiega in generale cos'è e a che cosa serve tale tecnica di programmazione.
http://it.wikipedia.org/wiki/Programmazione_orientata_agli ...
se al posto della classe animale creo una funzione animale, con una serie di sotto funzioni (metodi) e per rendere pubbliche le variabili usassi i puntatori vedrei comunque il programma come diviso a oggetti.
il tuo esempio diventerebbe così:
funzione cane(eventuali parametri)
-funzione animale(eventuali parametri) (che funge da eredità)
-funzione_abbaia()
-funzione_mordi()
-ecc..
variabili
-fedeltà (o *fedeltà)
-aggressività (o *aggressività)
ecc..
stessa cosa per il gatto.
quello che intendo io è che anche con le funzioni si piò vedere il programma come una serie di oggetti altrettanto manutenibile (se non voglio più il cane mi basta non usare più la sua funzione) e altrettanto comprensibile.
Postato originariamente da wikipedia: La possibilità che le classi derivate implementino in modo differente i metodi e le proprietà dei propri antenati rende possibile che gli oggetti appartenenti a delle sottoclassi di una stessa classe rispondano diversamente alle stesse istruzioni. Ad esempio in una gerarchia in cui le classi Cane e Gatto discendono dalla SuperClasse Animale potremmo avere il metodo mangia() che restituisce la stringa "osso" se eseguito sulla classe Cane e "pesce" se eseguito sulla classe Gatto. I metodi che vengono ridefiniti in una sottoclasse sono detti "polimorfi", in quanto lo stesso metodo si comporta diversamente a seconda del tipo di oggetto su cui è invocato.
in una funzione diventerebbe:
funzione_cane(numero_animale, ecc..){ // numero_animale serve nel caso variabile attacco = morso // volessi avere un altro cane con parametri diversi
variabile cibo = osso
funzione_animale(cibo, attacco, ecc..)
.....
}
No sono molto più comode le classi, con le funzioni dovresti avere molti array di puntatori per simulare le istanze e tutte le altre cose e poi ricordati che le classi non sono funzioni ma sono tipi con cui puoi creare variabili che rappresentano oggatti(cani, gatti o quello che vuoi tu). I vantaggi dell'oop sono difficili da spiegare, però se lo studi e lo utilizzi li capirai da te(e non saprai più separartene).
Tieni anche conto che con la oop viene supportata in maniera intrinsica la relazione "is a" cioè "è un".
Se tu fai un metodo che accetta come parametro un oggetto "Animale" potrai passare Cani, Gatti, Mucche, che verranno automaticamente trattate da Animali quali essi sono.
Il tuo discorso cmq non è del tutto sbagliato, quando si usava solo l'assembler si tendeva a scrivere il codice come fosse strutturato anche se non supportava in maniera intrinsica questa strutturazione, era il programmatore che doveva farsi il mazzo a tenere tutto in ordine.
Stesso discorso per la programmazione strutturata, che in breve si è evoluta in modulare tendendo ad essere orientata agli oggetti, ma anche li c'era un limite del linguaggio, e il programmatore doveva fare artifizi per rendere pulito il software.
Così è nata la OOP, ed è diciamo un punto di svolta, però anche lei non è che rimarrà invariata per sempre, infatti se si osservano complessi progetti e in particolare framework di estensione di alcuni linguaggi (ad esempio rails per ruby, o spring per java) si nota che alcuni principi sviluppati dal programmatore sono ricorrenti e si potrebbero implementare intrinsicamente nel linguaggio stesso.
E' il casso della programmazione orientata agli aspetti ad esempio. Che io sappia ancora nessun linguaggio la implementa ma i grossi progetti "tendono" a questo quindi è facile che sia il post-oop.
P.S se proprio vuoi implementare con la strutturata quel genere di softare invece di creare una funzione animale dovresti usare le strutture
Postato originariamente da manvb.net: I vantaggi dell'oop sono difficili da spiegare, però se lo studi e lo utilizzi li capirai da te
bhè, un occhiata gliela (oddio, si scrive così?) do di certo... se però faccio subito degli accorgimenti per vedere i punti di forza e i punti deboli sarebbe meglio
Testo quotato
Postato originariamente da netarrow:
Tieni anche conto che con la oop viene supportata in maniera intrinsica la relazione "is a" cioè "è un".
Se tu fai un metodo che accetta come parametro un oggetto "Animale" potrai passare Cani, Gatti, Mucche, che verranno automaticamente trattate da Animali quali essi sono.
un metodo che accetta come parametro un oggetto... interessante, non sapevo si potesse fare.
Testo quotato
...
Così è nata la OOP, ed è diciamo un punto di svolta
il problema è che io non riesco a capire qual'è questa svolta, certo, di miglioramenti ce ne sono senz' altro però per ora noto solo piccole cose.
non metto in dubbio che quando la imparerò e utilizzerò potrebbe sembrarmi una rivoluzione, ma per ora (che sò solo i concetti teorici, e nemmeno benissimo) non mi sembra niente di speciale.
Testo quotato
però anche lei non è che rimarrà invariata per sempre, infatti se si osservano complessi progetti e in particolare framework di estensione di alcuni linguaggi (ad esempio rails per ruby, o spring per java) si nota che alcuni principi sviluppati dal programmatore sono ricorrenti e si potrebbero implementare intrinsicamente nel linguaggio stesso.
E' il casso della programmazione orientata agli aspetti ad esempio. Che io sappia ancora nessun linguaggio la implementa ma i grossi progetti "tendono" a questo quindi è facile che sia il post-oop.
bhè, sono ancora un programmatore più che novizio e faccio fatica a pensare a un tipo di programmazione orientata agli aspetti (e non conoscevo nemmeno l'esistenza di rails e spring) però è un bene che ci sia il progresso. mi terrò sicuramente informato sull'arogmento.
Testo quotato
P.S se proprio vuoi implementare con la strutturata quel genere di softare invece di creare una funzione animale dovresti usare le strutture
le strutture, se non vado errato, prevedono il salto incondizionato (goto) e siccome (credo per abbuso di utilizzo) è altamente sconsigliato da usare ho proprio saltato questa possibilità.
un metodo che accetta come parametro un oggetto... interessante, non sapevo si potesse fare.
se sei spiritoso, è la prova che non hai capito proprio niente.
se non sei spiritoso, hai capito ancora meno.
intendevo che accettando a parametro una superclasse puoi passare tutte le classi ereditanti da quella superclassi, implementando l'ereditarietà e il polimorfismo, e queste due sono la svolta (l'incapsulamento c'è già nella strutturata anche se diversamente implementato).
Testo quotato
le strutture, se non vado errato, prevedono il salto incondizionato (goto) e siccome (credo per abbuso di utilizzo) è altamente sconsigliato da usare ho proprio saltato questa possibilità.