レガシーコード生産ガイド

私に教えられることなら

SqueakでTodo Board作った

環境はSqueak5.0。

youtu.be

何やったか

Squeak Smalltalkで色々作る題材として、最初はTodoリストを作るつもりだった。が、なんとなく困難に体当たりしたい気分だったので、今まで取り組んだことがないタイプのGUIに挑戦してみることにした。Trelloを結構便利に使っていて、こういう小気味良いインターフェイスを手軽に作れるようになりたいゾ、と思っていたので真似することにした。

結果的に6日ほどかかりだいぶん苦しんだけど、かなり知見が溜まったし次に同じようなの作る時腰を上げやすくなったとは思う。ボード間のやりとりをまだ完全に把握してなくてバグが多そうだし、ウィジェット自体の再利用はちょときついので暇をみつけてリファクタリングの練習もしていきたい。

コードは一応Githubにアップしたけど、ちゃんと整理できてない(PhSketchBookにまとめてある)ので簡単には使えない。。

あとこれのCommitでGithubContributions in the last yearが1000になった。だいぶん適当に書き出してるので、単に継続を視認するだけの利用になってるけど、今の自分にはそれが何よりも大事だと思うので続けていきたい。

知見

  • ScrollPane内ではTranformMorphを噛ましてマウスイベントの座標がおかしくなっているので、クリック時にgrabMorph:をそのまま使っても想像した位置を掴んでくれない。event hand positionは正確なワールド座標を持っているので、event positionとの差を取り、grabさせたいMorphの位置を直前にずらすことで解決した。
  • ScrollPane内部で大きさ変更を通知したいときは、ScrollPaneにsetScrollDeltasメッセージを送るしかないっぽい。
  • ListMorph系はテキストのみを扱うときは便利だけど、それ以外はいろいろと面倒なので普通にTableLayout使って自分でやったほうが楽だった。
  • TableLayoutで、wrapCentering:など指定してるのに位置が中心に寄ったりと変な挙動するときは、セルの大きさが想像と違う。cellPositioning:でセル内部?の寄せを指定する解決法が楽だった。これでいいのかは謎。

Smalltalkについていろいろ

というわけでSmalltalkにかなりハマっていて、そして踏み込む前とかなり認識が変わったのでちょっと記録しておく。

メッセージングによってLateBindingとPolymorphismの両方が成立すると、書くコードとそれによって表現されるプログラムが本物のネットワークになる。理想上はオブジェクト同士のネットワークってことね、と浅い理解だったので、本当にそれを理解したときは衝撃が走った。

それが大事なので、メッセージングが実現できれば今でも好きなS式や後置記法でもいいと思うし、なんとか表現できないかなと考えていた。でもずっとSmalltalkを書いてると「ははあ、餅は餅屋だなあ」と思う事が多々あって、結局今では気に入っている。散々苦手だ苦手だ言ってたcamelCaseにも慣れてしまった。

またメッセージングの観点から見ると、クラスも(おれが苦手な)階層での分類じゃなくて、単に便利にオブジェクトを作る仕組みに見えるようになった。プロトタイプベースの方が純粋なオブジェクト指向なのでは?とか思ってたけど、純粋さというか絶対に欠かしてはいけないのはメッセージングで、何ベースかはあんまり関係無いし、クラスベースの方が便利だし好きだなあと今では思っている。(なのでやっぱりいつかこの考え方も変わるかもしれない)

そして一旦「全てがオブジェクト」を理解すると、いろいろな物の見方も変わった。ここからはまだ確信してないから書かないでおこうと思う。少しだけわかる人にわかってもらえるように書くと、コードを1/10にする道はコードを0にする道に繋がっていないと思う。文字だけでの表記やファイルベースの環境にもこだわってちゃダメだ。

SqueakやPharoなどのSmalltalk環境にも現時点で不満は少しずつある。でもどれも「ナントカMorph使いづらいじゃん!」とかの誰かが作ったオブジェクトに対する不満であって、我慢できなければ自分で作ればいいと考えてるし、ああもうおれはメッセージングという考え方からは逃れられないんだろうなあという心境。

というわけでSmalltalkめちゃくちゃ楽しいので、次は凄腕Smalltalkerの脳をチューチュー吸って叡智を我が物にするためのストローを作りたい。

広告を非表示にする