interfaceとchannel
[tag:]
このところstのリファクタリングをしている。
guiのライブラリを入れ替える際に、あるinterfaceを
実装すればよい状態にしておくとスムーズだからだ。
こういう作業をしていると、interfaceの方式が必要十分なことが
よく感じられる。
描画するためのDrawer interfaceを用意しておけば、
iupだろうがgxuiだろうがshinyだろうが移植の手間はわずかだし、
pngやsvgに書き出す部分もほぼ共通部分のみになる。
構造体に構造体を埋め込めるので、あるinterfaceを実装した構造体を
guiライブラリに依存しないかたちでつくっておけば、それを埋め込むだけでよい。
アンドゥ/リドゥ、部材選択、コマンドの仕組み等をその方式に置き換えた。
コマンドに対応する際に問題だったのが、コマンド実行中の部材や節点の選択を
どのように伝えるかだったが、channelがとてもうまくはまる。
最初にiupで実装したとき、コマンドはすべてコールバックを書き換える方式で
状態を管理していたが、この方式であれば呼び出し側に必要なのは
「現在コマンドを実行中かどうか」という管理だけで、実行中ならchannelに
部材や節点を送るだけでコマンド側でよしなにやってくれる。
golangは結構好みがわかれる言語かもしれないが、
必要な部分ではさらっとすごいことをやってくれているのがさすがである。