トップ «前の日記(2013-09-15) 最新 次の日記(2013-09-17)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2013-09-16

_ NETでメタプログラミング

例によってアスキーの鈴木さんから、メタプログラミング.NETを頂いたので適当に読んだ(適当なのは半分は知っている内容で、後の半分はとりあえず使うつもり無いからだ)。

本書は、.NET Frameworkで、DSLを作ったり、動的な仕組みを導入するフレームワークを開発したりするための、各種インフラと利用方法について説明した本だ。

全体は3部構成で、付録にはWindows8アプリケーションの制限(リフレクションですらTypeが強く制限されていて代わりにTypeInfoを使う必要がある)と、1ページしか無いがどのテクニックをいつ使うかの表(.NETではメタプログラミング用に7つの方法が提供されている上に代替言語を利用するなどの2種類のオルタネイティブがある)が付いている。

7つの方法を以下に示す。

当然、それぞれに1章が割り当てられている。僕はこの中ではリフレクションとEmit、CodeDOM、DLRは使ったことがある。式ツリーはあまりに面倒なので(式ツリーを作るためのDSLが必要なくらいだ。ならば普通にLINQを使うし、プログラミング言語C#の記法は好きなので、直接ラムダ式を埋め込むほうがより好みだ)使う気にはならない。Cecilは本書ではじめてちゃんと内容を知った(Monoで使いまくっているのは知っていたけど、それだけのことだ)。

翻訳はロングテール長尾さんで、安定した読みやすいものになっている。ただ、言葉じりをとらえられてぐだぐだ書かれたりするのは面白くないからだろうけど、コミュニティによってブレ(日本語の訳語が複数あったりカタカナにしたり決定されていない)がある各種用語については初出の脚注で、辞書的な意味やカタカナを使う場合と日本語を使う場合についての使い分けについて説明している(基本的にはカタカナを使っているが、翻訳書を読んでいる多くの読者は、そもそもそのカタカナが通じない可能性があるわけだから、元の綴りと辞書的な意味を示すのは良いことなのだろう)。

メタプログラミング.NET(Kevin Hazzard/Jason Bock/長尾高弘)

この本の最初のほうの囲みに、僕は不勉強にして知らなかったがSOLIDという言葉が出てくる。それがOODの5原則だというのだ。単一責任、オープンクローズド、リスコフの置換、インターフェイス分離、依存関係逆転の5つの原則の頭文字だそうだ。で、本書では相当SOLIDを意識しているのだが、その囲みでI(Interface Segregation Principle)とオブジェクトの凝縮度について矛盾していると考える人もいるだろうが、中庸が大事というようなことを書いている。

でも、それはちょっとひっかかる。凝縮度は実装の問題で、インターフェイス分離は利用の問題で、界面が異なる問題ではないか? 中庸がどうしたということとは違う話だ。初期実装では凝縮度を高めることで実装の速度を上げることができる。一方、変える場合は高凝縮のプログラムは問題を生む。そのために、利用側に対しては適度に分離したインターフェイスを提供し、実装の変化が利用側へ影響しないようにする(ことができる)。あらかじめ未来に必要となるモジュールの分割はせず、しかし仮に分割が必要となっても利用側に影響を与えないようにするためにはISPが必要となる(あるいは、ISPではなく部分的にコンポジションへ変えることでも同様な効果を持てるが、特に追加が必要となる場合にインターフェイスを分離しておくほうが、後からの追加には強いと思う)。

しかし、同じアスキーの黒い本だが、メタプログラミングRubyとはずいぶんと雰囲気が異なって、おもしろい(原書はお互いに全然関係ないので異なって当然ではあるけど)。

メタプログラミングRuby(Paolo Perrotta/角征典) (こちらは随分と軽快な語り口)

_ 2つのメタプログラミング本の違い

Rubyのほうは、仮想職場でのケーススタディを通してメタプログラミングがどのような状況で必要となり、それによってどのような効果が得られるかを示してから、実際のコードへ進む。

それに対して.NETはメタプログラミングの効用は自明のものとして、どのような技術があり、どのように使うかを説明する。

この違いはコミュニティカラーに関係するように見える。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|

ジェズイットを見習え