独り言(識別子のありがたさ)

相変わらず、Matlab + Simulink でシステムを組んでいるが、やはり苦戦中である。Simulink はブロック線図を組み合わせて、システムを構築するだが、これは入出力関係で定義された関数を組み合わせて、データフローモデルをGUIベースで構築して、それをベースにモデルの実行モジュールを作成する事に等価だと思う。ある種の MDA (Model Driven Architechure) と言えるだろう。

しかし、この Simulink 使えるデータの種別は Fortran のごとく、整数、実数 などの Primitive と複素数とその配列が基本で、構造体データを扱うに事は直接は出来なかったと思う。C 言語で拡張ブロックを作る S-Function と言う機能もあるので、その中で構造体を定義して、色々と便利を図っても、結局そのスコープはそのブロック内に限定されるので、ブロック間で大域的に複雑なデータ構造を共有するのは難しい。
今、一番しんどいのは、条件・状態に応じて、機能ごとにレイヤを組んで、レイヤ間でデータを渡す際に、送信先のレイヤで適切なブロックを選択する処理の部分である。Simulink では C 言語に模して、if, switch などのブロックも有るが、モジュールとしての粒度が荒いので、少し便利にしようと思うとあっという間に蜘蛛の巣である。*1 今まで JavaC++ でプログラムを組んできた身にしては、このまどろっこしさは相当なストレスに感じる。

結局、何が足りないんだろうか。配列を渡し、その索引番号に意味を定義し、それを確認しながら、なんでこんな事をしなければあかんのかと、自問自答することが多い。結局、オブジェクトを構成する*2 データのまとまりに対して、識別子を設定して、それを活用できないからだろうなと思う。最初は気づかなかったが、送信する配列データに物理量だけではなく、実体を表す識別子の分だけ、1つ余計に次元を取る必要があったのだ。*3 今まで、JavaC++ などのオブジェクト指向言語の場合は空気や水のように自然と定義でき、当たり前のように利用していたから、それに気づかずにいたが、いざ明示的に支援されないと、かなり苦しい。

昔、関数を基本モジュールとした構造化設計に対して、オブジェクト指向がでてきた時に、それこそ銀の弾丸のごとく持てはやされていた時期が合ったが、分かるような気がする。確かに実体を実体のまま、モジュール化して自然に扱えると言うのは非常に便利な物である。改めてそう思った。構造化設計だとデータとオブジェクトの区分けは明確にならないし、それ故に状態管理などのスコープが曖昧で、システムが必要以上に複雑になるケースも多いと思う。少なくとも今のわたしが Matlab + Simulink + C 言語ベースの S-Function で陥っているのは、そうした事態のようだ。

慣れの問題だろうか。しかし慣れる必要があるのだろうか。以前 mixi で Eclipse を使ってJava を覚えると、プログラミングの基礎が疎かになるのかといった論議を投げかけた事があるが、一度はオブジェクト指向外の言語で、オブジェクト指向に挑戦しないとオブジェクト指向の本当の意味での基礎が出来上がらないのだろうか。また昔読んだオブジェクト指向システム開発の本*4 で、Fortran を使う場合の実装手法について書いてあったのを読んだ記憶がある。「へー」と思いながら自分とは全然関係の無い話だと思って読んでいたが、まさかこんな場面で似たような状況に出くわすとは、不思議な話である。こうした事項も基本として知っておくのも悪くないが、業務として考えると何らかの対策が必要だと思うのだが。さてどうしたものか。

*1:GUI で線を引いてシステムを組むので文字通りそうなる。

*2:C の構造体でも同じ事だが

*3:これから改良に入るが、構造化プログラムにおいて、データ構造の変更はかなりコストのかかるものだが、似たような事が待っている。<(;_;)>

*4:書名は失念、誰か心当たりありませんでしょうか?