PDA

View Full Version : [C++]Paradigma


Luc@s
02-10-2003, 14:06
Posso usare il C++ con paradigma procedurale o sono obbligato ad usare
l'OOP?
Che controindicazioni ci sono???



Tnk^_^

lovaz
02-10-2003, 14:29
Nessuna controindicazione, in c/c++ puoi fare quello che vuoi :D

Kleidemos
02-10-2003, 14:48
ap

Luc@s
02-10-2003, 14:50
su it.comp.lang.c++ (http://groups.google.it/groups?dq=&hl=it&lr=&ie=UTF-8&threadm=blfc5k%24mus%241%40news.ngi.it&prev=/groups%3Fhl%3Dit%26lr%3D%26ie%3DUTF-8%26group%3Dit.comp.lang.c%252B%252B) il mio 3d(uguale a questo) è combattuto da alcuni che dicono che il c++ procedurale annulli la potenze del C++ altri che dicono che il C++ e migliore come procudale del C.............voi cosa ne pensate?

cionci
02-10-2003, 15:36
Perchè non puoi usare un approccio procedurale ? Che problema c'è ? Puoi anche usarlo in maniera mista procedurale e OOP... Niente lo vieta...chiaramente il C++ è fatto per programmare ad oggetti...

Secondo me fra C99 (le cui novità ho visto ancora poco) mi sembra sicuramente allo stesso livello del C++ sotto il punto di vista della programamzione procedurale...

Kleidemos
02-10-2003, 15:41
Originariamente inviato da cionci
Secondo me fra C99 (le cui novità ho visto ancora poco)

Quali sono??

mjordan
02-10-2003, 18:24
Originariamente inviato da Kleidemos
Quali sono??

http://gcc.gnu.org/gcc-3.3/c99status.html

Per quanto riguarda la programmazione procedurale, è alquanto stupido usare un linguaggio a oggetti senza usare gli oggetti. Sotto questo profilo il C++ è molto incoerente. Java, ad esempio, considera un oggetto anche il programma stesso. Difatti Java e un OO puro, C++ è un ibrido.

Luc@s
02-10-2003, 18:32
return without expression not permitted in
function that returns a value (and vice versa)


Si dice vice versa anche in engl??

P.S: cmq che male c'è a nn usare l'OO?

mjordan
02-10-2003, 18:49
Originariamente inviato da Luc@s
Si dice vice versa anche in engl??

P.S: cmq che male c'è a nn usare l'OO?

Non c'è nulla di male. L'unica cosa che non ho mai visto usare il C++ senza usare gli oggetti nei programmi degni di questo nome, delegando al C laddove gli oggetti non sono necessari.

Kleidemos
02-10-2003, 18:51
ma io L' OOP lo pensavo adatto a DBRMS e a soft complessi...........per progetti normali secondo me è troppo lungo da progettare............smentiscimi se vuoi cmq:D

mjordan
02-10-2003, 18:56
Originariamente inviato da Kleidemos
ma io L' OOP lo pensavo adatto a DBRMS e a soft complessi...........per progetti normali secondo me è troppo lungo da progettare............smentiscimi se vuoi cmq:D

Queste sono opinioni. Per quanto mi riguarda la complessità che si ottiene con l'OOP è puramente teorica. Attualmente esistono software composti da milioni di righe scritti esclusivamente in C.

Kleidemos
02-10-2003, 18:58
e con questo mi vuoi dire che???

mjordan
02-10-2003, 19:02
Originariamente inviato da Kleidemos
e con questo mi vuoi dire che???

Quello che ho scritto nelle F.A.Q. Che la OOP è una tecnica, non una caratteristica di un linguaggio. Quella dei linguaggi OOP come C++/Java è un supporto ad una tecnica.
Certo, magari è una tecnica comoda per scomporre un problema in "pezzi" logici. Ma comunque tutto dipende dalla bontà della progettazione.

/\/\@®¢Ø
02-10-2003, 20:28
Originariamente inviato da mjordan
http://gcc.gnu.org/gcc-3.3/c99status.html

Per quanto riguarda la programmazione procedurale, è alquanto stupido usare un linguaggio a oggetti senza usare gli oggetti. Sotto questo profilo il C++ è molto incoerente. Java, ad esempio, considera un oggetto anche il programma stesso. Difatti Java e un OO puro, C++ è un ibrido.
Secondo me non e' affatto stupido. Alcune cose risultano piu' semplice con un paradigma di programmazione, altre con un altro. Ovviamente con un linguaggio solo ad oggetti non usare gli oggetti e' alquanto stupido :D, ma il C++ supporta anche altri paradigmi e in questo senso e' tutto fuorche' stupido, e non e' nemmeno incoerente in quanto il supporto a diversi paradigmi di programmazione e' stato uno dei suoi obiettivi fin dall'inizio. Penso che sia possibile usare un "C++ procedurale" in modo molto piu' efficace del C, ad esempio grazie ai templates (per parametrizzare liste o alberi), ma molto spesso col C++ si finisce per utilizzare una programmazione mista, dove apparentemente si utilizza un paradigma solo ma "under the hood" saltano fuori anche gli altri ( es.: approccio funzionale con funzioni rappresentate da oggetti che implementano l'operatore ()).

Il prossimo passaggio non centra nulla col topic visto che si riferisce alla FAQ, ma dato che sei tu il curatore (o perlomeno hai aperto il topic) te lo segnalo qui:

Il Java merita un discorso a parte. Esso presenta una sintassi ereditata da Objective-C in primis
e da C++.

Trovo che Java non abbia proprio nulla da spartire con la sintassi Objective-C (e nemmeno dal punto di vista logico, visto che uno e' tipizzato staticamente e l'altro dinamicamente).

C'era anche qualcos'altro che non quadrava, ma ora non ricordo dove, al piu' lo segnalo quando lo ritrovo.

Luc@s
02-10-2003, 20:30
quindi mi dai un po di ragione?

/\/\@®¢Ø
02-10-2003, 20:59
Se con darti ragione intendi dire che puoi usare un "C++ procedurale", certo !
Se trovi che l'idea che vuoi implementare sia rappresentata meglio in forma procedurale, usa questa ! Non sentirti obbligato ad usare l'OOP, usala se e quando ti serve, ed ovviamente vale il vice versa (per inciso: gli inglesi lo usano perche' deriva dal latino ).
Quando hai piu' pratica puoi pure utilizzare differenti paradigmi per differenti aspetti di uno stesso programma ( stando attento pero' a non fare un minestrone !)

Luc@s
02-10-2003, 21:01
tnk per la tua spiegazione.
Tu di solito che paradigma usi???

cionci
02-10-2003, 21:48
Originariamente inviato da Luc@s
Tu di solito che paradigma usi???
Non esiste un "di solito"... Dipende ad quando ti conviene di più l'uno o l'altro...

Ciao /\/\@®¢Ø, quando tempo...

/\/\@®¢Ø
02-10-2003, 22:13
Originariamente inviato da cionci
Non esiste un "di solito"... Dipende ad quando ti conviene di più l'uno o l'altro...

Ciao /\/\@®¢Ø, quando tempo...
Appunto, e' come chiedere "di solito che tipo di problemi affronti" !

Ciao cionci, purtroppo sono sempre in giro e il tempo di collegarsi pochissimo (a parte questa settimana che sono "in ferie")

dOnDa
03-10-2003, 00:05
Originariamente inviato da Luc@s
Si dice vice versa anche in engl??


assolutamente si. si legge vais vrsa

c++ procedurale... mah sprecato.

/\/\@®¢Ø
03-10-2003, 05:41
in che senso sprecato ? :confused:

dOnDa
03-10-2003, 07:38
Originariamente inviato da /\/\@®¢Ø
in che senso sprecato ? :confused:

ma, se usi tutti oggetti risulta tutto molto più bello! :)
è li che si sta andando, per esempio con java (anche se ame non piace).

Insomma mi trovo più comodo ad utilizzare tutti oggettini... altrimenti mi impicco nella procedura e tendo a fare 1000 linee di codice invece di 1000 files... :)

lovaz
03-10-2003, 10:15
La scelta tra oggetti e imperativo si fa in fase di progetto, a seconda delle situazioni, poi lo sapete benissimo che tutto viene tradotto in assembler e in codice macchina ;)

dOnDa
03-10-2003, 10:49
Originariamente inviato da lovaz
La scelta tra oggetti e imperativo si fa in fase di progetto, a seconda delle situazioni, poi lo sapete benissimo che tutto viene tradotto in assembler e in codice macchina ;)

mitico.

mjordan
03-10-2003, 14:04
Originariamente inviato da /\/\@®¢Ø
Trovo che Java non abbia proprio nulla da spartire con la sintassi Objective-C

Tutti sappiamo che i linguaggi moderni per la maggior parte sono considerati C derived.
Tutti sappiamo che C++ è un'OO ibrido mentre Java è un'OO puro. Inoltre tutti sappiamo che in realtà C++ non è un reale superset di C, difatti molte delle cose disponibili in C non sono compilabili come programmi C++. Objective-C, dal suo canto, e' un reale super set. Tutto ciò che è esprimibile in C può essere compilato in Objective-C. Ho sbagliato a scrivere la parola "sintassi", li in effetti non c'entra nulla, comunque il fatto che in Java ci sono molte delle idee che in origine erano solo di C++ e Objective-C è vera e tra le altre cose non è mia invenzione. Lessi un whitepaper di Apple che discuteva la possibilità di wrappare le API di COCOA in Java (e loro motivarono dicendo che era cosa giusta, perchè Java era un linguaggio di programmazione MODERNO ma non avrebbe sconvolto + di tanto il modo di pensare degli utenti COCOA visto che i "modi di pensare" erano i medesimi). Inoltre sul white paper c'era un grafico cronologico sulle "influenze mistiche" fra linguaggi di programmazione. Li valeva la proprieta transitiva :D

Per quanto riguarda il diverbio fra OOP e strutturata pura, potremmo discutere ore senza venirne a capo (e perciò mi astengo dai commenti posteriori a questo post). Quello che volevo dire io è che la OOP, essendo una tecnica, non migliora affatto ciò che si può fare con un computer, piuttosto il modo di come si realizzano determinate cose. In fondo una classe è pur sempre una struttura. E' solo una questione di comodità insomma. Hai citato i template. Indubbiamente una comodità e guai se non ci fossero. Ma tutto quello che può essere realizzato con la OOP può essere realizzato con la programmazione strutturata "pura". Quì per pura si intende senza oggetti, ma anche la OOP è una programmazione strutturata. Tempo fa mi capitò un libro che spiegava in dettaglio questo che sto dicendo io. Se trovo l'URL da dove lo presi, lo posto.
Quando infine dicevo che è meglio non usare la strutturata pura con C++ è semplicemente perchè io ho una visione della programmazione evidentemente differente. Non ho il tipico approccio "per quella cosetta sarebbero comodi i template, scrivo tutto in C++". Nel mio modo di vedere (opinabile, ci mancherebbe) ognuno ha il suo compito. Considero anche il fatto, per esempio, che un compilatore C++ è indubbiamente meno maturo di uno C (basta leggere una paginetta che descriva lo "status" di un compilatore C++ in via di sviluppo per rendersi conto di quante cose mancano ancora da implementare), considero che uno C++ è innegabilmente basato su uno C, considero che un compilatore C++ ci mette il doppio di uno C a compilare del codice, considero che l'uso degli oggetti introducono un notevole overhead ingiustificato quando si parla di cose semplici, considero che il codice generato è molto + difficile da ottimizzare per un compilatore. Mi piace considerare che non è affatto indispensabile C++ quando devo programmare una lista perchè mi viene da capire che se anche una classe sia un buon modo di rappresentarla, essa è una comodità che non paga l'uso del C++ rispetto al C. Nel mio modo di vedere, l'OOP si rende necessaria laddove sia necessario l'utilizzo di uno strumento CASE. Nulla di più, nulla di meno. Interpretala come la frase "no CASE, no OOP" :D

Potrebbero essere punti di vista considerati assai estremisti per alcuni. Eppure, provati sulla mia pelle, mi hanno spinto oltre. Mi hanno spinto dalla condizione "conosco un linguaggio" alla condizione "so programmare qualcosa che fa qualcosa e non è stupido". Mi hanno dato la forza di riuscire a staccarmi da un'intera API quando di quella API avevo bisogno di una sola funzione. Non ho mai studiato la OOP studiando un linguaggio OOP insomma. E di questo ne vado fiero e soddisfatto, perchè ora, quando devo aprire un libro per studiare un nuovo linguaggio del prossimo futuro, diventa soltanto una questione di aggiornamento sintattico (a parte quello di imparare i nomi delle API moderne, dove il metodo + breve è una stringa da 1500 caratteri con notazione a cammello :D). Anche studiare un altro linguaggio diventa cosa rara. Ci si rende conto di come oltre a C/C++/Java non sia stato prodotto nient'altro per cui vale la pena impiegare corteccia cerebrale. C'è chi è ancora + estremista di me. Non ricordo dove, ma sulle istruzioni di un noto programma di sviluppo GNU c'era scritto:"Write in C. Other languages are unnecessary." Evidentemente c'è ancora chi è tanto brillante da considerare il CASE come un'inutile perdita di tempo. :D

Luc@s
03-10-2003, 15:29
cazzo quanto ti stimo:eek:
Ottimo post, da incorniciare.

/\/\@®¢Ø
03-10-2003, 20:21
Originariamente inviato da mjordan
Tutti sappiamo che i linguaggi moderni per la maggior parte sono considerati C derived.
Tutti sappiamo che C++ è un'OO ibrido mentre Java è un'OO puro. Inoltre tutti sappiamo che in realtà C++ non è un reale superset di C, difatti molte delle cose disponibili in C non sono compilabili come programmi C++. Objective-C, dal suo canto, e' un reale super set. Tutto ciò che è esprimibile in C può essere compilato in Objective-C. Ho sbagliato a scrivere la parola "sintassi", li in effetti non c'entra nulla, comunque il fatto che in Java ci sono molte delle idee che in origine erano solo di C++ e Objective-C è vera e tra le altre cose non è mia invenzione.

Non vale, mi stai girando le carte in tavola :p.
Sull'ultima frase ti do ragione, e non mi sembra di avere mai detto il contrario.


Per quanto riguarda il diverbio fra OOP e strutturata pura, potremmo discutere ore senza venirne a capo (e perciò mi astengo dai commenti posteriori a questo post). Quello che volevo dire io è che la OOP, essendo una tecnica, non migliora affatto ciò che si può fare con un computer, piuttosto il modo di come si realizzano determinate cose. In fondo una classe è pur sempre una struttura. E' solo una questione di comodità insomma. Hai citato i template. Indubbiamente una comodità e guai se non ci fossero. Ma tutto quello che può essere realizzato con la OOP può essere realizzato con la programmazione strutturata "pura". Quì per pura si intende senza oggetti, ma anche la OOP è una programmazione strutturata. Tempo fa mi capitò un libro che spiegava in dettaglio questo che sto dicendo io. Se trovo l'URL da dove lo presi, lo posto.

Anche su questo sono d'accordo, e mi sono espresso piu' o meno sulla stessa lunghezza d'onda tempo fa (anche se io darei molta piu' importanza al "come", visto i vantaggi in termini di tempo e solidita' del codice che puo' portare).


Quando infine dicevo che è meglio non usare la strutturata pura con C++ è semplicemente perchè io ho una visione della programmazione evidentemente differente. Non ho il tipico approccio "per quella cosetta sarebbero comodi i template, scrivo tutto in C++".

Ma questo vale per qualsiasi aspetto ("per quella cosetta sarebbero comodi gli oggetti etc." :D ). Quando si sceglie il linguaggio da adottare per un progetto si tengono in considerazione i vari aspetti e si decide quali sono piu' importanti. ( Anche se non resisto dal dire che il C++ ha il vantaggio che si puo' dire "per A sarebbero comodi gli oggetti per B i template, per C un approccio funzionale... facciamo tutto in C++" :D :p)


Nel mio modo di vedere (opinabile, ci mancherebbe) ognuno ha il suo compito. Considero anche il fatto, per esempio, che un compilatore C++ è indubbiamente meno maturo di uno C (basta leggere una paginetta che descriva lo "status" di un compilatore C++ in via di sviluppo per rendersi conto di quante cose mancano ancora da implementare), considero che uno C++ è innegabilmente basato su uno C, considero che un compilatore C++ ci mette il doppio di uno C a compilare del codice, considero che l'uso degli oggetti introducono un notevole overhead ingiustificato quando si parla di cose semplici, considero che il codice generato è molto + difficile da ottimizzare per un compilatore.

Se stiamo ancora parlando di quando e' possibile utilizzare il C++ come un "C diverso" (nel senso non a oggetti) quello che dici non e' totalmente vero; l'immaturita' del compilatore oramai e' evidente solo negli aspetti piu' esoterici del linguaggio (se vuoi puoi metterci dentro alcuni la gestione dei templates, probabilmente il motivo fondamentale della lentezza della compilazione di cui parli).
Il fatto che il codice generato sia piu' difficile da ottimizzare e' falso. Nell'uso generale ad esempio le stringhe del C++ sono piu' efficienti di quelle del C (si trovano dei test sulla rete, ma non ho sottomano il link), inoltre l'uso dei template permette ottimizzazioni grazie al fatto che sapendo i tipi in questione il compilatore puo' fare maggiori assunzioni, oppure sfruttare specializzazioni particolari (ad esempio un vector di booleani che per risparmiare spazio impacchetta i bool in bit in modo trasparente all'utente). Altre possibili ottimizzazioni derivano dal fatto che si possono utilizzare oggetti funzione (tipi noti a compilazione) come parametri di certe operazioni (ad esempio trasformazioni su liste) invece che puntatori a funzione.
Se poi invece a uno piace l'esoterico (a me solo un po' , ma c'e' gente piu' malata in giro per la rete :D), si puo' far fare parte della elaborazione direttamente a tempo di compilazione con metaprogrammazione template :D.


Mi piace considerare che non è affatto indispensabile C++ quando devo programmare una lista perchè mi viene da capire che se anche una classe sia un buon modo di rappresentarla, essa è una comodità che non paga l'uso del C++ rispetto al C.

La bonta' delle liste del C++ non dipende affatto dal fatto che e' rappresentata da un oggetto. Semmai dipende dal fatto che e' parametrica e che grazie agli iteratori posso cambiarla impunemente con un vettore o un semplice array (quando al cosa ha senso ovviamente).


Nel mio modo di vedere, l'OOP si rende necessaria laddove sia necessario l'utilizzo di uno strumento CASE. Nulla di più, nulla di meno. Interpretala come la frase "no CASE, no OOP" :D

Forse nel caso dei linguaggi puri come il Java hai ragione, ma trovo che nel caso degli ibridi il discorso sia piu' complesso.
Nel caso del C++ ad esempio e' difficile non utilizzare gli oggetti, o se si preferisce e' possibile fare una programmazione non orientata agli oggetti pur utilizzando (in modo esplicito) gli oggetti.
In altri termini gli oggetti sono il mattone utilizzato per estendere il linguaggio in modo non previsto direttamente dalle specifiche (ad esempio per una programmazione funzionale con funzioni come dati).