PDA

Visualizza versione completa : [OOP] Tentativo di cercare delle linee guida...


Fast-M
16-10-2007, 12.32.41
Salve a tutti,
questo topic è un po insolito perchè non chiedo qualcosa di preciso, ma propongo una linea guida per avere conferme o rigetti per validarla o scartarla come tale.
Supponiamo di avere 2 classi A e B e che A sia la classe utlizzata da B, quindi B è il consumatore di A vedendola in termini di Factory semplice.
Possiamo in generale dire che se B usa uno o più metodi di A, allora nelle proprietà di B troveremo sicuramente o convenientemente una proprietà di tipo A ?
Questo per fare in modo che poi uno o più metodi di B possano utilizzare l'oggetto A in uno dei suoi metodi riferendosi alla proprietà dell'oggetto stesso, magari usando this.nomePropretà.nomeMetodoOggettoEsterno(...).
Però è anche vero che potrebbe anche non esserci proprio una proprietà di tipo A, tra le propretà di B e nonostante questo un metodo di B potrebbe comunque utilizzare A in qualche suo metodo definendo al suo interno una variabile reference di tipo A e non il this come nel caso precedente.

Il risultato sarebbe identico da un punto di vista dell'elaborazione e delle cose fatte, ma sarebbe diverso da un punto di vista concettuale e nelle modalità di interazione degli oggetti.

Mi chiedevo cosa cambia in pratica nel prendere le due vie e perchè conviene l'una o l'altra.
Per esempio nel design pattern Factory o nell'Abstract Factory viene presa la prima, ma questo può essere preso come regola o come linea guida generale da seguire per una qualche convenienza anche se non si vuole seguire alcun design pattern?

Infatti fin dall'inizio del mio ingresso nella programmazione ad oggetti ho sempre posto molta attenzione alle forti analogie con il mondo reale.

La oop è chiaramente il risultato della creazione di uno strato software che permette di astrarsi dal mondo interno di un computer che è caratterizzato da dati binari incomprensibili ed inorganizzabili per l'uomo.
Per esempio se guardiamo uno dei tanti oggetti che fanno parte della nostra vita come un televisore o un forno da cucina, notiamo che gli oggetti della programmazione oop sono proprio come quelli, ma trasposti virtualmente in questo strato della oop.
Il pannello di controllo di un forno che permette di accenderlo ed impostarne la temperatura non è altro che una interfaccia che può essere utilizzata(implementata) da qualsiasi oggetto che ha caratteristiche simili al forno da cucina, ma non soltanto dal forno da cucina!
Per esempio quello stesso pannello dei comandi(interfaccia) potrebbe essere utilizzato(cambiandogli un po la forma magari :)), da una stufa elettrica o da un condizionatore.
Quindi si nota che l'interfaccia cioè il pannello che permette al mondo esterno di utilizzare un oggetto che la monta(implementa) perchè i dati ricevuti e restituiti da alcune funzionalità(metodi) dell'oggetto hanno la struttura definita nella firma dei metodi che è definita nell'interfaccia, non dice quasi nulla sull'oggetto che la implementa, ma da soltanto una struttura formale dei parametri che alcuni dei suoi metodi(funzionalità) accetteranno in ingresso ed in uscita.
Infatti un oggetto può implementare N interfacce e quindi una sola di queste darebbe soltanto una visione parziale dei parametri in ingresso ed in uscita di alcune funzionalità dell'oggetto che la implementa.

Supponiamo di avere una interfaccia che definisce un metodo:

Apri()

questa interfaccia potrebbe essere implementata tanto da un oggetto Finestra quanto da un oggetto Porta o da qualsiasi oggetto che ha tra le sue funzionalità quella di aprirsi o di aprire qualcos'altro esterno ad esso.

Vedendo le cose in quest'ottica che poi è quella reale, chè significato ha il fatto di mettere tra le proprietà di una classe A, una o più proprietà che sono reference per altri oggetti esterni?
Non significa che l'oggetto A ha tra le sue caratteristiche interne la possibilità di potere utilizzare quel ben preciso oggetto esterno?

Per fare un altro esempio con il mondo reale, possiamo dire che il fatto di mettere tra le proprietà di un oggetto, una reference ad un altro oggetto è come dire che un oggetto 'lettore di cd' ha tra le sue proprietà quella di poter leggere un supporto di tipo 'cd' che è a sua volta un altro oggetto.

E quindi non è errato inserire in un oggetto una proprietà reference di un altro oggetto se non vi è una stretta dipendenza tra i due come nel caso di Lettore<->Supporto?

Cioè mi sembra chiaro che per essere coerenti un oggetto LettoreCd avrà tra le sue proprietà di classe una reference all'oggetto SupportoCd, infatti un lettore cd reale ha un vano apribile in cui si può inserire il supporto cd per ascoltarlo ed ha quindi proprio in se, nella sua struttura un qualcosa che è direttamente collegato al supporto cd e cioè il vano che lo ospita ed un laser di lettura che crea un canale di comunicazione tra i due oggetti.

Questo non porterebbe ad affermare che ogni qual volta si vuole che un oggetto A utilizzi un oggetto B, ma non vi è tra i due una dipendenza così stretta come quella 'LettoreCd<-->SupportoCd', non è coerente inserire una reference a B nelle proprietà di A?

Sto in pratica cercando una linea guida concettuale che mi permetta di stabilire quando è coerente creare delle proprietà di tipo reference ad altri oggetti e quando invece non lo è anche se da un punto di vista pratico non cambierebbe nulla.

Spero di non aver annoiato tutti coloro che vivono ed usano la programmazione come una cosa esclusivamente pratica e strumentale e mi scuso per i limiti della mia mente, che mi costringe a fare molte più domande per potere capire a fondo una cosa.

Grazie per la pazienza!

:)

LoryOne
18-10-2007, 21.19.34
"Infatti fin dall'inizio del mio ingresso nella programmazione ad oggetti ho sempre posto molta attenzione alle forti analogie con il mondo reale."
Approccio decisamente hacker

"La oop è chiaramente il risultato della creazione di uno strato software che permette di astrarsi dal mondo interno di un computer che è caratterizzato da dati binari incomprensibili ed inorganizzabili per l'uomo."
Assolutamente no, è l'uomo che non si rende conto di essere computer a modo suo. Funziona perchè organizzato.

"E quindi non è errato inserire in un oggetto una proprietà reference di un altro oggetto se non vi è una stretta dipendenza tra i due come nel caso di Lettore<->Supporto?"
A dire il vero, fondamentale è trovare la stretta dipendenza

"Cioè mi sembra chiaro che per essere coerenti un oggetto LettoreCd avrà tra le sue proprietà di classe una reference all'oggetto SupportoCd"
Coerente, tant'è che SupportoCd è legato a LettoreCd in quanto integrato in esso.

"non è coerente inserire una reference a B nelle proprietà di A?"
Se B accede ad A, è A che deve essere identificabile da B, quindi B ed A non possono essere oggetti distinti ma integrati da un reference.

"mi scuso per i limiti della mia mente"
Sei fortunato perchè se ti parlassi dei miei ...:D