漫画とかロックとかを卒業するっていうのは理解しがたい感覚だ。俺としてはじいさんになってもゴリゴリのヘヴィメタルとかバギバギのエクストリームメタルをかけて YEEEEEEEEEAAAAAAAAAAAAAAHHHHHHHHHHHHHHHH!!!!!!!! とか叫んでいたいんだけど。
物は試しということで家計簿を付けてみようと思う。日付、商品名、値段、分類あたりを適当に。無駄に SQLite とか使ってみるか? いや、それは面倒臭い。テキストファイルでいいか。
モジュール一個書いたらドキュメントを書くというのではダメだ。関数かクラスを一個書いたらドキュメントを書き始めないと億劫になる。
アスペクト指向って未だにその実態がよくわからないのだけれど、例えば簡単な関数呼出のロギングだけなら Python の decorator で次みたいに書ける。
def logging(f):
def wrapper(*args, **kwds):
print 'Call:', f.func_name
return f(*args, **kwds)
wrapper.func_name = f.func_name
return wrapper
@logging
def somefunction(...):
...
アスペクトの利用方法で提案されているもののいくつか (もしかしたら全部? 読み込んでないのでちとわからん) は decorator で実装できるのかも。というかそもそも、動的言語は多少なりともアスペクト指向っぽい機能を持っていると思うのだがどうだろう。
ところで、オブジェクトの生成の遅延 (Proxy パターンだっけ?) は Python だと次みたいになるかな。
def proxy(klass):
class proxy_class(klass):
def __init__(self, *args, **kwds):
self.__args = args
self.__kwds = kwds
self.__instance = None
def __getattr__(self, name):
if not self.__instance:
self.__instance = klass(*self.__args, **self.__kwds)
self = self.__instance
return getattr(self, name)
return proxy_class
class Test:
def __init__(self, x):
self.x = x
def add_x(self, var):
self.x += var
test = proxy(Test)(1)
print test.x # 1
test.add_x(10)
print test.x # 11
print test # proxy_class のインスタンス
print isinstance(test, Test) # True
proxy 関数一つであらゆるクラスの生成を制御できるのがポイント。オーバーヘッドが当然でるから、使うにはちょっと注意が必要か。というか大雑把過ぎるなこれは。普通、特定のメソッドに反応して生成とかだよな (委譲して問題ない奴は委譲すればいい)。