週明けに掲載した
由羽氏とのスクリプト談義は、一般的なVRMユーザーには難解であったと思うし、誤解を招き兼ねない内容でもあったので、少し解題しておこうと思う。
先に結論を書いておくと、現時点において、私(=ghost)は由羽氏の不満に共感できるが、それ以上にVRMスクリプトの実装は「意外にも」優れていると考えている、未だ完成には遠く、発展途上であることは疑いないのだが。なお、これは由羽氏の考え方が間違っている、という意味ではない点にご注意いただきたい。
広義の意味での構造化プログラミングに馴染んでいる方であれば、由羽氏の主張は理解できると思う。大雑把にまとめると、氏の提起している問題点は2つに集約することができよう。第一に「冗長なコードが各所に分散されること」であり、第二に「ユーザーがVRMに何かを命じる場合の流儀と、VRM自身=スクリプトがVRM(のオブジェクト)に何かを命じる場合の流儀が異なること」である。
第一の点は、たとえば以前サンプルを示した
「列車種別に応じて自動的に切り替わるポイント」を作る場合、まったく同じ動作(たとえば、特急だと主張する編成は反位側へ通す)をするすべてのポイントに、まったく同じスクリプトをコピーして歩かなければならない、ということである。冗長な記述(まったく同じコードが複数存在する)は構造化プログラミングでは最もタブーとされる行為であり、これに抵抗を感じる人は少なくないだろう。
第二の点は、少し説明が難しい。「ユーザーがVRMに何かを命じる」というのは、すなわちスクリプトの命令である。スクリプトの命令は、自分の動作を詳細に決定するために変数や直値を引数として要求する。たとえばSetVoltage命令が電圧を示す小数型の変数を必要とするように。これに対し「VRMがVRMに何かを命じる」というのは、すなわちスクリプトがメソッドを実行する場合である。このとき、メソッドに引数を渡すことは出来ず、メソッド自身が自分の動作を詳細に決定するための値を調べることが要求される。先の例で言えば、ポイントのメソッドが自分で通過した編成の列車種別を示す変数を参照しなければならないことがこれに当たる。由羽氏が「オブジェクト間の値の投げをさせて欲しい」と言っているのは、「メソッドが自分で値を調べにいくのは嫌だ」と読み替えることが出来る。
実はこれは第一の点の裏返しとも言える。氏の「美意識が欠如している」という発言に表れているように、氏がVRMスクリプト体系の比較対照にしているのはC言語のような、上位構造と下位構造を相似形で記述できるプログラミング言語であろうと思われる。このタイプの言語では、それ自身がデフォルトで有している命令とユーザーがサブルーチンとして追加したそれは、本質的に見分けがつかない。一方でVRM4スクリプトでは、ユーザーが記述したメソッドにそれが記述されたオブジェクトに対する特化が求められるため、オブジェクトと独立した「機能」だけを抽出した部品化が(不可能ではないが)困難である。従って、機能は似ているのにそれぞれのオブジェクトに特化して微妙に差異のでたコードが各所に分散されてしまうことになる。
かく申すghostも、VRM4スクリプトに対する初見の感想はまったく上記の通りであった。そして、これは(私が勝手に考える)VRMの基本理念に反するのではないか、とすら考えていた。
ここでいう「VRMの基本理念」とは、一言で言うと「試行錯誤可能な鉄道模型レイアウト作成ツール」に尽きる。拙Web
「VRM→N」や拙著
「鉄道模型シミュレーターレイアウト設計と製作」において論じていることであるが、VRMの最大のメリットは仮想モデルであるがゆえに物理モデルでは困難なトライ&エラーが容易であり、鉄道模型レイアウト設計をより深化可能であることだと思う。
このことと、スクリプトの冗長分散配置は真っ向から対立している。ある程度以上複雑な自動運転制御を実現しようとすれば、そのコーディングには試行錯誤が必要となるが、コードが冗長分散していると、途中でベースに据えたロジックに問題がみつかった場合や機能を拡張したくなった場合、とんでもない手間を要することになる。もちろん不可能ではないが、それに耐えられるだけの抽象思考能力と、なによりも「暇」を持て余す人間が、そんなに多くいるとは思えない。
これを逆に捉えると、VRM4スクリプトを使ってある程度以上複雑な自動運転制御を実現するにあたっては、レイアウト作成やコーディングに着手する前に、明確な完成像のビジョンを持っていなければならない、ということだ。そしてこれは、以前においちゃん氏が述べていた
「VRMレイアウトを設計するツールが必要だ」という無限ループと本質的には同じ話である。そういうツールが必要だと感じるユーザーに問題があるのではない。ユーザーにそういうツールの必要性を感じさせてしまうVRM側に問題があるのだ。
と、書いておいてなんだが、冒頭にも述べたように現時点で私はVRM4スクリプトの実装は、結構優れていると考えている。なぜそう思うのか、そして今後の課題は何か、については、随分長くなったので明日に譲ろう。読者諸氏におかれては、拙者が何を言い出すのかを予想しつつ24時間ほどお待ちくだされ。