15 min/d

ぼうずやのにっき

bouzuya/mr-jums の進捗

bouzuya/mr-jums をいじっている。外から見たときの機能としては変えないままに、内の実装を変えようとしている。まだまだだ。

いくつも気になるところがある。ひとまず StateStateData を、 StateSerializedState に変えようとしている。

server-side と client-side での通信時のみ SerializedState を使い、それ以外は State を使う。送信時に serialize()SerializedState へと変換し、受信時に deserialize()State へと変換する。

ほかに EntryViewer という class を使っていたのだけど、これをやめた。いくつかの理由がある。 this を意識させられるのが嫌だ。操作 (method) のために new を必要とするのが嫌だ。素の objectfunction のほうが扱いやすい。

脱線するが、 TypeScript の structural sub-typing を最近は邪魔だと感じている。互換性を持ってほしくないものを互換性のあるものとしてみなしてしまうし、構造を露出させてしまう。たとえば次の場合に困る。

interface FooId { value: string; }
interface BarId { value: string; }

本来はまったく別の Id として扱いたいが、構造で判定されると同じものになってしまう。たまたま内部構造が同じものを互換性のあるものとして見なされてしまう。

そこでやむを得ず _type: 'foo-id'; のような property を追加してごまかしている。これで互換性のないものとして扱われる。無駄はあるが、安心感はある。もう別の言語を使うべきだと感じる瞬間だ。