2012-12-22 12 views
87

Ho problemi a comprendere la dichiarazione low in coupling and high in cohesion. Ho cercato su Google e letto molto su questo, ma trovo ancora difficile da capire.Cosa significa "basso accoppiamento e alta coesione" significa

Per quello che capisco è High cohesion significa che dovremmo avere classi specializzate per eseguire una funzione particolare. Spero che sia corretto? Come una classe di convalida della carta di credito, che è specializzata solo per convalidare le carte di credito.

E ancora non capisco cosa significa "accoppiamento basso"?

+2

Per una spiegazione più dettagliata, è possibile scegliere la risposta da questo post [Coesione e accoppiamento] (http://stackoverflow.com/questions/3085285/cohesion-coupling) – Infinity

+0

[Questa risposta] (http: // stackoverflow.com/a/3085419/2623749) è certamente migliore e conciso di quelli qui indicati. – Lokesh

risposta

135

Quello che credo è questo:

coesione si riferisce al grado in cui gli elementi di un modulo/classe di appartenenza insieme, si suggerisce che il codice correlato dovrebbe essere vicino l'uno all'altro, quindi dovremmo cercare di ottenere un'elevata coesione e legare insieme tutti i codici correlati il ​​più vicino possibile. Ha a che fare con gli elementi all'interno del modulo.

L'accoppiamento si riferisce al grado in cui i diversi moduli/classi dipendono l'uno dall'altro, è consigliabile che tutti i moduli siano indipendenti il ​​più possibile, per questo motivo l'accoppiamento basso. Ha a che fare con gli elementi tra diversi moduli/classi.

+5

Il nostro professore dice: "L'alta coesione riguarda il fare in modo che il modulo non faccia molte cose, è fatto per fare solo una cosa particolare". – Lokesh

+1

Da quello che credo sia più come "assicurarsi che un modulo faccia una cosa, non molti moduli fanno la stessa cosa", da questo si può garantire che solo un singolo modulo specifica il comportamento, quindi il comportamento generale di una cosa è coeso . – sschrass

4

Per farla breve, l'accoppiamento basso come ho capito significava che i componenti possono essere sostituiti senza influire sul corretto funzionamento di un sistema. Basicaly modulize il sistema in componenti funzionanti che possono essere aggiornati singolarmente senza rompere il sistema

+0

Non è lo stesso dell'alta coesione? – user1315906

0

L'accoppiamento basso e l'alta coesione sono un fenomeno consigliato.

Accoppiamento significa in che misura i vari moduli sono interdipendenti e il modo in cui gli altri moduli sono interessati a modificare alcune/notevole funzionalità di un modulo. L'accoppiamento basso è enfatizzato poiché la dipendenza deve essere mantenuta bassa in modo che vengano apportate modifiche minime/trascurabili ad altri moduli.

7

L'accoppiamento basso è nel contesto di due o più moduli. Se un cambiamento in un modulo comporta molte modifiche in altri moduli, si dice che siano altamente accoppiati. È qui che aiuta la programmazione basata sull'interfaccia. Qualsiasi cambiamento all'interno del modulo non avrà alcun impatto sull'altro modulo poiché l'interfaccia (la media dell'interazione) tra loro non è cambiata.

Alta coesione- Metti insieme le cose simili. Quindi una classe dovrebbe avere metodi o comportamenti per fare un lavoro correlato. Giusto per dare un esempio errato esagerato: un'implementazione dell'interfaccia List non dovrebbe avere operazioni relative a String. La classe stringa deve avere metodi, campi rilevanti per String e, analogamente, l'implementazione di List dovrebbe avere elementi corrispondenti.

Spero che questo aiuti.

23

La coesione nell'ingegneria del software, come nella vita reale, è quanto gli elementi che costituiscono un insieme (nel nostro caso diciamo una classe) si può dire che effettivamente appartengono insieme. Pertanto, è una misura di quanto fortemente correlata ogni funzionalità espressa dal codice sorgente di un modulo software.

Un modo per osservare la coesione in termini di OO è se i metodi nella classe utilizzano uno degli attributi privati.

Ora la discussione è più grande di questo, ma High Cohesion (o meglio il tipo di coesione - la coesione funzionale) è quando parti di un modulo sono raggruppati perché tutti contribuiscono a una singola attività ben definito del modulo.

accoppiamento in parole semplici, è quanto un componente (di nuovo, immaginare una classe, anche se non necessariamente) conosce il funzionamento interno o elementi interni di un altro, ossia quanta conoscenza ha dell'altro componente.

allentata accoppiamento è un metodo di interconnessione dei componenti di un sistema o una rete in modo che tali componenti, dipendono l'uno dall'altro per il meno praticamente possibile ...

I wrote a blog post su questo. Discute di tutto questo in modo molto dettagliato, con esempi ecc. Inoltre spiega i vantaggi del perché dovresti seguire questi principi.

10

In software design alta coesione significa che la classe dovrebbe fare una cosa e una cosa molto bene. L'alta coesione è strettamente correlata a Single responsibility principle.

L'accoppiamento basso suggerisce che la classe dovrebbe avere meno dipendenze possibili. Inoltre, le dipendenze che devono esistere devono essere deboli nelle dipendenze: preferiscono la dipendenza dall'interfaccia piuttosto che la dipendenza dalla classe concreta o preferiscono la composizione sull'ereditarietà.

alta coesione e basso accoppiamento ci danno codice migliore progettato che è più facile da mantenere.

+0

Hai perso l'iniezione di dipendenza. È strettamente correlato all'accoppiamento basso per garantire che una classe abbia le dipendenze meno/meno. – BugHunterUK

0

Un esempio potrebbe essere utile. Immagina un sistema che genera dati e li inserisce in un archivio dati, un file su disco o un database.

High Cohesion può essere ottenuto mediante il codice separato archivio dati dal codice di produzione dati. (e in effetti separa la memoria del disco dalla memoria del database).

Low Coupling può essere ottenuto assicurandosi che la produzione di dati non abbia alcuna conoscenza non necessaria dell'archivio dati (ad esempio, non richiede l'archivio dati su nomi di file o connessioni db).

0

Inheritance o generalizzazione è un esempio di accoppiamento alto (cioè elevata interdipendenza). Ciò che intendevo con questo è che spesso nell'ereditarietà la classe genitore definisce le funzionalità di base utilizzate dalla sua classe figlia e la modifica dei metodi della classe genitore influisce direttamente sulle sue classi figlie. Quindi possiamo dire che esiste un maggior grado di interdipendenza tra le classi.

Realizzazione o utilizzando l'interfaccia è un esempio di coesione alta (cioè bassa interdipendenza). Ciò significa che un'interfaccia propone un contratto per qualsiasi classe che lo implementa, ma ogni classe ha il diritto di implementare i metodi dichiarati nell'interfaccia a modo suo e le modifiche nel metodo dichiarato in una classe non influenzano nessuna altra classe.

2

Hai uno smart phone? C'è una grande app o molti piccoli? Un'app risponde su un'altra? Puoi utilizzare un'app durante l'installazione, l'aggiornamento e/o la disinstallazione di un'altra? Che ogni app sia autonoma è l'alta coesione. Che ogni app sia indipendente dagli altri è un accoppiamento basso. DevOps favorisce questa architettura perché significa che è possibile eseguire una distribuzione continua discreta senza interrompere completamente il sistema.