Panoramica
Sto cercando di apprendere il design basato sul dominio, e io sono circa l'80% del modo attraverso il libro di Eric Evan sull'argomento (e circa lo stesso sul corso Pluralsight). Ho cercato di applicare ciò che ho imparato riprogettando un vecchio progetto LabVIEW / TestStand, ma sono preoccupato che sia corretto avere quelle che considero come le entità che eseguono I / O logica, come la comunicazione CAN / Modbus. L'approccio che sto prendendo ora non è molto lontano da quello che ho fatto in precedenza, e finora ha funzionato bene per me, quindi sono abbastanza fiducioso. Tuttavia, mi piacerebbe vedere se c'è ancora spazio per miglioramenti osservando il processo di sviluppo da una prospettiva DDD.
Oltre a questo, spero di ottenere solo la convalida sull'approccio che ho assunto in generale. Per questo motivo, questo post sarà un po 'prolisso - mi dispiace in anticipo.
Sfondo
Questo progetto è incentrato sull'esecuzione di test automatici di una determinata marca di meccatronici (parte del sistema di trasmissione dei veicoli). Ho dato il via al progetto collaborando con un mio collega che ha meno esperienza nello sviluppo di software orientato agli oggetti, ma un sacco di esperienza nel test dell'hardware automobilistico. In questo senso, ha svolto il ruolo di esperto di dominio . Usando una lavagna ho modellato l'attrezzatura di prova e ho annotato le definizioni di alcune delle terminologie che ha usato (queste sono diventate parte del linguaggio ubiquitario ):
Quandohoiniziatoasviluppareilprogetto,l'hoformalizzatoinundiagrammadiclasseUML.Loschemaseguenteèl'ultimarevisione,leggermentediversadallaprimaversioneacausadiunacomprensioneincontinuaevoluzionedeldominio:
Allo stadio in cui sono ora, ho creato la maggior parte dell'architettura complessiva dell'applicazione e implementato la maggior parte della logica. Ho fatto la maggior parte del codice, lasciando i segnaposto per il mio collega esperto di hardware da riempire con la logica dell'hardware reale. Ci scambiamo avanti e indietro con git, con la mia workstation ideale per scrivere la maggior parte del codice e la sua per testarla contro apparecchiature hardware reali (alimentatori, motori, ecc.). Fin qui tutto bene.
Tipicamente,ilmioapproccioallaprogettazionediquesteapplicazioniconsistenelcreareunalibreria"utility" LabVIEW che modella il banco di prova e tutte le risorse su di essa, e file di sequenza TestStand che fanno uso di questa libreria, eseguendo una sequenza di passi precedente come "Accendi l'alimentatore", "Imposta il motore su 1000 RPM", "Misura le pressioni e controlla i limiti", ecc.
Considerando questo da una prospettiva DDD, sembra che la libreria LabVIEW costituisca il livello di dominio , mentre i file di sequenza di TestStand costituiscono il livello di applicazione , che utilizza e organizza le classi nella libreria che rappresentano il dominio per eseguire una sequenza di test effettiva che ha valore per la nostra attività. Inoltre, il VB test rig sembra servire da radice aggregata composta da entità come alimentazione , array di flussometri e così via.
Crux Of Problem
Ecco dove sono un po 'insicuro: Eric spiega che le classi di entità dovrebbero certamente contenere un comportamento appropriato a qualsiasi cosa esse rappresentino (fare altrimenti comporterebbe un modello di dominio anemico ). Tuttavia, tutte le classi di entità nel suo libro (come Customer
o Account
) tendono ad avere un comportamento relativamente "semplice" - una classe Customer
non ha bisogno di eseguire I / O, per esempio.
È appropriato che io pensi ancora a alimentazione e array di flussometri come entità (quando sono chiare parti del dominio e linguaggio ubiquitario) nonostante il Infatti, implemento ZPL Power Supply
con comunicazione seriale e DAQ Flow Meter Array
con logica di acquisizione dati?
Inoltre: ho applicato correttamente i principi DDD o c'è spazio per miglioramenti? DDD è appropriato anche per un progetto come questo?