Spesso mi imbatto in questo problema durante lo sviluppo di giochi e simulazioni. Ad esempio, sto attualmente scrivendo un'implementazione di scacchi. Lo sto usando come veicolo per sperimentare sistemi di componenti di entità e catene di responsabilità, ispirato al discorso di Brian Bucklew sull'architettura di Roguelike ( link ). In definitiva mi piacerebbe essere in grado di esprimere ogni componente comportamentale di Chess come una piccola componente incapsulata di un pezzo degli scacchi e scambiarli con un capriccio per creare rapidamente pezzi con nuovi comportamenti.
Quindi ho un Game
che ha un Board
, e il Board
può avere un numero di Piece
s ognuno dei quali può avere un numero di Component
s. Non ho un'idea di che tipo sia un Piece
, piuttosto codifico il loro comportamento attraverso il loro Component
s; puoi inviare un messaggio "IsOwnedByPlayerOne" per determinare su quale lato si trova Piece
, ad esempio:
IComponent.cs
:
public interface IComponent
{
void Handle(ref Message message);
}
Piece.cs
:
public bool IsOwnedByPlayerOne()
{
var isOwnedByPlayerOneMessage = new Message(MessageType.IsOwnedByPlayerOne);
Handle(ref isOwnedByPlayerOneMessage);
return isOwnedByPlayerOneMessage.GetParameter<bool>(MessageParameter.IsOwnedByPlayerOne);
}
Il problema a cui sono giunto è questo: un Component
è un tipo di basso livello, ma hanno bisogno di essere consapevoli del mondo che li circonda e che possono essere raggiunti solo attraverso l'accesso a tipi di livello superiore. Ad esempio, supponiamo di inviare un messaggio "IsLegalMove" a un Piece
di Rook, chiedendo se può spostarsi legalmente da a1 a a6. Dovrebbe controllare se ci sono altri Piece
s tra a1 e a6, che richiede l'accesso a Board
. Ma Board
stesso contiene Piece
che a sua volta contiene Component
, quindi concettualmente il design sta diventando un po 'anonimo.
Potrei fornire come campo un Piece
o Component
di accesso a Board
. Oppure potrei aggiungere Board
come parametro al metodo I
Component '' s Handle()
. Non mi sento bene per nessuna di queste soluzioni, ma non riesco a capire perché. Quale sarebbe meglio allineato con i principi del software di qualità? O ci sono altri che consiglieresti?