Divisione di 1 oggetto di grandi dimensioni in 2 accoppiati strettamente - buono, cattivo?

6

Ho un oggetto complesso (chiamalo BusinessLogic) che fornisce un'interfaccia RPC ad utenti semi-fidati. Le funzioni nell'interfaccia RPC devono decidere quale procedura chiamare, controllare l'autorizzazione per quella funzione, eseguire il controllo degli argomenti, quindi chiamare le funzioni private per eseguire la funzionalità richiesta e quindi restituire i risultati al chiamante.

Ho deciso di implementarlo avendo le funzioni RPC in un oggetto stateless separato (chiamiamolo AppInterface), per separare un po 'le preoccupazioni, in modo che BusinessLogic sposti semplicemente i propri dati e AppInterface decida quali metodi su BusinessLogic chiamare implementare la funzionalità che espone.

Questo funziona molto bene per la maggior parte. Tuttavia mi sembra un po 'sbagliato. L'oggetto BusinessLogic ha beneficiato del fatto di non doversi preoccupare dell'autorizzazione, del controllo degli argomenti, ecc., Che è buono. Ma dal momento che AppInterface implementa tutte le sue funzionalità in termini di BusinessLogic, può essere solo un involucro sottile per alcune procedure (che mi fa dubitare della sua necessità) ed è un involucro complesso in altre procedure (il che mi fa chiedere se tale complessità debba essere reinserito in BusinessLogic, dato che BusinessLogic dispone di tutte le informazioni necessarie per eseguire l'attività). Significa anche che AppInterface ha bisogno di accedere ai metodi in BusinessLogic che altrimenti sarebbero privati poiché nient'altro li usa; pensa alle funzioni amico in C ++. Infine, significa che non riesco a testare in modo efficace l'AppInterface senza utilizzare un oggetto BusinessLogic completo poiché questo è l'unico modo pratico per ottenere un output valido.

Sono felice di lasciare il sistema così com'è, mentre funziona, ma sono curioso di sapere se ci sono miglioramenti evidenti che posso apportare a un sistema del genere.

(Per quel che vale, sto usando Python 2.7, in uno stile principalmente orientato agli oggetti.)

    
posta Kylotan 29.02.2012 - 14:08
fonte

5 risposte

5

Stai descrivendo una relazione di livello più di una relazione accoppiata. A meno che il tuo BusinessLogic non dipenda e faccia chiamate in AppInterface , non è accoppiato. Avere un sacco di dipendenze sul livello sottostante è del tutto naturale e inevitabile. Non ti preoccupare di quanto il tuo BusinessLogic dipende da un livello di database, vero?

Tuttavia, il fatto che alcune chiamate siano involucri sottili e alcune siano spesse mi porta a mettere in discussione i motivi per cui alcuni sono così complessi. Se è solo un'interfaccia dall'aspetto diverso a una funzione BusinessLogic , questa dovrebbe essere spostata in BusinessLogic . Se è perché alcuni argomenti sono più difficili da convalidare rispetto ad altri, dovresti trovare un modo per separare questa preoccupazione. Lo stesso vale per l'autorizzazione.

    
risposta data 29.02.2012 - 15:02
fonte
4

L'accoppiamento tra due oggetti non è buono. Chiunque avrebbe garantito per questo. Tuttavia, penso che due oggetti accoppiati lo rendano ancora meglio di un oggetto monolitico ogni giorno.

La suddivisione dell'oggetto consente di semplificare almeno il modo in cui il codice viene gestito anche se non sono realmente indipendenti dall'evoluzione.

Per quanto riguarda i tuoi elementi, ho ritenuto che la soluzione migliore sarebbe se fosse possibile ridurre successivamente la dipendenza di AppInterface su Business Object . Un semplice processo che ti consente di pensare in questo modo, è di pensare a un altro Business object che deve accedere allo stesso AppInterface . Cerca di mantenere un comportamento / aspettativa ragionevolmente unico e diverso del secondo BO che imporrà ad AppInterface di essere il più generale possibile.

Non dovresti mai unire AppInterface all'oggetto Business, ma cerca di renderlo il più generico possibile.

    
risposta data 29.02.2012 - 14:19
fonte
1

Ogni oggetto ha bisogno di accoppiamento. Quello che vuoi evitare è l'accoppiamento stretto . Il tuo oggetto BusinessLogic interrompe l'incapsulamento o dipende dai metodi che vengono chiamati in un ordine specifico? Altrimenti, esiste in uno stato di astrazione fine.

Il AppInterface dipende troppo dai dettagli di come funziona l'oggetto BusinessLogic ? Quindi devi ridisegnare AppInterface . Si noti che a seconda dei valori di ritorno concordati dalle funzioni è corretto.

Per le tue richieste, basta documentare correttamente che cosa "dovrebbe" essere restituito dalle chiamate al metodo e creare un oggetto MockBusinessLogic . Tutti gli stessi metodi, con solo una dichiarazione di ritorno.

    
risposta data 29.02.2012 - 15:34
fonte
0

Penso che dovresti combinare questi oggetti e cercare un modo diverso per dividerli, se i tuoi oggetti sono strettamente accoppiati non dovrebbero essere separati in questo modo e solo confondendo i futuri programmatori perché gli oggetti A e B hanno sempre da usare insieme per fare qualcosa.

    
risposta data 29.02.2012 - 14:55
fonte
0

Potresti rifattorizzare l'interfaccia pubblica di BusinessLogic in una classe base separata IBusinessLogic , che fornisce tutte le funzioni necessarie per AppInterface . Quando crei l'istanza AppInterface , passa a un oggetto IBusinessLogic , che nel tuo sistema in esecuzione sarà un'istanza di BusinessLogic .

A scopo di test, sei in grado di creare una classe BusinessLogicMock , che eredita anche da IBusinessLogic . Ora puoi facilmente testare unitamente AppInterface senza fornire un oggetto BusinessLogic in piena regola. Questa potrebbe essere la forma di disaccoppiamento che stai cercando.

    
risposta data 29.02.2012 - 15:10
fonte

Leggi altre domande sui tag