È una cattiva progettazione condividere una classe tra un agente in un sistema e un sito Web di frontend

1

Ho un sistema complesso che ho svolto un ottimo lavoro nel separare i problemi con i microservizi. Tutti i dati vengono passati attraverso le code e il risultato del sistema sono i messaggi per aggiornare un modello di database di proprietà di un singolo agente. Non ho alcun codice condiviso tra gli agenti del sistema.

Il problema che sto riscontrando è che l'intero modello che viene memorizzato nel database deve quindi essere visibile in un progetto di sito Web di amministrazione che ho. L'intero modello non è troppo complesso, solo alcune classi, ma i cambiamenti devono essere fatti in due punti. È un codice duplicato al 100%.

Questo è incoraggiato con i microservizi, o nel mio scenario sarebbe giusto metterlo in una libreria condivisa.

    
posta Zach 26.01.2017 - 03:56
fonte

2 risposte

2

Non c'è niente di sbagliato nell'avere lo stesso codice in esecuzione in due diversi contesti. Non prenderei nemmeno in considerazione questo codice duplicato. Quello che considero il codice duplicato è se il codice sorgente è biforcuto e ora abbiamo un codice molto simile ma potenzialmente diverso o divergente che viene mantenuto separatamente e, questo è un problema che può continuare a peggiorare nel tempo.

Ora, come dici tu

changes have to be made in two places

Questo indica che hai fonti bifronte ed è effettivamente duplicato. Definirei due repository diversi, entrambi modificabili, ma con lo stesso codice sorgente duplicato di una situazione indesiderabile.

Quindi, hai diverse scelte:

  1. condividi il codice sorgente direttamente da un singolo repository comune
  2. crea una libreria condivisa
  3. crea un micro servizio

Personalmente, preferisco l'approccio (1) per molte situazioni, per la sua semplicità, se puoi far sì che tutte le parti siano d'accordo a reperire almeno quell'insieme di classi da un repository comune, e puoi fare una versione di tutti i client che consumano insieme quando i cambiamenti incompatibili si verificano in quel codice.

Suppongo che tu possa usare anche più repository purché tu ne definisca esattamente uno come fonte di verità, e l'altro non debba mai essere modificato dagli umani (fornirei un po 'di automazione per copiare i sorgenti come parte di build).

Successivamente, preferisco l'approccio (3) in un ambiente di micro-servizi. Un micro servizio condiviso può estrapolare i clienti da determinati dettagli e consentire una manutenzione indipendente di tale servizio dagli altri client, offrendo un accoppiamento più flessibile.

Infine, preferisco l'approccio alla libreria condivisa. Ha problemi di versioning simili al codice sorgente condiviso con alcuni problemi aggiuntivi di build, test e packaging; anche se a suo favore può offrire un certo formalismo delle tue classi come API.

    
risposta data 26.01.2017 - 17:28
fonte
1

Non vedo alcun motivo per chiamare questo cattivo design. Infatti, se stai risparmiando sforzi (attraverso la durata della base di codice) condividendo le classi del modello, allora è una vittoria.

L'unico potenziale svantaggio che posso pensare è che potrebbe forzare i cicli di sviluppo del front-end e del back-end a essere più strettamente coordinati rispetto a se il codice non fosse condiviso. Ma potrebbe anche essere una buona cosa.

    
risposta data 26.01.2017 - 09:01
fonte

Leggi altre domande sui tag