Low Coupling: Principio della singola responsabilità rispetto alla coesione

3

Ho letto diversi articoli su SRP e coesione , e sembrano contraddire l'un l'altro fino a basso accoppiamento .

Gli articoli su coesione sostengono che mettere insieme responsabilità strettamente correlate in una classe Highly_Cohesive_Class riduce l'accoppiamento, mentre gli articoli su SRP sosterrebbero che ridurre l'accoppiamento rimuovendo queste responsabilità strettamente correlate dalla classe Highly_Cohesive_Class in classi separate (tale che ogni classe ha solo una singola responsabilità / ragione per cambiare).

Le due affermazioni non si contraddicono? Vale a dire,

BTW - Sono consapevole del fatto che anche la classe che aderisce al principio SRP è considerata una classe molto coesa, ma in questo post il termine altamente coeso si riferisce a una classe che ha diverse responsabilità strettamente correlate .

    
posta user1483278 26.08.2012 - 21:32
fonte

2 risposte

11

Penso che la confusione sia che un'elevata coesione non significa necessariamente che vuoi mettere tutte le "responsabilità strettamente correlate" in una classe, ma piuttosto che tutti gli elementi di una classe dovrebbero corrispondere a responsabilità strettamente correlate.

Ad esempio, se hai una lezione di cucina, non vorrai la logica del bagno; tuttavia, non è necessario avere anche la logica del forno e del lavello in cucina, solo perché sono correlati. Anche se è un elettrodomestico da cucina, il forno merita probabilmente la sua classe e finirebbe per relazionarsi con la cucina attraverso la composizione. Allo stesso modo il KitchenSink sarebbe correlato alla Cucina attraverso la composizione.

Quindi, guarda in modo altamente coeso come NON AVENDO una logica non correlata in esso, e guarda un SRP come la chiamata a delegare responsabilità agli oggetti che servono a quella responsabilità.

    
risposta data 27.08.2012 - 01:05
fonte
0

Stai mescolando i due. La responsabilità riguarda il comportamento, ciò che una classe dovrebbe fare o essere in grado di fare. La coesione riguarda più i componenti, e raggruppa le classi che operano all'interno dello stesso dominio. Quindi potresti avere una classe per contenere alcuni dati correlati e un'altra classe per recuperare quel tipo di dati da un negozio. I membri dei dati nella classe sarebbero coesi perché hanno poco significato da soli, hanno un significato insieme (possono provenire dalla stessa tabella). E le classi potrebbero essere nello stesso assembly perché entrambe si occupano di offrire l'accesso ai dati, il che li renderebbe coesivi.

Avere classi separate per contenere i dati e per caricare / archiviare i dati sarebbe conforme a SRP. Allo stesso tempo, metterli nella stessa assemblea riconoscerebbe la loro coesione. Vuoi separarli ma tenerli vicini perché hanno bisogno l'uno dell'altro.

I componenti di un'auto sono altamente coesivi, lavorano insieme. Tuttavia è una buona cosa che i meccanismi dello sterzo siano separati dalla scatola del cambio in modo da poter mantenere i due separatamente e la modifica non influirà sull'altro. Allo stesso tempo tu come pilota vuoi avere accesso a entrambi quando guidi, quindi è bello che siano integrati nello stesso veicolo.

    
risposta data 19.03.2016 - 09:37
fonte