Sto tentando di dimostrare di non aver inserito la struttura nella classe padre BaseModule che ho mostrato di seguito. Sono più per un modello di strategia, e riducendo al minimo l'ereditarietà a favore delle relazioni di ha-a, ma non sono veramente sicuro di quale principio di OOAD questo schema si stia rompendo.
Quale principio di OOAD sta rompendo questo schema?
Schema potenziale:
public interface IStringRenderer
{
string Render();
}
public class BaseModel : IRequestor
{
public abstract void Init();
public abstract void Load();
}
public class BaseModule<TModel> : IStringRenderer where TModel : BaseModel
{
public TModel Model { get; set; }
public override string Render()
{
return
string.Join(
"",
new string[]
{
"<header/>",
"<main-container>",
"<side-nav>",
"<side-navigation/>",
"</side-nav>",
"<main-content>",
RenderMainContent(),
"</main-content>"
});
}
public abstract string RenderMainContent();
}
public class MyModuleModel : BaseModel
{
public List<int> Ints { get; set; }
...
}
public class MyModule : BaseModule<MyModuleModel>
{
public override string RenderMainContent()
{
return
string.Join(",", Model.Ints.Select(s => s.ToString()).ToArray());
}
}
Pattern preferito (duplicato del codice per essere chiaro):
public interface IStringRenderer
{
string Render();
}
public class BaseModel : IRequestor
{
public abstract void Init();
public abstract void Load();
}
public class MyModuleModel : BaseModel
{
public List<int> Ints { get; set; }
...
}
public class MyModule : IStringRenderer
{
public MyModuleModel Model { get; set; }
public MyModule(MyModuleModel model)
{
this.Model = model;
}
public override string Render()
{
return
string.Join(
"",
new string[]
{
"<header/>",
"<main-container>",
"<side-nav>",
"<side-navigation/>",
"</side-nav>",
"<main-content>",
RenderMainContent(),
"</main-content>"
});
}
public string RenderMainContent()
{
return
string.Join(",", Model.Ints.Select(s => s.ToString()).ToArray());
}
}
Ci sono parti di questo schema su cui non sto cercando di concentrarmi, ma invece sto pensando a dove vivono la 'struttura', o 'tag'. Nel primo esempio vivono nel genitore, ma nel secondo esempio sono stati inseriti nella classe derivata.
Al momento, gli esempi sono piuttosto semplici, ma qualcosa come "side-nav" potrebbe potenzialmente complicarsi, e potrebbe comunque essere necessario controllare il bambino.
Sento che il principio qui è che non mi sento come se la struttura del 'tag' non fosse nella classe genitore come nel primo esempio. Ci sono altre cose che ho rimosso nella mia "versione preferita", vale a dire i generici. (Qualsiasi lettura suggerita di buono / cattivo per quella scelta è la benvenuta). I fautori della struttura incorporata del primo esempio come il fatto che possono esercitare modifiche su grandi quantità di classi secondarie. Ritengo che offrire la flessibilità per le classi derivate sia la strada da percorrere e, se è necessario essere genitore, il genitore offre solo funzionalità e funzionalità trasversali, ma non imbottiglia la struttura in scatola.