@kyanny's blog

My thoughts, my life. Views/opinions are my own.

破れ紙の片割れのようなMixinができてしまうワケ

最近「Mixin は避けられれば避けたほうがよいのではないか」と思い始めている。扱いに困るダメ実装の Mixin を簡単に作れすぎてしまうからだ。

Wikipedia の定義によると、

mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。

とのことなので、そもそも Mixin される側の実装と結びつきが強くなるのは仕方ないのだろう。しかし、まれにだが破れ紙の片割れのような実装を持つ Mixin ができてしまうことがある。

一枚の紙を適当に手で破って二枚にする。断面はギザギザだが、破った二枚の紙の断面はぴったり一致する。もともと繋がっていたものを切り離したのだから当然だ。だが破れ紙の断面にぴったり合うような別の紙を用意するのは簡単ではない。別の紙を合わせる必要があるのならば、紙を破るときにそれを見越して断面がギザギザしないように注意深く破っておかなければならない(実際には、破るのではなくハサミかカッターで切って断面が綺麗になるようにすべきだろう)

ダメな Mixin は破れ紙の片割れに似ている。 Mixin される側と合わさって初めて用をなすが、断面(インタフェース)がギザギザに入り組んでいるので、新しく Mixin を適用したいクラスを作るのが非常に難しくなる。コードの再利用を促進するためにわざわざ別のパーツとして分割したのに、そのパーツの組み込み方が難しくて再利用したくてもできない、なんてことになりがちだ。

なぜそんな Mixn が出来上がってしまうかというと、もともとひとまとまりになっていた実装の一部を深く考えずに抜き出して Mixin へと分割してしまうからだ。ひとまとまりのコードを書いた本人はそれらのコードがどのように相互作用しあって動作するかよくわかっているので、分割後のコードもうまく脳内で組み合わせてすんなり読める。だから、他人の目からみると密結合していて分割できそうにないようなコードであっても分割できてしまうのだ。

不運なことに、継承や Mixin などはオブジェクト指向プログラミングにおいて一般に良い設計手法とみなされている。なので、上記のようなダメ設計・ダメ実装の Mixin であっても、「Mixin という良い手法を使っているのだからこれは良い設計・良い実装だ」という誤った大義名分が幅をきかせやすい。ちょっと無茶だな、と思っても、そういう感覚は個人の感性・センスによる部分が大きいので言語化しづらく、したがってレビューでも指摘しづらい。「手法は良いがお前の設計・実装が悪い」と単刀直入に(しかも相手の気分をなるべく害さず)言うのは難しい(特に英語だと)。

これはあくまで特定の Mixin の設計・実装が悪いだけであって、 Mixin という手法そのものには利点がたくさんある。そこに異論はない。だが、 Mixin は便利で強力な分、再利用性と可読性の高い Mixin を設計・実装するには相応の能力やセンスが求められる。にもかかわらず能力不足だったりセンスが悪いひとの手によるイマイチな Mixin が作られてしまってうやむやのままコードベースに根を張ってしまうのは避けたい。という悩みが冒頭の「Mixin 避けるべきでは」という疑問につながる。

ではどうすればよいかというと、移譲が使えるのなら移譲すればよく、そうでなければ再利用を諦めてコピペするのも悪くないのでは、という気がしている。そもそも汎用的に使えるほど一般化したユースケースを見極められていないからインタフェースが破れ紙のギザギザになってしまうわけで、そういうコードは無理やり引き剥がさず混然一体とした状態のままにしておくほうがよいのではないか。経験上そういう箇所は変更の機会が多いので、ほどなくして「似ているが異なるもの」として分岐していくことが多いし、時間が経ってもずっと分岐せず重複したままだったらその時点で改めて分割したほうがよりよい切り離し方ができるはずだ。

DB Weekly issue 58

DB Weekly Issue 58: May 15, 2015

Khan Academy Computing: New course: Learn SQL interactively on Khan Academy

コース最初の SQL basics トピックをやってみた。インタラクティブエディタはよくできてて面白い。 CREATE TABLE するとテーブルスキーマがプレビュー表示されるのはわかりやすい。あと INSERT 文を書いたあとで数字を変えると SELECT の結果も自動的に変わるとか、これも面白い見せ方だと思った。手続き型プログラミングに慣れているとちょっと奇妙に感じるけど、むしろこれは表計算っぽい見せ方で、そのほうが一般には理解しやすいということなのだろう。ただ説明自体は英語だからというのもあるとは思うがあまりわかりやすいとは感じなかった。

人工知能は人間を超えるか ディープラーニングの先にあるもの

すごく面白かった。人工知能研究の歴史とそれぞれの時代の課題がとてもわかりやすく解説されていて、まさに「本には先人の叡智が詰まっている」を体現した一冊だと思う。機械学習とディープラーニングがなぜ今注目されているのか、それらの技術のどこにこれまでと違う強みがあるのか、そういう専門的な内容も易しく説明されており、良書だと感じた。

ただ、副題にもなっている第6章、そして終章は、日本の人工知能研究を背負う立場もあるのかやや大局的な話になってしまい、5章までの充実した内容と比べると息切れした印象を受けた。それから、 Kindle 版の表紙イラストはちょっと「オタク(サブカル)」っぽすぎて、せっかく良い本なのにアニメ絵のせいで敬遠されたらもったいないな、と思った(実際、自分もなんどか Amazon のおすすめ等で見かけて興味を持っていたものの、表紙をみて買うのを躊躇していた)

しかしあとがきを読んで、この著者こそがあの、女性メイドロボット表紙イラストで炎上した「人工知能学会誌」の編集委員長をまさにその時やっていた人だったことを知り、この表紙も確信的に狙ってやっているのだな、と合点がいった。

人工知能は人間を超えるか (角川EPUB選書)

人工知能は人間を超えるか (角川EPUB選書)