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?
