Diary?::2006-04-03

06:21

初出勤。

21:03

今帰った。流石にこの距離を通勤すると、かなりの時間のロスになるな。往復で 3 時間強。まあ来月下旬あたりから一人暮しをする予定なのだが、それはあくまで予定だしな。

それまではこの怪文書はともかくとして、プログラミングやギターの練習の時間をどう捻出するかが問題だな。今後は確実に月曜日から金曜日は 21 時前後に帰宅するとして、飯と風呂で 1 時間消費するはず。そして遅くとも 0 時には寝なければならないから、 Web とプログラミングとギターを 2 時間以下で分割するのか? 優先順位は Web 、ギター、プログラミングの順だな。実際にコードを書くのは週末にドカッとやった方が良いかもしれないし。

23:16

でまあいつも通り Python で似たような事が出来やしないかと画策するわけだが。

def dbc(req, ens):
	def dbc_instance(f):
		def dbc_main(*args, **kwds):
			req(*args, **kwds)
			r = f(*args, **kwds)
			ens(r)
			return r
		return dbc_main
	return dbc_instance

class Foo:
	def _pre_foo(self, x, y):
		assert x > 0 and y > 0
	
	def _after_foo(result):
		assert result < 10

	@dbc(_pre_foo, _after_foo)
	def foo(self, x, y):
		return x * y

f = Foo()
print f.foo(3, 2) # 6 が表示される
print f.foo(-2, 5) # エラーになる

ここでの dbc(req, ens) は、 事前条件をチェックする関数 req と事後条件をチェックする関数 ens を取り、実際に実行する関数 f を取る関数を生成している。これならまずは事前 / 事後の条件を書くという契約駆動っぽいものになる……んじゃないかなあ。いまいちアスペクト指向も契約も馴染みが無いので、もの凄い思い違いをしているのかも。

しかしこれはダサいな。何がダサいって、事前条件には self があるのに、事後条件には self が無い。これは酷いな。ああそうか、こういう時にメタクラスを使えば良いのか。メタクラスを使って _pre_... と _after... を持つメソッドを片っ端から走査して処理すれば、なんとかなりそうな気がする。

今日はもうこれ以上ろくなアイディアが浮かびそうもないので、続きは又明日。でも明日起きたら忘れてそうなので、とりあえず思い付いたことを書いておく (いつも以上に支離滅裂)。

俺が思うに契約プログラミングというのは、「こういうデータは要らない」「ああ、変わりにこういうデータをやるよ」というもの。そしてそれが複数の処理に対して似たような契約が成り立つ場合、多分それがアスペクト指向っぽいものになるのだろう。

ということはつまり、複数の事前条件と事後条件を定義できた方が都合が良いということになる。だからさっきの俺の実装はベストでは無い。多分。

Python では関数だろうがメソッドだろうが大抵のものには自分で好き勝手に属性が付けられるので、メソッドに対して __require__ とか __ensure__ というスロットを勝手に作って、そこにチェックしたい条件を入れるというのがいいのかもしれない。このときメソッド本体はやはり弄らず、デコレータかメタクラスでチェックするのがいいだろう。

実装は又明日。

23:57

結局ギターは適当にスケール弾いて運指の鍛錬だけで終わってしまった。でもやらないよりはずっとましだ。

もう寝る。

Written by Kuwata Chikara
Creative Commons