Progettazione guidata dagli eventi e separazione della logica core / UI

1

Sono nuovo nello sviluppo guidato dagli eventi e mi sento perso quando tento di implementare eventi che dovrebbero superare il limite di core / UI.

Nel mio programma ho il seguente (esempio in c #):

UI.RuleForm   Core.RuleList     UI.ResultForm
Cell 1        Rule 1
Cell 2        Rule 2
Cell 3        Rule 3

Quello che voglio è: quando una cella RuleForm cambia, aggiornerà la regola corrispondente in RuleList. E quando la RuleList cambia, il risultato sarà ricalcolato dalle regole.

Il mio attuale pensiero è che, al fine di mantenere la logica core separata dalla logica dell'interfaccia utente (cioè il core non dovrebbe sapere nulla sull'interfaccia utente), il core dovrebbe quindi generare solo eventi, ma non elaborare eventi generati da altri.

Quindi devo creare una sorta di UI.RuleListWrapper che può elaborare gli eventi di modifica di RuleForm, aggiornando Core.RuleList. RuleList in termini dovrebbe attivare gli eventi OnChange che UI.ResultForm può utilizzare.

Quindi, in sintesi, le mie domande sono:

Voglio sapere se il mio ragionamento e l'implementazione intenzionale sono ok o meno, il che probabilmente significa: un modulo principale dovrebbe essere in grado di elaborare eventi generati dall'interfaccia utente esterna La mia separazione è una sorta di "miofobia", o è già stata fatta prima. Ci sono altri approcci migliori?

    
posta lulalala 01.05.2012 - 15:29
fonte

3 risposte

1

What I want is: when a RuleForm cell changes, it will update the corresponding rule in RuleList. And when the RuleList changes, the resultFrom will be recalculated from the rules.

My current thought is that, in order to keep core logic separated from UI logic (i.e. core should know nothing about UI), core should then only generate events, but not processing events generated by others.

So I have to create some kind of UI.RuleListWrapper which can process RuleForm change events, updating Core.RuleList. RuleList in term should fire OnChange events that UI.ResultForm can use.

Cerca "associazione dati" in .NET. Sembra essere quello che stai cercando. È gestito in modo diverso a seconda che si esegua WinForms o WPF, ma i concetti sono gli stessi.

La tua idea sull'approccio che devi seguire è fondamentalmente corretta, tuttavia probabilmente non hai bisogno di una classe RuleListWrapper (almeno non in questo caso specifico). Attraverso l'associazione dei dati, le modifiche apportate alle celle aggiorneranno automaticamente la regola corrispondente. Quindi la tua regola può generare un evento di modifica delle proprietà che deve essere gestito dal modulo dei risultati.

In particolare, cerca l'interfaccia System.ComponentModel.INotifyPropertyChanged per le tue regole. Se stai utilizzando WinForms, cerca BindingSource per l'interfaccia utente e per WPF cerca la sintassi dell'associazione integrata.

    
risposta data 01.05.2012 - 17:31
fonte
1

Per core intendi livello aziendale, livello presentazione, ecc.? Con la presentazione non intendo l'interfaccia utente. A seconda del modello, l'interfaccia utente potrebbe generare eventi per il livello di presentazione che dovrebbero quindi interfacciarsi con il livello aziendale. In genere il livello intermedio risponderà agli eventi dell'interfaccia utente e comunicherà nuovamente con la vista tramite un viewmodel o tramite un'interfaccia (ancora una volta in base al modello). Se è veramente un modello di base nel senso pratico, direi che un livello intermedio gestisce gli eventi che vengono generati e quindi chiama nel modello core e torna alla vista.

    
risposta data 01.05.2012 - 15:41
fonte
0

Per mantenere le preoccupazioni separate, il core non dovrebbe rispondere agli eventi UI . Ciò non significa che non possa rispondere ad altri eventi, generati dai gestori di eventi dell'interfaccia utente.

Mantenere le astrazioni completamente isolate è un problema difficile; a volte c'è solo così tanto che puoi fare. Potrebbe essere necessario rendere l'interfaccia di base consapevole dell'espressione esistenza dell'interfaccia utente, ad esempio. Ma ciò non significa che debba sapere come funziona l'interfaccia utente. Questo può essere curato dal livello dell'interfaccia utente / presentazione.

    
risposta data 01.05.2012 - 16:45
fonte

Leggi altre domande sui tag