Queste preoccupazioni dovrebbero essere separate in oggetti separati?

4

Ho oggetti che implementano l'interfaccia BroadcastInterface , che rappresenta un messaggio che deve essere trasmesso a tutti gli utenti di un particolare gruppo. Ha un metodo setter e getter per le proprietà Subject e Body e un metodo addRecipientRole() , che accetta un determinato ruolo e trova il token contatto (ad esempio, un indirizzo e-mail) per ciascun utente nel ruolo e nei negozi esso. Quindi ha un metodo getContactTokens() .

BroadcastInterface oggetti sono passati a un oggetto che implementa BroadcasterInterface . Questi oggetti sono responsabili della trasmissione di un oggetto BroadcastInterface passato. Ad esempio, un'implementazione EmailBroadcaster di BroadcasterInterface richiederà EmailBroadcast oggetti e utilizzerà i servizi mailer per inviarli via email.

Ora, a seconda di quale implementazione di BroadcasterInterface viene utilizzata per trasmettere, una diversa implementazione di BroadcastInterface viene utilizzata dal codice client. Il Principio di Responsabilità Unica sembra suggerire che dovrei avere un oggetto BroadcastFactory separato, per creare oggetti BroadcastInterface , a seconda di quale implementazione di BroadcasterInterface viene utilizzata, poiché la creazione dell'oggetto BroadcastInterface è una responsabilità diversa dalla loro trasmissione.

Ma la classe utilizzata per creare oggetti BroadcastInterface dipende da quale implementazione di BroadcasterInterface viene utilizzata per trasmetterli. Penso che, poiché la conoscenza del metodo utilizzato per inviare le trasmissioni dovrebbe essere configurata una sola volta, l'oggetto BroadcasterInterface dovrebbe essere responsabile della fornitura di nuovi oggetti BroadcastInterface .

La responsabilità di "creare e trasmettere oggetti che implementano l'interfaccia BroadcastInterface " viola il principio di responsabilità singola?

(Poiché il token di contatto per l'invio della trasmissione agli utenti varia a seconda del modo in cui viene trasmesso, ho bisogno di diverse classi di trasmissione, anche se il codice cliente non sarà in grado di distinguere.)

    
posta Lewis Bassett 10.05.2012 - 08:56
fonte

2 risposte

2

Non conosco PHP, ma OO-saggio hai un problema qui. Se qualcosa implementa BroadcastInterface, dovrebbe essere utile per qualsiasi elemento che si aspetta un'istanza BroadcastInterface .

Primo suggerimento: crea le versioni A, B, C, ... di ciascuna BroadcastInterface e BroadcasterInterface (BroadcastIntefaceA, BIB, BIC e BerIA, BerIB e BerIC). Queste possono estendere le interfacce originali, ma manterranno il tuo relazioni dirette; la BI corretta andrà con il BerI corretto, o, nella maggior parte delle lingue che conosco, avrai un errore del compilatore. Altrimenti, le cose saranno irrimediabilmente confuse invece che semplicemente confuse. Probabilmente vuoi che ogni estensione di BerI produca l'estensione della BI appropriata.

Secondo suggerimento: salta le estensioni. Prendi il codice nelle implementazioni BI che li fanno comportare in modo diverso e metterlo negli implementatori di BerI. Ora non devi preoccupartene affatto. E le interfacce raccontano tutta la storia che qualcuno che li usa deve sapere.

Non conosco bene il PHP o il tuo programma per dire quale, se entrambi, la soluzione è la migliore. (Se dovessi prendere in carico il tuo codice, farei qualsiasi per far funzionare il secondo suggerimento, però.) Ma le interfacce devono raccontare tutta la storia che qualcuno ha bisogno di sapere. Il codice che utilizza l'interfaccia non dovrebbe sapere più nulla sull'implementatore di ciò che è nell'interfaccia. L'implementatore non dovrebbe sapere nulla sull'utente oltre a ciò che preleva attraverso l'interfaccia.

    
risposta data 10.05.2012 - 17:49
fonte
0

Se non si dispone di un codice che funzioni direttamente su una BroadcastInterface, non ha senso farlo. Anche se hai diverse implementazioni, lo usi più come una sorta di modello, quindi come un'astrazione.

Quindi un EmailBroadcaster dovrebbe essere in grado di funzionare con qualsiasi implementazione di BroadcastInterface.

In questo caso, prenderei in considerazione l'unione di BroadcasterInterface con BroadcastInterface. Metti il comportamento con i dati.

    
risposta data 12.05.2012 - 03:13
fonte