クラスライブラリの設計と、ライブラリを使用する実行可能プログラムで構成される以下のサンプルコードについて考えてみます。
namespace AppLib
{
/// <summary>
/// Entry point for library. Stage manages all the actors in the logic.
/// </summary>
class StageApp
{
/// <summary>
/// Setting that is looked up by different actors
/// </summary>
public int SharedSetting { get; set; }
/// <summary>
/// Stage managing actors with app logic
/// </summary>
public IEnumerable<Actor> Actors { get { return m_actors.Where(x => x.Execute() > 40).ToArray(); } }
private List<Actor> m_actors = new List<Actor>();
}
/// <summary>
/// An object on the stage. Refers to stage (shared)settings and execute depending on the settings.
/// Hence actor should have reference to stage
/// </summary>
class Actor
{
private StageApp m_StageApp;
private int m_Property;
/// <summary>
/// An actor that needs to refer to stage to know what behavior to execute
/// </summary>
/// <param name="stage"></param>
public Actor(StageApp stage)
{
m_StageApp = stage;
m_Property = new Random().Next();
}
/// <summary>
/// Execute according to stage settings
/// </summary>
/// <returns></returns>
public int Execute()
{
return m_StageApp.SharedSetting * m_Property;
}
}
}
namespace AppExe
{
using AppLib;
class Program
{
static void Main(string[] args)
{
StageApp app = new StageApp();
app.SharedSetting = 5;
// Question: How to add actor to stage?
foreach (var actor in app.Actors)
Console.WriteLine(actor.Execute());
}
}
}
質問
Stage
循環依存がありActor
、私には悪いようです。たとえば、俳優をステージに追加するにはどうすればよいですか?
Actor()
ユーザーに自分で新しいものを作成させる場合、ユーザーはを提供し続ける必要がありStage
ます。
Actor()
内部コンストラクターを指定してファクトリを作成するStage
と、ユーザーが継承されたを作成するための柔軟性が失われますActor
。
シングルトンを作成Stage
する場合、1セットしか持てませんSharedSetting
。Stage
ユーザーが自分の中に複数を必要とする場合AppExe
、それを行うことはできません。
上記の問題を回避するためにアーキテクチャを再設計する方法はありますか?