|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[Generico/OOP]Ereditarietà
Ciao a tutti
Ho molti dubbi sulla comprensione dell'ereditarietà nella programmazione ad oggetti. Leggendo vari documenti, trovo ovunque scritto che l'ereditarietà si applica solo ed esclusivamente nel caso in cui ci sia una relazione del tipo "is-a". Facendo un esempio molto banale, ecco i miei dubbi: Classe "Azienda" Classe "Cliente" un cliente _è_ un'azienda ? mi rispondo di si Mi fermo un attimo su questo primo punto: Con la classe base Azienda, è corretto pensare che NON è la mia azienda ma un'astrazione dell'entità azienda? Cioè, dovrò poi utilizzare questa classe base per istanziare oggetti di tipo miaAzienda, aziendaCliente ? Aiutatemi prima a fugare questi dubbi e poi, continuerò con gli altri Grazie mille come sempre. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Anche la TuaAzienda is a Azienda. Azienda praticamente deve contenere le caratterisitche comuni a tutte le aziende e TuaAzienda e Cliente quelle specifiche.
__________________
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
In fase di Design cerca di assegnare ad ogni classe una responsabilita' ed un comportamento preciso(Carte CRC
[faccio riferimento a java] Nei linguaggi ad oggetti hai 2 tipi di ereditarieta' quella di implementazione implementation inheritance (quella che usa la parola chiave extends) e quella di interfaccia interface inheritance (quella che usa la parola chiave implements) di questi 2 tipi di ereditarieta' quella che ti garantisce maggior flessibilita' e' l'interface inheritance. Uno dei principi dell' OOP dice, "Program to interface, not an implementation" - Considera che quando usi extends leghi le classi figlie ad una implementazione precisa quella della classe padre, mentre usando implements puoi in qualsiasi momento sostituire l'implementazione che usi con un'altra che rispetta lo stesso contratto (definito nell'interfaccia). Cerca di andare in profondita' e non soffermarti sull'aspetto linguistico - bisogna capire le implicazioni che una certa decisione comporta e valutarne gli aspetti positivi/negativi, altrimenti rischi di prendere qualche abbaglio.
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! Ultima modifica di mindwings : 30-03-2009 alle 16:15. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Ma dipende dai vari casi, quindi avevo risposto solo in maniera generica rispetto a quello che avevo capito del suo particolare problema. cmq anch'io sono assolutamente a favore dell'uso delle interfacce.
__________________
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Innanzitutto grazie per le risposte.
Ma quindi, se non ho capito male, la mia classe base dovrebbe essere un'interfaccia?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
Quote:
@Raoul ti consiglio di acquistare qualche libro, io alcune cose le comprendo leggendo, per esempio trovo molto interessante http://www.holub.com/payment/holub.on.patterns.html nei primi capitoli bene l'oop e da un significato alla parola pattern. Giusto per dirne una: L'autore descrive un sistema OO come un insieme di animali intelligenti che parlano l'un con l'altro scambiandosi messaggi (la metafora di Alan Kay) ed aggiunge "The most important facet of OO design is data abstraction."... "All information is hidden. A given object doesn't have any idea of what the innards of other objects look like"... "You may have read in a book somewhere that an object is a data structure of some sort combined with a set of functions, called methods, that manipulate that data structure.Balderdash! Poppycock!" Qui l'autore denigra la definizione di oggetto come struttura dati + metodi... Nel seguito spiega il perche` ovvero una definizione "procedurale" infatti segue una sezione dal titolo "Getters and Setters Are Evil" Effettivamente anche a me e' capitato di usare gli oggetti poco piu' come dei contenitori e vai di get e set XD... Questo a causa di Cay Horstmann e uno dei suoi libri bacati usato al primo corso di programmazione... Che senso ha definire una dato privato e rendere pubblici metodi come get e set ?! Serve solo a complicarne l'accesso...
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
Quote:
Allora definendo un'interfaccia delinei un comportamento ovvero l'insieme dei messaggi a cui l'oggetto che implementa l'interfaccia e' in grado di rispondere. Definisci solo le segnature dei metodi! Non l'implementazione. Cio' ti da maggior flessibilita'/puoi avere piu' implementazioni per l'interfaccia ma per contro aggiungi un livello di astrazione. Se invece usi una classe semplice e' perche' non hai bisogno di maggior flessibilita' e ti va bene usare direttamente l'implementazione. Infine c'e' la mezza misura la classe astratta una classe astratta e' una classe che ha almeno un metodo astratto ovvero viene definita solo la segnatura e non l'implementazione, le classi che implementano la classe astratta devono definire l'implementazione del metodo astratto. per esempio Collection contenitore1 = new LinkedList(); LinkedList contenitore2 = new LinkedList(); Nel primo esempio sto usando la programmazione per interfacce ovvero quando uso contenitore invio messaggi all'oggetto utilizzando solo quelli definiti nella sua interfaccia Collection mentre nel secondo caso uso l'interfaccia specifica di LinkedList(definita nella sua classe) e quindi ho sia i messaggi di "tipo" Collection perche' LinkedList implementa Collection e sia i messaggi propri di LinkedList come per esempio addFirst che ha senso per una lista ma non per una collezione che e' un concetto piu' generale(infatti collection non ha il messaggio addFirst). se per esempio voglio cambiare l'implementazione di contenitore1 e' sufficente sostituire new LinkedList() con per es new HashSet e sono in una botte di ferro perche' anche la classe HashSet implementa lo stesso contratto/intefaccia Collection e non avro' errori... Mentre nel secondo caso contenitore2 sono bloccato non posso fare cambiamenti perche' uso un implementazione concreta Spero di aver chiarito un po' i tuoi dubbi
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! Ultima modifica di mindwings : 30-03-2009 alle 17:05. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
"We can write good or bad programs with any tool. Unless we teach people how to design, the languages matter very little."
-David Parnas Questa e' da incorniciare
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
E' corretto. Ogni volta in cui dichiari una classe dichiari implicitamente un insieme di valori. I valori appartenenti a quell'insieme sono tutti e soli quei valori a cui sono applicabili le operazioni dichiarate nella classe.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Troppe volte ho commesso l'errore di trascurare una definizione iniziale chiara delle responsabilità per delineare in modo pulito le classi e il modo in cui interagiscono. All'inizio forse non puoi sapere tutta la soluzione, ma lavorando su quello che conosci eseguire questa prima analisi può aiutare a farti capire altri aspetti della soluzione che ancora non conoscevi, nonchè a far saltar fuori nuove classi che ad una prima osservazione erano rimaste misconosciute. Magari è un discorso un po' OT rispetto al tuo problema contingente, però penso che una corretta identificazione delle responsabilità possa facilitarti nell'individuare anche la "gerarchia emergente" delle stesse.
__________________
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 : 30-03-2009 alle 18:03. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Ecco, mi hai dato il colpo di grazia Già stavo pensando all'incapsulamento della mia classe base ......
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12965
|
Quote:
get { ... codice ... } e un set { ... codice ... } et voilà, vengono richiamati quando occorrono, senza complicarsi la vita con i metodi |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
così fungono in realtà quelli automatici... Codice:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
__________________
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Visto che l'avete tirato in ballo (il C# intendo...)
non è quindi una buona pratica di programmazione utilizzare delle proprietà mediante get e set ??
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Io sono certo che lo sia.
cioè, è indispensabile nei casi che get e set oltre a restituire/settare la variabile facciano anche qualcosa altro... cosa piuttosto comune in classi sufficientemente complesse. Nel caso del get/set puro io li preferirei lo stesso, perchè impediscono all'utente di "spararsi nei piedi"... per esempio se tu offri l'accesso pubblico ad una variabile di una classe, a qualche furbo potrebbe venire in mente di prenderne il puntatore. Al che, appena per qualsiasi motivo la elimini la parte user dell'applicazione crasha miseramente. Per cui vi ricordo che il mondo della programmazione va a mode, ed eviterei di decidere come programmare sulla base di slogan Questa roba lasciatela allo stadio plz. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
Quote:
dei metodi pubblici get e set a questo punto non c'e' alcun senso a definire il campo come private perche' sto soltanto complicando l'accesso al dato ma la sostanza non cambia, modifico un dettaglio relativo al funzionamento dell'oggetto e quindi mando parnas a cagare con la sua information hiding.
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! Ultima modifica di mindwings : 31-03-2009 alle 11:59. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 1278
|
Quote:
Esempio: Oggetto Impiegato, anziche' avere una God Class che raccoglie i dati da impiegato per fornire una visualizzazione via gui... impiegatoRaoul.getName impiegatoRaoul.getCognome impiegatoRaoul.getCodiceFiscale faccio questo impiegatoRaoul.displayInformazioniPersonali, se seguo la strada del get and set avro' una bella God class che sicuramente colleghera' i dati ad un unica modalita' di presentazione di dati... (E se cambia
__________________
Non esistono grandi uomini, solo grandi ambizioni , realizzate da qualcuno che si è alzato dalla sedia per realizzarle! Ultima modifica di mindwings : 31-03-2009 alle 12:01. |
|
|
|
|
|
|
#18 | |
|
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! |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
riprendendo il tuo esempio: impiegatoRaoul.getName <- questo sarà un metodo pubblico o sbaglio ?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
si ma lui sta parlando del caso specifico in cui devi usare il getter per prendere i dati dell'impiegato da visualizzare in una gui...
__________________
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:32.




















