アンケートシステムの番外編です。番外編を書く暇があったら、アンケーシステムを完成させろよと言われそうですが、気にせず書いていきます。
レベルの付け足しと今後のプログラミング記事の記事で、アンケートシステムを簡略化すると書きましたが、どれくらい簡略化するかと言うと、一つしかアンケートを出来ないようにします。アンケートごとに関する表示を作成するのが面倒くさいので。メニューにするとこんな感じです。
1.アンケートの作成
2.アンケートの投稿
3.項目の一覧を表示
4.アンケートを削除
「1.アンケートの作成」で作成又は修正する感じです。作り的には、後々複数投稿するシステムに変更するのに、それほど難しくない作りだと思います。Rubyでプロトタイプをぼちぼちと作成しているのですが、作成して思った事を今回の記事では書きます。
Javaで作成する事に慣れているので、やはりオブジェクト指向で考えてしまいます。Rubyもオブジェクト指向ですが、Javaとは違う箇所やJavaの作りでは出来ない処理も出来てしまいます(Rubyではそのような作りになっているので当然ですが)。
Javaでは、すべての作りがクラスで作成するようになっています。ちょっと待てよ、インタフェースは?と思う方もいるかと思いますが、インタフェースでは処理は作成できません。C言語でも、C言語はすべて関数で作成されているといった場合に、ヘッダファイルやマクロ等があると反論しないと思います。実際マクロや構造体を処理するのは関数の中ですから、C言語はすべて関数で作成されているのだと言えます。マクロの定義は、オブジェクトファイルですべて置き換わっていますし、構造体はメモリ上に領域が確保されるだけです。
今、考えているのは、画面の情報を画面フォームオブジェクトに格納し、実際処理を行って、DBに格納するポーターオブジェクトに代入します。ポーターオブジェクトを使いDBで処理を行います。DBからデータを取ってくる場合は、この考え方の逆で行います。列挙すると以下の感じです。
1.画面から情報を受け取り、画面フォームオブジェクトに格納する。
2.画面フォームオブジェクトのデータを使い、処理を行う。
3.画面フォームオブジェクトをポーターオブジェクトに代入する。
4.ポーターオブジェクトのデータを使い、DAOでDBの処理をする。
上記の考えは、MVCの考え方や三層構造の考え方です。
画面フォームクラスは、画面の情報を基に作成されます。画面とプログラム(VIEW)のデータの橋渡しです。変数名や日本語名は画面名から導き出します。画面が変更されれば、画面フォームクラスも変更されます。又、DBのテーブルや項目の変更に影響されません。
ポータークラスは、DBの情報を基に作成されます。DBとプログラム(DAO)のデータの橋渡しです。変数名や日本語名はDBのテーブルや項目から導き出します。DBのテーブルや項目が変更されれば、ポータークラスも変更されます。又、画面の変更に影響されません。
作りとしては、オブジェクト指向の考え方に合致していますね。
考え方として問題となっているのは、処理の部分です。オブジェクトで共通する処理がある場合を考えていきたいと思います。Javaでは、共通した処理を使いたい場合に、しばしば親クラスを作成し、継承させてクラスを作成します。それが、「is a」の関係になっていれば、良いのですが、必ずしもそうとは言えません。本来共通した処理がある場合は、処理だけを独立されてクラス等に使わせる必要があります。Javaなら処理するクラスを作成して、そのクラスを各クラスで使用しても良いと考えているのですが、親クラスで定義させることが多いですね。一般的に言われているユーティリティークラスはそのようになっているのですが...
Rubyでは、Mix-inが利用できます。Mix-inとは、モジュールをクラス等に取り込むことで、クラスならクラスで定義したメソッド等と同じように操作できる事です。このため、クラス間で共通の処理がある場合は、モジュールで作成し、各クラスが共通のモジュールを取り組めば良いことになります。その事により(Javaとは違い)、無理やり継承(is aの関係)させる必要はなく、共通処理を行わせることができます。この考えは、オブジェクト指向の「has a又はpart of」の関係も実現する事が出来ます。Javaでは、「has a又はpart of」の関係を実現させるには、内部クラスで実現できますが、他のクラスで使用する場合は結局、継承させる必要があります。
又、Javaのインタフェースを適切に利用しているシステムも少ないと思います。インタフェースの役目として、C言語のヘッダファイル(プロトタイプ宣言や定数の作成)、ポリモルフィズムの実現にも利用されなければなりません。
好き勝手に書いてきましたが、理想と現実は違うという事ですね。と言っても、私に理想的な設計できる能力があるかと言われると、勉強中としか答えられませんが。Rubyのアンケートシステムは早ければ今月中に完成させる予定でいます。







