Dove collocare le classi di dominio in una struttura e in un diagramma di componenti?

3

Ho un microservice chiamato ExamResults, con una struttura di componenti molto semplice:

  • ExamResults
    • (offerte: IExamResults)
    • (richiede: IExamResultsDAO)
  • ExamResultsDAO
    • (offerte: IExamResultsDAO)

Questo servizio ottiene i risultati degli esami (id degli studenti, ID degli esami, risposte date) in formato JSON e il componente ExamResults li converte in oggetti di dominio locali, esegue alcune convalide e li salva nel database utilizzando ExamResultsDAO . (i suggerimenti sulla nomenclatura non sono scoraggiati)

Ora, tutto andava bene, fino a quando non abbiamo iniziato a implementarlo. Abbiamo dato a ExamResults le classi per la validazione e la (de) serializzazione, ma anche le classi di dominio ( ExamResult , GivenAnswer ) - ed è qui che abbiamo iniziato a grattarci la testa: perché sono lì, esattamente? Le classi di dominio vengono utilizzate dallo stesso DAO.

Il primo pensiero è stato renderli un altro componente, ma abbiamo appreso (siamo studenti) che un componente deve sempre offrire un'interfaccia. E le classi di dominio non hanno metodi significativi: solo getter e setter e parole chiave (de) serializzazione. È corretto condurre il dominio in un pacchetto separato e contrassegnarlo come componente nel diagramma dei componenti? O segnalo come qualcos'altro? O non includerlo affatto? O è più corretto lasciare le classi di dominio con il componente ExamResults , poiché questo le crea e le usa di più?

Qual è la soluzione preferita qui?

    
posta KeizerHarm 05.01.2018 - 19:26
fonte

2 risposte

1

Le classi di dominio sono un componente?

Un componente è qualcosa di autonomo e sostituibile con interfacce ben definite:

A Component is a self-contained unit that encapsulates the state and behavior of a number of Classifiers. A Component specifies a formal contract of the services that it provides to its clients and those that it requires from other Components or services in the system in terms of its provided and required Interfaces.
A Component is a substitutable unit that can be replaced at design time or run-time by a Component that offers equivalent functionality based on compatibility of its Interfaces.
- UML 2.5 standard, section 11.6.3.1, Semantics of components

Ma le interfacce non devono necessariamente essere concepite come un artefatto tecnico, come un java interface :

An Interface specifies a contract; any instance of a Classifier that realizes the Interface shall fulfill that contract. The obligations associated with an Interface are in the form of constraints (such as pre- and postconditions) or protocol specifications, which may impose ordering restrictions on interactions through the Interface.
- UML 2.5 standards, section 10.4.3.1, Semantics of interfaces

Le tue classi di dominio dovrebbero essere autosufficienti, sostituibili e avere interfacce chiare, quindi puoi considerarle come un componente:

  • Autonomo: non vi è alcun motivo per cui dipenderebbero da qualsiasi altra cosa di ExamResults e ExamResultsDAO .
  • Interfacce: quelle usate da ExamResults e ExamResultsDAO (o esplicite interface , o implicite tramite i loro elementi public )
  • Sostituibile: potresti sostituire la loro implementazione con un'altra purché rispetti le stesse interfacce per offrire lo stesso comportamento.

Il componente deve stare in piedi da solo?

Il tuo servizio ExamResults offre un servizio applicativo, che è quello di leggere i dati JSON e memorizzarli in un database. Per svolgere il suo lavoro ha bisogno di:

  • un gestore di richieste: dipende dall'interfaccia e dai protocolli supportati dal servizio dell'applicazione (ad esempio richieste HTTP? messaggi SOAP? chiamate di funzione remote?)
  • un parser: dipende dal formato utilizzato per gli esami. Ecco qui per JSON. Domani potresti cercare XML perché devi interconnetterti con un altro sistema di un'altra università.
  • ExamDAO : dipende dal database utilizzato. Le classi DAO non sarebbero implementate nello stesso modo, se si tratta di un database SQL o di un database NoSQL (ad esempio archivio di valori-chiave, database di grafici o database basato su documenti).
  • Modello di dominio: dipende esclusivamente dal modello di dominio e non dal formato dei dati, né dai protocolli tecnici, né dal DBMS utilizzato

Ciò suggerisce che ci sono grandi vantaggi nell'isolare il modello di dominio dal resto, al fine di applicare separazione delle preoccupazioni .

Bene, sarebbe stato molto più rapido puntare su architettura pulita per supportare giungere a questa conclusione. Tuttavia, tutto questo ragionamento è valido qualunque altro modello di architettura tu abbia scelto.

Altre riflessioni

Il tuo microservizio svolge solo una piccola attività in un sistema più ampio. Altri microservizi potrebbero utilizzare i dati nel database ed eseguire altre attività. Potrebbe essere allettante quindi riutilizzare le classi di dominio e le classi DAO in questo contesto. Per il progetto scolastico è bello. Tuttavia, sii cauto:

  • microservizio sono concepiti per essere il più possibile disaccoppiati. La condivisione di codice comune crea tuttavia un accoppiamento nascosto tra le cose che dovrebbero rimanere indipendenti, il che potrebbe richiedere dei vincoli per l'implementazione di nuove versioni.
  • in un panorama di microservizi, il database condiviso crea un accoppiamento ancora più strong tra i servizi. Per le applicazioni di big data può anche diventare un collo di bottiglia, in quanto potrebbe limitare la scalabilità.
risposta data 10.03.2018 - 13:56
fonte
0

È stato risolto. Si scopre che un componente è più astratto di quanto pensassimo e non ha bisogno di corrispondere uno-a-uno con un pacchetto. Pertanto, le classi di dominio appartengono tecnicamente a entrambi i componenti, ma possono essere implementate in qualsiasi pacchetto che scegliamo.

    
risposta data 09.01.2018 - 10:40
fonte

Leggi altre domande sui tag