Ho questo scenario fuori dal contesto , dove ciò che ritengo sia una buona pratica mi lascia in una situazione di implementazione di un'interfaccia e utilizzo della composizione per eseguire l'implementazione .
Immagina quanto segue:
Ho un Character
con Health
e Mana
, così:
interface ICharacter
{
Health Health { get; }
Mana Mana { get; }
}
class Character : ICharacter
{
public Health Health { get; private set; }
public Mana Mana { get; private set; }
public Character(Health health, Mana mana)
{
this.Health = health;
this.Mana = mana;
}
}
Decido quindi che Health
e Mana
devono essere combinati in un unico oggetto, poiché appartengono insieme.
interface IResource
{
Health Health { get; }
Mana Mana { get; }
}
Cambio il mio Character
in
interface ICharacter
{
IResource Resource { get; }
}
class Character : ICharacter
{
public IResource Resource { get; private set; }
public Character(IResource resource)
{
this.Resource = resource;
}
}
Tuttavia, in modo che i client di Character
possano accedere alla salute di un personaggio senza dire character.Health.Current
e "violando" il principio di minima conoscenza voglio Character
per fornire queste informazioni. E per migliorare l'incapsulamento non vorrei più rivelare come Character
memorizza il suo Health
e Mana
, in questo modo:
interface ICharacter : IResource
{
}
class Character : ICharacter
{
private IResource resource;
public Health Health
{
get
{
return resource.Health;
}
}
public Mana Mana
{
get
{
return resource.Mana;
}
}
public Character(IResource resource)
{
this.resource = resource;
}
}
Ritorna il mio Character
ad avere Health
e Mana
che mi piacciono, ma Character
ora sta implementando la stessa interfaccia di cui sono composto.
Nell'implementazione, sembra molto simile al Pattern Decoratore , ma nell'intenzione non hanno nulla in comune.
Domande
-
Questo modello / antipattern di implementare la stessa interfaccia di una classe è composto da riconosciuto e, in tal caso, come si chiama?
-
Considera questa idea una buona idea solo per avere una proprietà su IResource? - Perché? / perché no?
-
Qualche situazione da diffidare, dove questo è un no-go definitivo?
Sidenote - ICharacter
avrebbe sicuramente più metodi, ma per accorciarlo e tenerlo conciso, ho incluso solo la parte rilevante qui.