...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

脱Stateパターン

状態で分割するのではなくて処理で分割したらこんな感じにしたらいいのかなーと思って書いた.
でも別の処理と競合しそうかなあ.

import std.stdio;

//ライブラリここから
interface IForm
{
	void onDraw();
	void onMouseMove();
	void onMouseDown();
}

class Form : IForm
{
	public void onDraw()
	{
		foreach(dg; draw) dg();
	}
	public void onMouseMove()
	{
		foreach(dg; mouseMove) dg();
	}
	public void onMouseDown()
	{
		foreach(dg; mouseDown) dg();
	}
	
	public void test()
	{
		// 実際にはメッセージループでイベント駆動されます
		onDraw();
		onMouseMove();
		onMouseDown();
	}
	
	public void delegate()[] draw;
	public void delegate()[] mouseMove;
	public void delegate()[] mouseDown;
}

class Application
{
	static void run(Form f){ form.test(); }
}

// ライブラリここまで

// フォームの上でのドラッグアンドドロップを実装したいなー

// フォームに必要なイベントをドッキングするクラスを作りましょう
class DragAndDropHandler
{
	private Form form_;
	public this(Form form)
	{
		form.draw ~= {writeln("draw");};
		form.mouseMove ~= {writeln("mouse move");};
		form.mouseDown ~= {writeln("mouse down");};
	}
}

class MainForm : Form
{
	// ドラッグアンドドロップの処理がこのクラスに集約されてる
	private DragAndDropHandler dndHandler_;
	public this()
	{
		dndHandler_ = new DragAndDropHandler(this);
	}
}

void main()
{
	Application.run(new MainForm());
}