|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
@PGI Parliamo due lingue diverse, anche se l'autore non ha il rigore formale della Java Language Specification entrambi riusciamo a capire cosa intende e con questo chiudo.
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! |
![]() |
![]() |
![]() |
#22 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
Quote:
![]()
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! |
|
![]() |
![]() |
![]() |
#23 |
Bannato
Iscritto dal: May 2007
Città: Bari
Messaggi: 4690
|
per quanto ne sappia io,l' uso di classi astratte consiste nel definire la classe con i dati memmro e le interfacce delle funzioni membro senza l' implementazione)...l' implementazione dei metodi sarà fatta in una classe derivata(ereditarietà)...non è detto che sia la successiva a definire il metodo,ma potrebbe anche essere la classe derivata della classe derivata...
|
![]() |
![]() |
![]() |
#24 |
Junior Member
Iscritto dal: Sep 2009
Messaggi: 2
|
Classi astratte
Sono d'accordo con lupin87 ed aggiungo anche che da una classe astratta ovviamente non si possono istanziare oggetti e che in C++ una classe è astratta se contiene almeno una funzione virtuale pura.
![]() |
![]() |
![]() |
![]() |
#25 | |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Quote:
![]() PS. dal numero di messaggi deduco tu sia nuovo del forum: benvenuto!
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov |
|
![]() |
![]() |
![]() |
#26 | ||
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Resto perplesso su un punto però Quote:
|
||
![]() |
![]() |
![]() |
#27 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
La questione è pratica ed è anche molto delicata. E' il problema della creazione che non è un problema di prospettiva orientata agli oggetti ma di programmazione orientata agli oggetti - cioè di rappresentazione di ciò che è visto in termini orientati agli oggetti. In un sistema orientato agli oggetti non c'è bisogno di creare gli oggetti: ci sono già, sono lì, esistono in quanto parte del sistema - che è una delle tre cose che in un sistema orientato agli oggetti non è oggetto e che pertanto non li assorbe. In un programma oo invece gli oggetti bisogna crearli. Due soluzioni. La prima è creare gli oggetti - nel senso tecnico di istanziarli - in un unico punto del programma e "far finta" che quello sia il sistema, nel senso predetto. Non è formalmente rigoroso perchè, come hai già notato, quello diventa il punto in cui tutte le definizioni di oggetto appaiono insieme e, quindi, perdono la loro autonomia. Per me in Java o C++ è la soluzione preferibile perchè è molto semplice: metti i new nel main e via. Sarebbe tuttavia preferibile usare meccanismi di caricamento dinamico. Ad esempio in Java è piuttosto comune che per sistemi c.d. modulari l'istanziazione non avvenga direttamente con un new Pippo() ma sfrutti i ClassLoader e dica Class.forName("pippo"). Il Class.forName("pippo") rispetta l'autonomia degli oggetti sia formalmente (c'è una stringa non c'è la classe pippo) sia praticamente (il forName è delegabile quindi io posso caricare una qualsiasi classe partendo da quella stringa). Ma si può fare anche in C++ con una factory che crea istanze di un tipo specificato in una classe base astratta usando delle librerie dinamiche. All'atto pratico, per un linguaggio che richiede una pre-compilazione, un sintomo del fatto che esso è propriamente diviso in oggetti si evince nel momento in cui rimuovendo quella parte del programma che corrisponde ad una definizione di oggetto il programma rilsuta comunque compilabile. Una volta adottatta "'istanziazione dinamica" si risolve anche il problema dell'impossibilità da parte di un oggetto in senso proprio di offrire effettivamente un servizio agli altri oggetti.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
![]() |
![]() |
![]() |
#28 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Si inquadrando la questione dal punto di vista di un software orienta agli oggetti una delle questioni basilari è l' istanziazione, ma dopo tale fase utilizzerò in qualche modo l' oggetto, ed evidentemente se ho utilizzato un forte accoppiamento in caso di modifiche mi ritroverò in un mare di guai...e questo purtroppo è un dato di fatto.
Dal lato prospettiva ad oggetti invece resto ancora dubbioso: se ho ben capito il tuo discorso, la definizione di oggetto porta alla soluzione black-box (che dovrebbe cmq essere intrinseca di una classe) però senza via di comunicazione con l' esterno, pena la perdità di autonomia e la classificazione ad oggetto. Se la definizione A è in rapporto di Has-a con B, B non è un oggetto. Ma se B fosse autonomo sarebbe anche inutilizzato, e quindi di nessuna utilità al contesto. Una curiosità ma cosa indichi con Quote:
|
|
![]() |
![]() |
![]() |
#29 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
così detto/a
Un oggetto può essere autonomo e usato al tempo stesso. Basta che chi lo usa non faccia riferimento alla definizione dell'oggetto ma ad una parte di quella definizione - che sarà condivisa e quindi manipolabile solo a patto di sapere che si sta intervenendo su almeno due parti del programma. L'interfaccia: tipico strumento di comunicazione che preserva l'identità. Codice:
interfaccia A fai qualcosa object B extends A fai qualcosa ... e fai qualcosa per davvero, magari apre una base dati, fa una telefonata o che so io. interfaccia C setA(a:A) object D extends C setA(a:A) ... usa a Codice:
A a = (A)carica("B") C c = (C)carica("D") if(a != null && c != null) { C.setA(a); } non so se l'ho ricordato: la dipendenza di definizione è transitiva ma NON E' riflessiva: se X dipende da Y, Y non è detto che dipenda da X. Mi premerebbe tuttavia sottolineare un punto. Non è che siccome quello pesudocodice è fatto com'è fatto allora è OO mentre non è OO una cosa che sia diversa da quella. Parliamo di prospettiva, di interpretazione del codice. Parliamo delle conseguenze che derivano dall'avere o non avere certe dipendenze. Non c'è un mitologico "buon orientamento agli oggetti" o un codice che sia "più orientato agli oggetti di un altro". C'è solo l'orientamento agli oggetti.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#30 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Facendo un sunto possiamo affermare?(punto interrogativo) che ogni definizione(che non possa essere immutabile) non autonoma, per diventare tale, debba essere astratta al suo "contratto" e legata, con opera di bridging,ad una sua implementazione reale (magari con approccio lazy). |
|
![]() |
![]() |
![]() |
#31 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Sui principi io resterei "generico", nel senso di limitare il discorso a definizioni che sono parti di altre e definizioni che non lo sono e che quindi sono definizioni di oggetti. E' questo il senso di quel "autonoma": che non è parte di.
Come si realizza in codice questa autonomia - in particolare quando ci si trova di fronte alla normale necessità di far parlare due oggetti - dipende dal linguaggio. Ci sono strumenti comuni. Se uno va a guardare un modo diffuso per passare ad un oggetto un riferimento ad un altro oggetto senza che il primo riceva l'intera definizione del secondo nota la sequenza astrazione-ereditarietà-composizione-polimorfismo. Non credo però che sia l'unico modo. Anche un programma che non facesse uso di astrazione o ereditarietà o composizione o polimorfismo potrebbe dirsi orientato agli oggetti se dall'esame del codice risultasse l'esistenza di almeno due oggetti. Ad esempio un listato C, senza particolari escamotage, risulta composto di un unico oggetto che racchiude in sè tutte le funzioni del sistema, ma se iniziassimo ad appoggiarci al caricamento dinamico di librerie probabilmente saremmo in grado di ottenere quel tanto di separazione necessaria e sufficiente affinchè parti diverse del sistema siano definibili autonome. Io penso che si debba stare attenti nel passaggio dalla prospettiva orientata agli oggetti alla programmazione orientata agli oggetti a non confondere le proprietà di un linguaggio con i principi della prospettiva.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#32 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
PGI, da qualche parte ho letto la tua affermazione circa il fatto che in un sistema orientato agli oggetti ci sono almeno 3 cose che non sono oggetti, e che il sistema stesso è una di queste, dico bene?
Quali sarebbero le altre 2, che non sono oggetti? E perchè il sistema non dovrebbe essere un oggetto? Nel senso: se prendo Java, da un certo punto di vista potrei considerare la definizione della così detta Main Class del mio applicativo come una definizione autonoma, quindi come un oggetto, che tra l'altro equivale al sistema. O forse mi perdo da qualche parte?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#33 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
In un sistema orientato agli oggetti le tre cose che non sono oggetti sono:
i predicati; le definizioni non autonome; il sistema; i predicati sono definizioni di principio preesistenti e, qualora debbano essere condivisi, di natura convenzionale. Io assumo una certa definizione di "colore rosso" o di "colorato" o di "mobile" eccetera, dopodichè vado a guardare il sistema attribuendo quei predicati. le definizioni non autonome sono quelle definizioni che non partecipano ad altre definizioni. il sistema (di oggetti) è la rappresentazione che risulta dall'osservazione del fenomeno dal punto di vista orientato agli oggetti. Se considerassimo il sistema come un oggetto allora sarebbe anche l'unico oggetto (il sistema è ciò di cui tutti gli oggetti sono parte, un oggetto che è parte di un oggetto non è esso stesso un oggetto, quindi gli oggetti decadono a definizioni non autonome). Considerare il sistema come oggetto andrebbe anche bene, non fa un grinza rispetto ai principi, ma non è molto utile. L'orientamento agli oggetti non è un modo per scrivere programmi con meno linee di codice o per scrivere programmi più velocemente o più veloci o chissà che. E' un modo per scrivere programmi complessi. La divisione in oggetti permette di gestire quella complessità nel senso ultimo di conoscere le conseguenze di un intervento su una parte del programma PRIMA di intervernire. So che io posso modificare un oggetto e tu puoi modificarne un altro in parallelo ma non possiamo intervenire su due definizioni non autonome perchè corriamo il rischio di metterci vicendevolmente i bastoni tra le ruote. Cose così. E' chiaro allora che nel momento in cui io vado ad interpretare il sistema stesso in termini OO e lo identifico di conseguenza come l'unico oggetto possibile tutta la "gestione" della complessità va a farsi benedire: qualsiasi modifica diventa possibile e irrilevante perchè comunque sto modificando tutto quanto, non è possibile dividere il lavoro perchè c'è un oggetto solo su cui intervenire eccetera eccetera.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#34 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ok.
Quindi è un fatto che la Main Class del mio programma Java, osservato dalla prospettiva orientata agli oggetti è un oggetto in quanto definizione autonoma, ma, diciamo così, non mi conviene considerarlo tale, altrimenti i benefici che potrei io essere umano avere, nell'utilizzare tale prospettiva, se ne vanno al diavolo. C'è qualcosa che non mi torna... o forse non ho analizzato bene a fondo le cose.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#35 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Direi di no. Osserva il programma in termini di definizioni, autonome e non. Risulta uno schema: alcune parti del programma dipendono da altre, alcune non dipendono da nulla.
Se alla fine di questa lettura ti risulta che tutto dipende da tutto, cioè che non ci sono oggetti a parte il programma considerato nella sua interezza, il programma è ok, va bene, ma la sua complessità non è gestibile in termini di orientamento agli oggetti. Si può sempre fingere che un particolare punto del programma sia il "sistema" - non è detto che sia il main - ma se non è una cosa voluta sin dall'inizio la divisione in oggetti che ne risulta non corrisponderà al fenomeno che il programma rappresenta.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#36 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ok, mi sono appena reso conto del mio errore, è che stamattina ho la mente un po'... appannata.
Grazie della pazienza, come al solito.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#37 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Io ho l' abitudine di veder (o pensare) fin dall' inizio questo punto di accentramento, proprio il cosidetto "sistema" e devo dire di trovarmi bene seguendo questo schema, fermo restando di utilizzare tutti gli strumenti astratti(pattern ad esempio) e offerti dal linguaggio di turno per mantenere il coupling più basso possibile. Magari, è una logica "progettuale" che qualcuno può criticare o non condividere però non credo sia del tutto errata, anzi può rappresentare una buona linea guida oltre che, forse, una semplificazione.
|
![]() |
![]() |
![]() |
#38 |
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Ok la discussione filosofica in sé per sé è interessante nella problematica... ma a tratti prende la piega di sega mentale o sbaglio???
![]() |
![]() |
![]() |
![]() |
#39 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Dal lato filosofico è molto interessante. |
|
![]() |
![]() |
![]() |
#40 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Perchè, postata in questi termini, la tua domanda da me non viene interpretata come tale ma come una provocazione, e, quello che non capisco, è il motivo che ti spinge a provocare. Se non posso, usando la tua locuzione, "farmi seghe mentali" in una sezione di un forum specificamente dedicata alla "Programmazione" (e sappiamo tutti quanto numerosi siano i campi del sapere indirettamente collegati a questo termine) dove incontro altre persone che possono stimolarmi delle riflessioni che da solo non farei, mi dici dove dovrei andare a farmele, visto che nel mio caso non ho amici che programmano ne colleghi sul lavoro, ma sono solo?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-09-2009 alle 12:04. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:32.