Quindi sto usando C # WPF e leghiamo a una vista modello per visualizzare gli stati. I dati che devono essere visualizzati sono distribuiti su un paio di classi diverse. Ad esempio, ho una classe che legge i valori IO digitali che devono essere visualizzati sull'interfaccia principale come luci rosse o verdi.
È meglio passare semplicemente l'oggetto Model alle classi per aggiornare direttamente le proprietà? Sembra più facile a breve termine ma ha un odore strano.
Modifica
Penso che una parola migliore per ciò che sto chiedendo sia l'incapsulamento. L'incapsulamento sembra essere un concetto importante in OOP.
Nel caso 1 il modello è "incapsulato" nella classe Main. Altri oggetti non interagiscono direttamente con il modello. vengono utilizzati metodi delegati. Questo sembra prolisso e un po 'disordinato, ma questa è la soluzione che sto cercando di mantenere incapsulato i dati.
Nel caso 2 il modello viene passato a un oggetto secondario come argomento nel costruttore, che agisce sul modello contemporaneamente all'istanza originale. Sembra infrangere la regola di incapsulamento e potrebbe essere fonte di confusione nel numero di posizioni al quale il modello può accedere. Questo sarà particolarmente vero dove varie classi hanno dati che devono essere visualizzati.
Questo potrebbe essere interamente basato sull'opinione pubblica. Vedo vantaggi e insidie di entrambi gli approcci. Il caso 2 non si presta a essere riutilizzato. Mentre il caso 1 potrebbe essere implementato altrove.
In pratica si preferisce l'uno rispetto all'altro? Quanto è importante l'incapsulamento? Devo mantenerlo a scapito della leggibilità?
MSDN Implementazione del pattern MVVM
Well-designed view, view model, and model classes will not only encapsulate the correct type of code and behavior; they will also be designed so that they can easily interact with each other via data binding, commands, and data validation interfaces.
END EDIT
La soluzione su cui sto lavorando utilizza i delegati. Ad esempio:
Caso 1
public delegate void PrependLog(string log);
public class MyDemoClass
{
private void DoStuff(string str)
{
//Do stuff
OnPrependLog("Did stuff");
}
public PrependLog PrepLog
public virtual void OnPrependLog(string str)
{
if(PrepLog != null)
PrepLog(str);
}
}
Quindi dal principale:
public MainWindow()
{
MyDemoClass objDem = new MyDemoClass;
//Assign delegate
objDem.PrepLog = (val) => {Model.LogText += val;}
}
Ma dal punto di vista della leggibilità, sembra che sarebbe più semplice passare il MyDemoClass
del modello e aggiornare direttamente il testo del registro.
Case2
public class MyDemoClass
{
MyModel Model;
public MyDemoClass(MyModel model)
{
Model = model;
}
private void DoStuff(string str)
{
//Do stuff
Model.LogText += "Did Stuff";
}
}