Ho esaminato l'incapsulamento e la coesione, ma a me sembrano la stessa cosa. Non è un oggetto incapsulato già altamente coeso?
Ho esaminato l'incapsulamento e la coesione, ma a me sembrano la stessa cosa. Non è un oggetto incapsulato già altamente coeso?
Cohesion si riferisce al grado in cui elementi di un modulo appartengono insieme. Quanto più coesivo è un modulo, rispetto ad altri moduli nel software, tanto più indipendente può operare. Incapsulamento è una delle tecniche con cui è possibile raggiungere la coesione. Sebbene l'incapsulamento sia certamente un elemento importante della coesione, la coesione affronta anche altre preoccupazioni che riguardano la coesione.
Il grado in cui i componenti dipendono l'uno dall'altro per il loro corretto funzionamento è chiamato accoppiamento . L'accoppiamento è ottenuto principalmente dai meccanismi scelti per interagire tra i componenti. Quanto meno un sistema è accoppiato, tanto più è coesivo. Quindi, l'accoppiamento basso è una caratteristica desiderabile.
Analizziamo alcuni esempi di relazioni tra componenti, in ordine di aumentare la coesione:
Inheritance
L'ereditarietà è molto strettamente accoppiata e pertanto ha una coesione relativamente bassa; se rompi l'ereditarietà, interrompi il programma. Ma l'ereditarietà è auspicabile per i sistemi dove vuoi e hai bisogno di quel tipo di accoppiamento stretto, perché vuoi che i componenti lavorino a stretto contatto. Ad esempio, è utilizzato in modo abbastanza efficace nelle interfacce utente grafiche.
Composizione
La composizione è meno strettamente accoppiato dell'ereditarietà; è possibile sostituire un oggetto locale in una classe con un'implementazione diversa senza rompere una catena di ereditarietà. Ma devi ancora cambiare l'implementazione interna della classe; è solo che le modifiche sono limitate a una singola classe.
Composizione con interfacce
Qui, la classe dipende solo da un'interfaccia. Di conseguenza, è possibile modificare l'implementazione senza modificare la classe, a condizione che la classe di implementazione sia conforme all'interfaccia specificata. Puoi persino modificare l'implementazione dell'interfaccia in fase di esecuzione, passando un'istanza della classe desiderata al costruttore della tua classe.
Oggetti di trasferimento dati e modelli di visualizzazione
Questa tecnica consente di creare classi che fungono da contenitori di dati, senza alcun comportamento associato. Ora, i moduli tra i quali si sta comunicando non hanno bisogno di sapere nulla l'uno dell'altro, nemmeno un'interfaccia comune. Tutto ciò di cui hanno bisogno di sapere è l'oggetto DTO o View Model. Ma le cose cominciano a diventare un po 'più complicate, perché ora trascorri molto tempo a mappare campi su altri campi e copiare dati tra diverse strutture.
Streams, stringhe e pipe
Con stringhe e flussi, puoi sfruttare un meccanismo ben noto per comunicare tra i moduli. Questa disposizione è la più liberamente accoppiata, poiché il modulo non ha alcuna dipendenza, tranne che per strutture di dati primitive compatibili multipiattaforma e ampiamente disponibili. Le stringhe sono il più onnipresente di tutti i tipi di dati; esempi del loro uso in un'API includono stringhe di connessione al database e protocolli di comunicazione che usano stringhe o array binari per trasmettere dati. Lo svantaggio di questo meccanismo è che ora hai bisogno di un parser, un serializzatore o un meccanismo simile nei tuoi moduli per tradurre i dati grezzi trasmessi tra i moduli in una forma utilizzabile.
Come puoi vedere, l'alta coesione non è un ideale perfetto, né è universalmente desiderabile. Come per molte altre cose in informatica, è un compromesso tra obiettivi concorrenti.
L'incapsulamento e l'alta coesione sono cose diverse ma correlate.
Entrambi hanno a che fare con il design della classe, ma si concentrano su cose diverse.
L'incapsulamento (ovvero l'occultamento delle informazioni) è l'idea che non si dovrebbero esporre dettagli di implementazione - che l'API della classe non deve "filtrare" le parti interne, rendendo più facile modificare detti interni successivamente, se necessario (ad esempio, esponendo un iteratore - ora può essere supportato da un array, ma in seguito una tabella di hash).
L'alta coesione, dall'altra parte, correlata al modo in cui parti di una classe si relazionano tra loro, quanto spesso vengono utilizzate insieme nella classe. Più spesso vengono utilizzati insieme, maggiore è la coesione della classe.
Leggi altre domande sui tag object-oriented