Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-03-2009, 20:05   #1
javaboy
Registered User
 
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
[Vari] Critica alla programmazione ad oggetti.

Vi propongo un articolo interessante di Joe Armstrong (l'autore del linguaggio funzionale Erlang) che critica aspramente la programmazione ad oggetti.
http://www.sics.se/~joe/bluetail/vol1/v1_oo.html

Che ne pensate?
javaboy è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 20:43   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Vabbé, ma che t'aspettavi da uno che ha scritto un linguaggio puramente funzionale?

Bullshits.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 21:00   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Objects bind functions and data structures together in indivisible units. I think this is a fundamental error since functions and data structures belong in totally different worlds.
Chi diamine lo ha detto?

Quote:
So I can't find all the data type definition in one place.
Si chiama incapsulamento ed è uno dei principali vantaggi dei linguaggi OO.

Quote:
In an OOPL I have to choose some base object in which I will define the ubiquitous data structure
unicamente se non hai capito nulla dell'OO
Quote:
Reason 1 - It was thought to be easy to learn.
Reason 2 - It was thought to make code reuse easier.
Reason 3 - It was hyped.
Reason 4 - It created a new software industry.
I see no evidence of 1 and 2
La 1 e la 2 la vedo ovunque, in qualsiasi SDK mi sia stato dato usare. Non solo, la 2 con l'OOP ha una cifra di nuove possibilità.

In finale mi sembra il rant di uno che l'OO non ha manco capito da che parte si guarda, e fortuna che ha scritto un linguaggio.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 22:12   #4
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Deve essere un po' frustrato perché dopo venti anni di sviluppo il suo linguaggio non ha ancora avuto il successo che sperava mentre la programmazione ad oggetti ha semplicemente conquistato tutti.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 22:40   #5
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Ma la domanda è: in quale secolo ha iniziato a scrivere questo linguaggio?

Ecco i traumi che ti segnano per tutta la vita. Stai chiuso in una cantina a pane e acqua a programmare per due secoli, e quando esci scopri che c'è una cosa chiamata OO e non potendola uccidere se la prende con chiunque abbia anche una sola O nel proprio nome
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 22:48   #6
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da ~FullSyst3m~ Guarda i messaggi
Ma la domanda è: in quale secolo ha iniziato a scrivere questo linguaggio?
Fine ani ottanta. Quindi tecnicamente ha cominciato lo scorso millennio
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 22:55   #7
~FullSyst3m~
Senior Member
 
L'Avatar di ~FullSyst3m~
 
Iscritto dal: Mar 2007
Messaggi: 4683
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
Fine ani ottanta. Quindi tecnicamente ha cominciato lo scorso millennio
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito.
~FullSyst3m~ è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 23:02   #8
javaboy
Registered User
 
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
Non sono d'accordo con quando ha scritto Armstrong anche se penso che i linguaggi funzionali meriterebbero maggior spazio.
Erlang in particolare sembra molto interessante sopratutto per la programmazione concorrente.
Facebook per la sua chat ha utilizzato appunto erlang e sono stati effettuati dei test in cui Yaws (web server scritto in erlang) ha surclassato apache.
http://www.sics.se/~joe/apachevsyaws.html

Ci sono anche dei framework per il web in erlang:
http://erlyweb.org/
javaboy è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 23:17   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Riguardo all'ultimo link: non dimostra certo che un linguaggio funzionale è migliore degli altri...al massimo dimostra che yaws sotto questo aspetto è migliore di Apache.
Magari quel test è stato creato appositamente per mettere in difficoltà Apache...è un po' strano come test...la richiesta GET viene inviata un carattere al secondo...quando mai succede ? Al massimo è un attacco DOS per Apache.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 23:43   #10
javaboy
Registered User
 
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
Quote:
Originariamente inviato da cionci Guarda i messaggi
Riguardo all'ultimo link: non dimostra certo che un linguaggio funzionale è migliore degli altri...al massimo dimostra che yaws sotto questo aspetto è migliore di Apache.
Magari quel test è stato creato appositamente per mettere in difficoltà Apache...è un po' strano come test...la richiesta GET viene inviata un carattere al secondo...quando mai succede ? Al massimo è un attacco DOS per Apache.
Sono d'accordo sul fatto che il test sia un pò strano ma penso che l'ottimo risultato di yaws sia dovuto al modello di gestione dei processi di Erlang, non a YAWS.
Ecco qualche articolo interessante:
http://queue.acm.org/detail.cfm?id=1454463
http://gigaom.com/2007/12/19/erlang-...-20-years-old/
javaboy è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 23:49   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ma facciamo un test di carico serio e vediamo se la differenza sta ancora in questi termini, andando a vedere il tempo medio di esecuzione delle richieste.

Sicuramente l'unica cosa che suggerisce quel test è un modo per fare un DDoS ad Apache
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2009, 23:57   #12
javaboy
Registered User
 
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
Quote:
Originariamente inviato da cionci Guarda i messaggi
Ma facciamo un test di carico serio e vediamo se la differenza sta ancora in questi termini, andando a vedere il tempo medio di esecuzione delle richieste.
Non c'è bisogno di farlo! Sappiamo entrambi la risposta.
Ciò non toglie che Erlang sia interessante sotto alcuni aspetti.

Ecco cosa ne pensano gli sviluppatori di facebook:
http://www.facebook.com/notes.php?id=9445547199

The channel servers are the most intricate piece of the backend. They're responsible for queuing a given user's messages and pushing them to their web browser via HTTP. We made an early decision to write the channel servers in Erlang. The language itself has many pros and cons, but we chose Erlang to power Chat because its model lends itself well to concurrent, distributed, and robust programming. It's easy to model our millions of concurrent users with a few lightweight processes each, where the same tactic in, say, C++ would have been more daunting. Programming languages are always a tradeoff; Erlang makes some hard things easy but, unfortunately, some easy things hard.
javaboy è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 05:47   #13
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da javaboy Guarda i messaggi
Vi propongo un articolo interessante di Joe Armstrong (l'autore del linguaggio funzionale Erlang) che critica aspramente la programmazione ad oggetti.
http://www.sics.se/~joe/bluetail/vol1/v1_oo.html

Che ne pensate?
Ne penso bene, mi trovo fondamentalmente d'accordo. E' forse un po' tiepido.

Penso che attualmente la programmazione ad oggetti sia ultra utilizzata (spesso a sproposito) e che sia ritenuta il non-plus-ultra. Non sono cosi' intelligente per poter fornire un'alternativa, ma sono sicuro che un'alternativa migliore esista. E se non esiste, i tempi sono maturi per trovarla.

D'altronde, la scienza (anche l'informatica) e' sempre progredita mettendo in discussione (spesso asserendo addirittura il contrario) i principi che venivano ritenuti assodati, no?

Forse l'articolo riporta troppo poche motivazioni. E' facile trovare altre motivazioni sul fatto che la programmazione ad oggetti abbia dei limiti e che sia ora di trovare qualcosa di meglio:

1 - result = sin(a) * b + c;
result = Math.Add (Math.Times (Math.Trig.sin(a), b), c);
Quale dei due e' piu' semplice? (NOTA - So benissimo che in C++/Java/... posso scrivere entrambe, e' un esempio per rendere l'idea). Quale delle due e' da considerarsi object-oriented?

2 - In questo forum vengono molto frequentemente postati dei messaggi di persone che vogliono imparare a programmare.
Sintetizzando, le risposte sono del tipo: "Impara a programmare con le procedure e poi passa alle classi".
Perche'? Sempre nelle stesse risposte si dice che la programmazione ad oggetti e' piu' naturale! Allora, perche' non si parte ad imparare le basi della programmazione ad oggetti, lasciando per ultima la programmazione piu' difficile?

3 - Quando si usano i linguaggi ad oggetti, si tende a modellare tutto con classi, cioe' "proprieta'" e "metodi" o "messaggi". Questo e' piu' naturale?
Per esempio:

Bicchiere bicchiere;
bicchiere.riempi (acqua);

Cosa c'e' di naturale di un bicchiere che si auto-riempie di acqua? NOTA - non e' un esempio forzato, succede tantissime volte in tutti i software che mi e' capitato di vedere in 20 anni di programmazione: gli oggetti che subiscono l'azione diventano gli attori della stessa.

Comunque, se si preferisce:
Bicchiere bicchiere;
Acqua acqua;
acqua.riempi (bicchiere);
Sembra piu' naturale? Meno male che l'acqua ha un metodo per riempire il bicchiere


4 - Perche' lo stesso bicchiere deve ereditare dalla classe Oggetti? E dalla classe Vetro? Cosa c'e' di naturale in questo? Perche' mi devo portare dietro dei "Metodi/Messaggi" che non mi serviranno a niente, visto che il mio programma usera' il bicchiere per bere l'acqua?

5 - La OOP funziona bene quando e' chiaro cosa deve FARE la classe. Assume che la classe sia un modello di qualcosa che l'utente della stessa conosce gia', nella realta'.
Per esempio, ho appena trovato una classe (in un software scritto da altri) di questo tipo:

class ModelizePlantWithEdgerWithoutL3System: public ModelizePlantWithEdgerOnDownstream
{
....
};

Ritengo di essere del settore (a cui questo software si riferisce), ma credetemi o meno non so come usare la classe!!
Riassumendo: se scrivi una classe che si chiama complex_number probabilmente tutti riescono ad usarla. Quando le cose diventano piu' complesse, siccome la classe si basa sulla conoscenza personale (del singolo programmatore) utilizzare la classe non e' piu' cosi' immediato.
Questo vale a maggior ragione quando la classe ha uno stato, e che obbliga lo sviluppatore a chiamare i metodi in sequenze ben determinate. Ma gli oggetti hanno per forza uno stato!
Nella azienda dove lavoro, si e' riscontrato che l'inserimento di nuovo personale nei progetti esistenti richiede un tempo di training maggiore di qualche anno fa. Domanda: non si dovevano ridurre, questi tempi?

6 - Sempre per il motivo 5, se non e' chiaro cosa deve fare le classe, l'ereditarieta' non fa altro che peggiorare le cose. E' come se il famoso INCAPSULAMENTO (inteso come dati e algoritmi nella stessa classe, i.e. nello stesso posto) venisse a mancare. In sostanza, non sai piu' dove andare a trovare le cose. Dov'e' il metodo che fa questo? Ed il metodo che fa quello? Apri la classe corrispondente all'oggetto con il metodo bacato, ma non lo trovi! Allora devi "risalire la china" delle ereditarieta', sperando di trovarlo.
Lasciamo ovviamente stare il costrutto friend, perche' ho voglia di piangere.

7 - Quando il software comincia a crescere, hai bisogno di un valido software per la documentazione automatica e la ricerca dei metodi. Purtroppo quando si comincia ad usare PESANTEMENTE il polimorfismo, potresti perdere giorni a cercare qual e' esattamente il metodo che viene eseguito ad una determinata condizione. Sto ovviamente parlando di software di milioni di righe, ma e' pur vero che in programmi con programmazione tradizionale NON perdevo quel tempo per cercare cosa succede, anche se il codice risultante era meno elegante (magari sequenze di switch()).
Con l'arrivo della programmazione ad oggetti, e' arrivata anche una serie di nuovi tool di cui prima non si sentiva l'esigenza. Ora sul muro del laboratorio c'e' un grande poster che descrive il diagramma delle classi, tanto per dare un'idea di cosa succede, ed abbiamo un software da 2000$ (per ogni PC) per tener aggiornato il progetto.
Intendiamoci: e' anche vero che il software e' cresciuto nelle dimensioni. Pero' e' anche vero che per poter avere un'idea di cosa sta succedendo si ha bisogno di altri tool, piu' potenti. Anche il semplice editor ti deve ora mostrare la lista dei metodi disponibili per oggetto, e spesso scrivere un programma significa scandire questa lista, alla ricerca del metodo "giusto" (cioe' che "suona" bene). Purtroppo di metodi che suonano "giusti" ce ne sono sempre 3 o 4...
Domanda: come sarebbe la produttivita' in generale senza questi tool? Per ogni metodo si dovrebbe andare a scorrere la documentazione?

8 - Le eccezioni!!! Basandosi su quanto viene affermato anche in comp.lang.c++.moderated (oppure basta leggere "Exceptional C++" del mitico Herb Sutter), ben pochi programmatori hanno capito fino in fondo cosa significa utilizzare le eccezioni (il sottoscritto si ritiene incluso nella lista degli ignoranti). Gli esempi che riporta sono a dir poco illuminanti.
Scrivere codice SICURO rispetto alle eccezioni e' un'impresa non da poco, nonostante tutti si dichiarino ben preparati nel loro uso.
Inoltre, se pensiamo che erano nate per evitare di mischiare il normale flusso di esecuzione dal flusso di esecuzione degli errori, mi viene quasi da piangere: nel codice che ho potuto vedere in questi anni, questo obiettivo non e' stato mai raggiunto. Altro che naturale!!!
In piu', con le eccezioni si doveva eliminare una volta per tutte il blind faith. Ho bisogno di aggiungere altro?
Forse si: qualcosa sulla propagazione delle eccezioni. Fino a quando deve essere propagata un'eccezione? Qual e' il giusto livello per catturarla in maniera efficiente?
In pratica, nella maggior parte del codice che ho visto:
- non si catturano eccezioni importanti ed il programma termina quando vengono sollevate;
- si catturano subito e si riporta un codice di errore (ORRORE! Non eravamo tutti orientati agli oggetti?)
- si catturano e si tappano con un orrendo catch (...).
E se l'eccezione e' riportata da una libreria che hai acquistato, e che magari e' carente nella documentazione? (quale documentazione riporta le eccezioni, e soprattutto, chi le legge?).
In piu', le eccezioni possono generare un sacco di problemi molto carini. Per esempio, sempre leggendo comp.lang.c++.moderated si puo' scoprire che il seguente codice:

MyObject *vect = new MyObject[100];
-- qui usiamo questo vettore, poi:
delete[] vect;

puo' generare dei memory leak ASSOLUTAMENTE NON ELIMINABILI. Quale istruzione genera il memory leak? Ovviamente delete[] vect!!!!

9 - Qualcuno vocifera che se la parte pubblica di una classe non cambia e si cambia solo la parte privata, basta ricompilare
il sorgente della classe e linkare al resto. BALLE. Non per nulla, si sono disegnate architetture (che, fra l'altro, trovo molto eleganti) come COM anche per ovviare a questo.
Esempio:
MyObject *pObject = new MyObject;
Prova a NON ricompilare questa istruzione nel tuo codice che usa l'oggetto MyObject.
In sostanza: cambi la parte privata? Prego, ricompila anche il tuo codice sorgente esattamente come facevi prima. Ci impieghi ore? Ce ne impiegavi anche prima, no?

10 - Ultima parola sul polimorfismo. Altra arma a doppio taglio, visto che non si puo' usare con i vettori! Chi sa cosa succede usando un vettore di oggetti polimorfici? Nessuno! Per fortuna non e' un errore molto comune nel software che mi e' capitato di vedere.

Disclaimer: ovviamente queste sono opinioni personali (piu' qualche *vera* dimostrazione). Anche l'autore dell'articolo in questione afferma che parlare male della programmazione Object Oriented e' come "swearing in church". Comunque non ritengo offensiva nessuna affermazione ho riportato a favore della mia tesi.
Inoltre, come la maggior parte di voi, per portare il pane a casa PROGRAMMO, e lo faccio usando linguaggi orientati agli oggetti...

Mi sembra (opinione personale) che il numero di articoli contro l'OOP sia cresciuto parecchio in quest'ultimo anno. E' ora di preparare la "revolucion"

D'altronde non siete stanchi di usare ancora le stesse cose e riparare sempre gli stessi errori? Se qualcuno comincia a criticare lo stato delle cose, e' il benvenuto! E' il primo passo per tirar fuori qualcosa di nuovo...
__________________
In God we trust; all others bring data

Ultima modifica di sottovento : 12-03-2009 alle 05:49.
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 08:43   #14
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
1) result = a.sin() * b + c # Questo è object oriented.

2) Non ho trovato finora un testo introduttivo alla programmazione che parta dalla programmazione a oggetti. Purtroppo la tendenza di chi fa informazione a livello divulgativo/scolastico è a introdurla dopo quella strutturata. Il che non significa che non sia adatta per partire con la programmazione. Forse qualche tutorial su SmallTalk affronta il problema da questo punto di vista.

3) "si tende", non significa che bisogna strafare.

4) la classe Object mette a disposizione diversi metodi di carattere generale che sono mediamente utili. Poi è ovvio che puoi scrivere applicazioni che non li usano.
Il discorso è esattamente lo stesso delle funzioni built-in disponibili nei linguaggi funzionali: perché metterle nel namespace condviso, anche se non servono? Dovrebbero essere importate soltanto all'occorrenza. Lo si fa proprio perché si tratta di funzioni mediamente utili.

5) Se la OOP viene usata male non è "colpa sua".

6) Questo capita anche coi paradigmi strutturati e funzionali, dove andare a trovare una funziona "scognita" può essere un'impresa. Dipende, al solito, da come si strutturano le cose.

7) Qui può aiutare l'approccio test driven, che tra l'altro "autodocumenta" il codice. Ma vale anche per gli altri paradigmi.

8) Le eccezioni non fanno parte del paradigma OOP: le si può introdurre anche negli altri.

9) Con Delphi non m'è mai capito di dover ricompilare un'applicazione soltanto perché ho cambiato l'implementazione di una classe. Inoltre è in grado di compilare sorgenti da un milione di righe di codice in pochi secondi (grazie alla struttura del linguaggio, che è modulare e richiede una sola passata).

10) Questo dipende dal tipo di linguaggio. Con Python, dove qualunque cosa è un oggetto, posso crearmi una sottoclasse di Tuple o List e ridefinire qualunque loro metodo, se è utile.

P.S. Anche le mie sono opinioni personali.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 08:53   #15
javaboy
Registered User
 
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Ne penso bene, mi trovo fondamentalmente d'accordo. E' forse un po' tiepido.

Penso che attualmente la programmazione ad oggetti sia ultra utilizzata (spesso a sproposito) e che sia ritenuta il non-plus-ultra. Non sono cosi' intelligente per poter fornire un'alternativa, ma sono sicuro che un'alternativa migliore esista. E se non esiste, i tempi sono maturi per trovarla.

D'altronde, la scienza (anche l'informatica) e' sempre progredita mettendo in discussione (spesso asserendo addirittura il contrario) i principi che venivano ritenuti assodati, no?

Forse l'articolo riporta troppo poche motivazioni. E' facile trovare altre motivazioni sul fatto che la programmazione ad oggetti abbia dei limiti e che sia ora di trovare qualcosa di meglio:

1 - result = sin(a) * b + c;
result = Math.Add (Math.Times (Math.Trig.sin(a), b), c);
Quale dei due e' piu' semplice? (NOTA - So benissimo che in C++/Java/... posso scrivere entrambe, e' un esempio per rendere l'idea). Quale delle due e' da considerarsi object-oriented?

2 - In questo forum vengono molto frequentemente postati dei messaggi di persone che vogliono imparare a programmare.
Sintetizzando, le risposte sono del tipo: "Impara a programmare con le procedure e poi passa alle classi".
Perche'? Sempre nelle stesse risposte si dice che la programmazione ad oggetti e' piu' naturale! Allora, perche' non si parte ad imparare le basi della programmazione ad oggetti, lasciando per ultima la programmazione piu' difficile?

3 - Quando si usano i linguaggi ad oggetti, si tende a modellare tutto con classi, cioe' "proprieta'" e "metodi" o "messaggi". Questo e' piu' naturale?
Per esempio:

Bicchiere bicchiere;
bicchiere.riempi (acqua);

Cosa c'e' di naturale di un bicchiere che si auto-riempie di acqua? NOTA - non e' un esempio forzato, succede tantissime volte in tutti i software che mi e' capitato di vedere in 20 anni di programmazione: gli oggetti che subiscono l'azione diventano gli attori della stessa.

Comunque, se si preferisce:
Bicchiere bicchiere;
Acqua acqua;
acqua.riempi (bicchiere);
Sembra piu' naturale? Meno male che l'acqua ha un metodo per riempire il bicchiere


4 - Perche' lo stesso bicchiere deve ereditare dalla classe Oggetti? E dalla classe Vetro? Cosa c'e' di naturale in questo? Perche' mi devo portare dietro dei "Metodi/Messaggi" che non mi serviranno a niente, visto che il mio programma usera' il bicchiere per bere l'acqua?

5 - La OOP funziona bene quando e' chiaro cosa deve FARE la classe. Assume che la classe sia un modello di qualcosa che l'utente della stessa conosce gia', nella realta'.
Per esempio, ho appena trovato una classe (in un software scritto da altri) di questo tipo:

class ModelizePlantWithEdgerWithoutL3System: public ModelizePlantWithEdgerOnDownstream
{
....
};

Ritengo di essere del settore (a cui questo software si riferisce), ma credetemi o meno non so come usare la classe!!
Riassumendo: se scrivi una classe che si chiama complex_number probabilmente tutti riescono ad usarla. Quando le cose diventano piu' complesse, siccome la classe si basa sulla conoscenza personale (del singolo programmatore) utilizzare la classe non e' piu' cosi' immediato.
Questo vale a maggior ragione quando la classe ha uno stato, e che obbliga lo sviluppatore a chiamare i metodi in sequenze ben determinate. Ma gli oggetti hanno per forza uno stato!
Nella azienda dove lavoro, si e' riscontrato che l'inserimento di nuovo personale nei progetti esistenti richiede un tempo di training maggiore di qualche anno fa. Domanda: non si dovevano ridurre, questi tempi?

6 - Sempre per il motivo 5, se non e' chiaro cosa deve fare le classe, l'ereditarieta' non fa altro che peggiorare le cose. E' come se il famoso INCAPSULAMENTO (inteso come dati e algoritmi nella stessa classe, i.e. nello stesso posto) venisse a mancare. In sostanza, non sai piu' dove andare a trovare le cose. Dov'e' il metodo che fa questo? Ed il metodo che fa quello? Apri la classe corrispondente all'oggetto con il metodo bacato, ma non lo trovi! Allora devi "risalire la china" delle ereditarieta', sperando di trovarlo.
Lasciamo ovviamente stare il costrutto friend, perche' ho voglia di piangere.

7 - Quando il software comincia a crescere, hai bisogno di un valido software per la documentazione automatica e la ricerca dei metodi. Purtroppo quando si comincia ad usare PESANTEMENTE il polimorfismo, potresti perdere giorni a cercare qual e' esattamente il metodo che viene eseguito ad una determinata condizione. Sto ovviamente parlando di software di milioni di righe, ma e' pur vero che in programmi con programmazione tradizionale NON perdevo quel tempo per cercare cosa succede, anche se il codice risultante era meno elegante (magari sequenze di switch()).
Con l'arrivo della programmazione ad oggetti, e' arrivata anche una serie di nuovi tool di cui prima non si sentiva l'esigenza. Ora sul muro del laboratorio c'e' un grande poster che descrive il diagramma delle classi, tanto per dare un'idea di cosa succede, ed abbiamo un software da 2000$ (per ogni PC) per tener aggiornato il progetto.
Intendiamoci: e' anche vero che il software e' cresciuto nelle dimensioni. Pero' e' anche vero che per poter avere un'idea di cosa sta succedendo si ha bisogno di altri tool, piu' potenti. Anche il semplice editor ti deve ora mostrare la lista dei metodi disponibili per oggetto, e spesso scrivere un programma significa scandire questa lista, alla ricerca del metodo "giusto" (cioe' che "suona" bene). Purtroppo di metodi che suonano "giusti" ce ne sono sempre 3 o 4...
Domanda: come sarebbe la produttivita' in generale senza questi tool? Per ogni metodo si dovrebbe andare a scorrere la documentazione?

8 - Le eccezioni!!! Basandosi su quanto viene affermato anche in comp.lang.c++.moderated (oppure basta leggere "Exceptional C++" del mitico Herb Sutter), ben pochi programmatori hanno capito fino in fondo cosa significa utilizzare le eccezioni (il sottoscritto si ritiene incluso nella lista degli ignoranti). Gli esempi che riporta sono a dir poco illuminanti.
Scrivere codice SICURO rispetto alle eccezioni e' un'impresa non da poco, nonostante tutti si dichiarino ben preparati nel loro uso.
Inoltre, se pensiamo che erano nate per evitare di mischiare il normale flusso di esecuzione dal flusso di esecuzione degli errori, mi viene quasi da piangere: nel codice che ho potuto vedere in questi anni, questo obiettivo non e' stato mai raggiunto. Altro che naturale!!!
In piu', con le eccezioni si doveva eliminare una volta per tutte il blind faith. Ho bisogno di aggiungere altro?
Forse si: qualcosa sulla propagazione delle eccezioni. Fino a quando deve essere propagata un'eccezione? Qual e' il giusto livello per catturarla in maniera efficiente?
In pratica, nella maggior parte del codice che ho visto:
- non si catturano eccezioni importanti ed il programma termina quando vengono sollevate;
- si catturano subito e si riporta un codice di errore (ORRORE! Non eravamo tutti orientati agli oggetti?)
- si catturano e si tappano con un orrendo catch (...).
E se l'eccezione e' riportata da una libreria che hai acquistato, e che magari e' carente nella documentazione? (quale documentazione riporta le eccezioni, e soprattutto, chi le legge?).
In piu', le eccezioni possono generare un sacco di problemi molto carini. Per esempio, sempre leggendo comp.lang.c++.moderated si puo' scoprire che il seguente codice:

MyObject *vect = new MyObject[100];
-- qui usiamo questo vettore, poi:
delete[] vect;

puo' generare dei memory leak ASSOLUTAMENTE NON ELIMINABILI. Quale istruzione genera il memory leak? Ovviamente delete[] vect!!!!

9 - Qualcuno vocifera che se la parte pubblica di una classe non cambia e si cambia solo la parte privata, basta ricompilare
il sorgente della classe e linkare al resto. BALLE. Non per nulla, si sono disegnate architetture (che, fra l'altro, trovo molto eleganti) come COM anche per ovviare a questo.
Esempio:
MyObject *pObject = new MyObject;
Prova a NON ricompilare questa istruzione nel tuo codice che usa l'oggetto MyObject.
In sostanza: cambi la parte privata? Prego, ricompila anche il tuo codice sorgente esattamente come facevi prima. Ci impieghi ore? Ce ne impiegavi anche prima, no?

10 - Ultima parola sul polimorfismo. Altra arma a doppio taglio, visto che non si puo' usare con i vettori! Chi sa cosa succede usando un vettore di oggetti polimorfici? Nessuno! Per fortuna non e' un errore molto comune nel software che mi e' capitato di vedere.

Disclaimer: ovviamente queste sono opinioni personali (piu' qualche *vera* dimostrazione). Anche l'autore dell'articolo in questione afferma che parlare male della programmazione Object Oriented e' come "swearing in church". Comunque non ritengo offensiva nessuna affermazione ho riportato a favore della mia tesi.
Inoltre, come la maggior parte di voi, per portare il pane a casa PROGRAMMO, e lo faccio usando linguaggi orientati agli oggetti...

Mi sembra (opinione personale) che il numero di articoli contro l'OOP sia cresciuto parecchio in quest'ultimo anno. E' ora di preparare la "revolucion"

D'altronde non siete stanchi di usare ancora le stesse cose e riparare sempre gli stessi errori? Se qualcuno comincia a criticare lo stato delle cose, e' il benvenuto! E' il primo passo per tirar fuori qualcosa di nuovo...
Molti di questi problemi però sono relativi al c++, non alla programmazione ad oggetti in generale.
javaboy è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 09:39   #16
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
1) result = a.sin() * b + c # Questo è object oriented.
Forse si, forse no. Scrivevo cosi' anche prima di programmare con le classi.

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
2) Non ho trovato finora un testo introduttivo alla programmazione che parta dalla programmazione a oggetti. Purtroppo la tendenza di chi fa informazione a livello divulgativo/scolastico è a introdurla dopo quella strutturata. Il che non significa che non sia adatta per partire con la programmazione. Forse qualche tutorial su SmallTalk affronta il problema da questo punto di vista.
OK. Ci pensiamo noi. Al prossimo che chiede come iniziare a programmare, sappiamo che risposta dare

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
3) "si tende", non significa che bisogna strafare.
Nell'esempio che ho aggiunto non mi sembra di aver strafatto.
Tutto sommato non mi sembrava cosi' male come esempio, vista la limitata capacita' del mio neurone....

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
4) la classe Object mette a disposizione diversi metodi di carattere generale che sono mediamente utili. Poi è ovvio che puoi scrivere applicazioni che non li usano.
Il discorso è esattamente lo stesso delle funzioni built-in disponibili nei linguaggi funzionali: perché metterle nel namespace condviso, anche se non servono? Dovrebbero essere importate soltanto all'occorrenza. Lo si fa proprio perché si tratta di funzioni mediamente utili.
Non me le tiro dietro per forza. Stanno li', non nell'oggetto (il quale incapsula dati + metodi).
E poi questo suona come: "OK, c'era il problema prima quindi c'e' anche adesso". Tutto sommato e' lecito mettere in discussione quanto si conosce per cercare qualcosa di nuovo. Mi sembra piu' una conferma: il problema non e' stato risolto.
C'e' ancora spazio per fare di meglio...

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
5) Se la OOP viene usata male non è "colpa sua".
Verissimo. Vale anche per l'assembler, il c, il Pascal e tutto il resto.
Si pensava di introdurre gli oggetti per migliorare il codice.
E' noto che possiamo programmare "a oggetti" anche in altri linguaggi che non supportano tale paradigma. Ma se lo supportano, abbiamo una programmazione migliore.
Allora, sicuramente c'e' qualcosa di meglio! Chissa', magari fra qualche anno l'avremo installato sul nostro computer!

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
6) Questo capita anche coi paradigmi strutturati e funzionali, dove andare a trovare una funziona "scognita" può essere un'impresa. Dipende, al solito, da come si strutturano le cose.
Esatto. La programmazione ad oggetti pero' ci mette dell'entusiasmo in questo
Certamente non risolve questo problema. Al punto che i tool di cui parlavo non sono solo utili durante l'attivita' di programmazione: sono vitali!

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
7) Qui può aiutare l'approccio test driven, che tra l'altro "autodocumenta" il codice. Ma vale anche per gli altri paradigmi.
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
8) Le eccezioni non fanno parte del paradigma OOP: le si può introdurre anche negli altri.
Ovviamente non posso discutere piu' di tanto su questo punto. Solo una cosa: le eccezioni vengono giudicate efficaci se usate con i costruttori.

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
9) Con Delphi non m'è mai capito di dover ricompilare un'applicazione soltanto perché ho cambiato l'implementazione di una classe. Inoltre è in grado di compilare sorgenti da un milione di righe di codice in pochi secondi (grazie alla struttura del linguaggio, che è modulare e richiede una sola passata).
Non conosco Delphi, ma se non ricompili come fai a sapere le dimensioni dell'oggetto che vai ad allocare?
Esempio di prima:
MyObject *p = new MyObject;

Immagino che anche Delphi dovra' allocare memoria. 10 bytes? Se poi aggiungi un nuovo campo di 4 bytes....

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
10) Questo dipende dal tipo di linguaggio. Con Python, dove qualunque cosa è un oggetto, posso crearmi una sottoclasse di Tuple o List e ridefinire qualunque loro metodo, se è utile.
Ti avevo promesso di imparare Python e non l'ho ancora fatto. Spero potrai perdonarmi.
In effetti mi riferivo principalmente a C++ (in java, per esempio, non e' possibile).
Se in Python e' possibile, ti rimane lo stesso il problema: la dimensione di una singola cella del vettore e' sbagliata. Immagino che Tuple o List siano le corrispondenti della STL. D'accordissimo: anche se uso STL non ho problemi.


Quote:
Originariamente inviato da cdimauro Guarda i messaggi
P.S. Anche le mie sono opinioni personali.
D: Avevo solo paura di beccarmi un po' di parolacce.
Scusa se ho provato a rispondere ad ogni punto, ma volevo solo far capire che sono stanco della OOP venduta come il massimo della tecnologia.
Ovviamente il suo sporco lavoro lo fa....
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 09:41   #17
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da javaboy Guarda i messaggi
Molti di questi problemi però sono relativi al c++, non alla programmazione ad oggetti in generale.
Forse si! Mi sbaglio spesso
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 09:54   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
2) io consiglio sempre di iniziare con Java proprio perché fare programmazione procedurale con Java è veramente difficile Non mi piace consigliare di iniziare a programmare con linguaggi che consentono un approccio misto come Python o C++ usato alla C (è una delle abitudine che affossano di più questo linguaggio).

3) bicchiere.riempitoCon(acqua);

o

bicchiere.setContenuto(acqua);

Brutta lo so, ma questo metodo funziona bene con l'inglese.
Piccola modifica linguistica e tutto torna

4) se i metodi non si usano, si tolgono
5) concordo con cdimauro
6 e 7) il problema è relativo a tutti i linguaggi quando la dimensione del progetto aumenta. Sicuramente la documentazione automatica semplifica notevolmente la questione. Volevo portare ad esempio la documentazione delle QT4: in ogni classe sono riportati anche i metodi ereditati dalle classi padri. Questo dovrebbe fare una documentazione completa.
Fortunatamente i tool ci sono Certe volte si tende a considerare il solo linguaggio, ma non tutto l'universo di software di sviluppo che gli gira intorno. Secondo me la qualità dei tool di sviluppo è fondamentale. Per questo considero Java attualmente una spanna avanti a tutti i linguaggi.
8) Due cose sono fondamentali: applicazione con metodo e il ricordarsi che le eccezioni devono aiutare solo a gestire gli errori.
9) colpa di C++
10) cosa intendi ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 10:22   #19
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da cionci Guarda i messaggi
3) bicchiere.riempitoCon(acqua);

o

bicchiere.setContenuto(acqua);
O meglio ancora:

Codice:
bottiglia_acqua.riempi( bicchere1 );

bottiglia_coca.riempi( bicchere2 );
Dove le sotto-istanze di Bottiglia creano sottotipi diversi di Liquidi gestibili da Bicchere (Factory pattern).

Questo per dire, che l'OOP è solo più potente della procedurale, non è più facile.
Magari è più intuitiva, ma si possono anche sbagliare molte più cose, architetturalmente.
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 12-03-2009 alle 11:34.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2009, 11:31   #20
Frank1962
Senior Member
 
L'Avatar di Frank1962
 
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
secondo me la gran parte dei programmatori ancora non ha capito a fondo cosè la Programmazione ad Oggetti.... alla fine la OO è solo uno strumento in più; all'uni ho visto gente che scriveva in Java un progetto tutto in una sola classe ....se per loro era più intuitivo fare così chi dice nulla: non bisogna però poi lamentarsi che non si riesce ad andare oltre a una dama o una battaglia navale

comunque stò Erlang solo a vederlo mi vengono le convulsioni: http://it.wikipedia.org/wiki/Erlang_(linguaggio)

...mi sembra di essere tornati ai tempi dell'uni dove i linguaggi funzionali sembravano la soluzione a tutti i mali del mondo!
__________________
----------------------------------------------
File reality.sys corrupted, Reboot Universe? Y/N
----------------------------------------------
Frank1962 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v