Dubbio su programmazione ad oggetti

di il
4 risposte

Dubbio su programmazione ad oggetti

Salve, devo consegnare un progetto d'esame e ho un dubbio sul concetto di ereditarietà (da applicare al mio caso). Semplifico al massimo (uso java ma questo è un problema concettuale): ho una lista (globale) che inizialmente deve contenere un solo elemento. L'inserimento di questo elemento nella lista si ottiene grazie alla classe A mediante il suo metodo Metodo(). Però, se è attiva la checkbox, devo poter fare in modo che la lista possa contenere anche più di un elemento e quindi ho la classe B che eredita da A (mi ha costretto l'insegnante) e che riscrive il metodo Metodo() in modo da poter inserire più di un elemento. L'insegnate vuole che io utilizzi il polimorfismo quando riempio la lista con più di un elemento. Ora vi chiedo: nel metodo della classe B, devo inserire nella lista tutti gli elementi (anche il primo che può essere inserito dalla classe A) oppure devo escludere il primo (quindi inserisco gli elementi da 2 a n e lascio il primo alla classe A)?

Io, tramite il metodo Metodo() riscritto nella classe B avevo inserito tutti gli elementi (anche il primo) e quindi, il mio codice e':

A a = new A();
if(check NON e' selezionata) then a.Metodo() //inserisco solo il primo elemento
else
{
a = new B();
a.Metodo(); //polimorfismo (e inserisco tutti gli elementi, anche il primo)
}

L'alternativa sarebbe la seguente:

A a = new A();
a.Metodo(); //inserisco subito il primo elemento
if(check e' selezionata) then
{
a = new B();
a.Metodo(); //polimorfismo (e inserisco gli elementi dal 2 all'ultimo)
}

Cosa e' meglio secondo voi (per quanto riguarda il concetto di ereditarietà e polimorfismo)? Vi ricordo che sono costretto ad ereditare da A e fare il polimorfismo nel caso di inserimento di più di un elemento (lo ha "ordinato" l'insegnante). E poi, la lista è meglio che sia globale (e unica) o una lista (di un solo elemento) per la classe A e una (con gli elementi dal 2 all'ultimo) per la B?

4 Risposte

  • Re: Dubbio su programmazione ad oggetti

    Ciao,
    premesso (ed ammettendo) che non ci ho pensato troppo direi che il concetto di base è:
    - se istanzi la classe A usi solo A -> quindi potrai inserire un solo elemento (il metodo Metodo() di A ti permette di inserire un solo elemento).
    - se istanzi la classe B usi solo B -> quindi potrai inserire N elementi (il metodo Metodo() di B ti permette di inserire N elementi).

    Vedo che il metodo Metodo() non ha parametri quindi suppongo che al loro interno le due classi A e B peschino i dati da qualche parte, invocando A.Metodo() avrai un solo elemento nella tua lista con la logica di A.Metodo(). Invocando B.Metodo() avrai N elementi nella tua lista inseriti con la logica di B.
    A questo punto però mi viene da chiederti, se Metodo() non ha parametri, come fanno i metodi A.Metodo() e B.Metodo() ad inserire elementi nella lista? Forse la ritornano? Se così fosse le due classi A e B potrebbero avere una loro struttura interna per mantenere il/i dati ed il metodo Metodo() aggiunge (nel caso di A.Metodo() sempre e solo un elemento) elementi e poi li ritorna sotto forma di lista.

    La seconda parte è solo un'ipotesi, prendila con le pinze...
    Perchè non posti il testo dell'esercitazione per intero?

    Ciao.
  • Re: Dubbio su programmazione ad oggetti

    Grazie per la risposta. Mi serviva solo il concetto che se istanzio la classe B devo usare solo quella (e così anche per la classe A). In effetti, la classe B deve essere "autonoma" e dunque deve poter inserire anche il primo elemento (quindi o invoco A.Metodo() o B.Metodo(), non entrambe). Infatti non avrebbe senso se B.Metodo() inserisse gli elementi dal 2 all'ennesimo, deve inserire anche il primo, visto che eredita da A (la estende quindi deve fare quello che fa A più altre cose). Dimmi se ho ragione, faccio così:

    A a;
    if(checkBox NON è selezionata) then
    {
    a = new A();
    a.Metodo(); //inserisco solo il primo elemento nella lista globale
    }
    else
    {
    a = new B();
    a.Metodo(); //inserisco tutti gli elementi (anche il primo) nella lista globale
    } /* il polimorfismo si nota ugualmente, vero? Non fa niente che verrà eseguito solo uno dei due metodi (e non entrambi in sequenza)? */

    Per quanto riguarda i parametri, in realtà Metodo() riceve due parametri, non l'avevo detto perchè volevo semplificare al massimo. Poi, sia A.Metodo() che B.Metodo() usano una unica lista globale (in realtà è una lista di una lista.....e il metodo crea una lista e la aggiunge alla lista globale, essendo un "elemento" della lista globale). Alla lista globale (lista di lista) viene aggiunto l'elemento (lista creata localmente nel metodo) con il classico metodo Add che accoda l'elemento alla lista (quindi non servono indici). Ora volevo chiederti se va bene avere questa unica lista globale oppure devo mettere una lista all'interno della classe A (che conterrà un solo elemento, ovviamente....quindi in questo caso potrebbe anche non essere una lista) e una nella classe B (contenente più di un elemento, anche il primo). Però questa opzione mi sembra un po' "scomoda" dato che nelle altre operazioni (che usano la lista) dovrà controllare quale ho usato (quella di A o quella di B). Non posto il codice di queste due classi metodo perchè è lungo e complicato e, per capirlo, necessita anche del codice di altre classi.
    Fammi sapere, questo progetto mi sta facendo impazzire
  • Re: Dubbio su programmazione ad oggetti

    Sinceramente faccio fatica a dire "si va bene" o "no non va bene".
    La risposta che darei con sicurezza è: Dipende.

    Dipende da quelli che devi fare, ma sicuramente devi tenere sempre a mente il concetto di disaccoppiamento. Avere quella lista (che poi mi dici essere una lista di liste) globale può andare bene, oddio avere roba globale per me è il male...ma se è un programmino del cavolo amen non è quello il punto cruciale.
    Quello che mi spaventa in quello che scrivi è quando dici:
    "Nella classe A ho una lista con un elemento"...."Nella classe B ho una lista, in questa lista devo avere l'elemento che c'è in A + altri N valori?".
    Le classi A e B sono entità a se, in realtà hanno si un'associazione (come si chiama, associazione? generalizzazione? non mi ricordo...) ma i dati che persistono sono agnostici, se poi esiste una particolare business logic che dice "quello che è nell'oggetto A deve anche essere nell'oggetto B" è un altro discorso...la mia BL potrebbe anche dire che quello che è nell'oggetto B deve stare anche in un oggetto C ma non c'entra...la BL è una cosa, la definizione del Model è un'altra.

    Mi chiedi se le classi A e B devono avere una loro lista interna. Be dipende, se tutto quello che fanno è Metodo(): aggiungere elementi ad una lista di liste che gli viene passata da chi invoca Metodo() che utilità avresti a persistere i dati (anche) in oggetti A e B? Nessuno...
    Dipende da cosa devi fare...

    Perchè non posti per intero il testo dell'esercitazione? Non il tuo codice, la richiesta.
    Ciao
  • Re: Dubbio su programmazione ad oggetti

    Leggendo sommariamente credo che tu non abbia chiaro il polimorfismo!!!
Devi accedere o registrarti per scrivere nel forum
4 risposte