|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
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? |
|
|
|
|
|
#2 |
|
Senior Member
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 |
|
|
|
|
|
#3 | ||||
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Quote:
Quote:
Quote:
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.
|
||||
|
|
|
|
|
#4 |
|
Senior Member
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.
|
|
|
|
|
|
#5 |
|
Senior Member
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. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#8 |
|
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/ |
|
|
|
|
|
#9 |
|
Senior Member
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. |
|
|
|
|
|
#10 | |
|
Registered User
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
|
Quote:
Ecco qualche articolo interessante: http://queue.acm.org/detail.cfm?id=1454463 http://gigaom.com/2007/12/19/erlang-...-20-years-old/ |
|
|
|
|
|
|
#11 |
|
Senior Member
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 |
|
|
|
|
|
#12 | |
|
Registered User
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
|
Quote:
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. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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. |
|
|
|
|
|
|
#14 |
|
Senior Member
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 |
|
|
|
|
|
#15 | |
|
Registered User
Iscritto dal: May 2005
Città: far away from home
Messaggi: 1038
|
Quote:
|
|
|
|
|
|
|
#16 | |||||||
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Forse si, forse no. Scrivevo cosi' anche prima di programmare con le classi.
Quote:
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:
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... 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:
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:
Quote:
Quote:
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:
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. 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 |
|||||||
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#18 |
|
Senior Member
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
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 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 ? |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Codice:
bottiglia_acqua.riempi( bicchere1 ); bottiglia_coca.riempi( bicchere2 ); 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. Ultima modifica di Tommo : 12-03-2009 alle 11:34. |
|
|
|
|
|
|
#20 |
|
Senior Member
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 ---------------------------------------------- |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:45.




















