kr_ryo 徒然日誌 <2003年8月10日分>

三國志製作記28〜オブジェクト指向再び!〜

夏とともに早速台風もやって来ましたね〜私の住んでる近畿地方に上陸&直撃!という事前予報に、前日の金曜なんて慌てて帰ったりしてたものですが、台風一過、たいした被害もなかったです(^o^)今日は青空、昨日からなぜか寒かったんですが、だんだん暑くなって今日は真夏って感じです(^^;A

さて今週はお出かけした後これを書いていますので、実は三國志製作が進んでませんm(__)m来週は2周年記念なんですが、これといった目玉がなく(;_;)三國志製作も3周年記念に間に合うのか?という体たらく(^^;;;

ただし、そろりそろりと暇を見つけて普段からプログラムは組んでいたりします( ̄^ ̄)先週の日誌で、とりあえず内政=げしげし数値あげる、という図式をつぶしてみましたので、その根拠となる役職任命部分を作っています。

こういうプログラムって、1つだけルーチンを作れば後はコピペで適当に修正すればいいんですよね。まず軍師、それから都尉っと…

けれども、そう簡単にはいかないのもプログラムの恐ろしさ(~_~;色々な問題が持ち上がりました。

まず、表示系操作系重視の私は、以前お話した通り、まず武将を選択してその能力等を表示させる機能を作りました。SWGの時と同様、城を表す旗をクリックして、その城の武将をリスト表示させ、選択することで表示するというものです。

その上で、武将をリスト表示させ、選択した武将をたとえば軍師に任命するという部分、ちょっと考えたらほとんど武将の能力表示と変わりません。共用すれば楽ですよね〜(^o^)

ということでくっつけてみましたが…リストから選択された武将をただ能力表示させるだけなのか、軍師に任命するのか、都尉に任命するのか、という風に場合に分けて作っていくと、どうも一つの部品となる手続(プロシージャ)がだんだんでっかくなります(*_*)3つでこの程度なのに、任命する役職はざっと100程度あります(^^;;;ひとつひとつ部品を作っていってもいいですけども、どうも効率が悪いような…なんとかまとめたい気がしました(^^;A

逆に、任命だけなら任命だけで機能をまとめた方がいい事態も出てきました。任命部分が厚くなればなるほど、表示部分の機能が意図していない方向に進んでしまったりするようになるのです。たとえば、任命直後に能力表示すると、任命部分の機能が干渉して正しく表示されなかったりというエラーも出だしました(*_*)

さて、効率よくかつエラーを出さないプログラミング方法はないもんかしら…と考えてみまして、そうそう、それってオブジェクト指向がそれだったような…?と思い出しました(^o^)前から読んでいた『カンタン!Delphiプログラミング』などでも、プログラムを、ひたすらコマンドを連ねて一つのファイルに何万行の世界に行くんでなくて、機能ごとに別のファイル、別の手続に分割していくべし、とありました。イメージとしては、昔はやった?目覚ましがなると鳥が騒ぎだし、籠が揺れてボールが落ち、落ちたボールが卵を押し出し、押し出した卵がフライパンで割れて…といった順送り自動?機械のような何万行の世界が手続重視のプログラミング。それに対し、コンデンサやスイッチのように、一つ一つの部品は独立した性能機能を持っていて、それを組み合わせてラジオやテレビができるというのがオブジェクト指向プログラミング、みたい、です(^^;

以前から何度かわかった?風に書いてきましたが、実はやっぱりいまいちよく分かってなかったりします(^^;A一度オブジェクト指向の真髄を見極めてみたいと、ムラっ気ある私、実際のプログラミングをとりあえず置いて(^^;A本屋に行ってみました(^^;;;

JAVAがオブジェクト指向言語のせいもあって、オブジェクト指向の本は大きな本屋では独立して並んでますねえ〜ただ、何冊か手にとったもののよくわからない、というのが本音ですね(;_;)もうちょっと簡単にわからないもんでしょうかねえ〜(^^;A

さらに何冊か取ってみて、総合してみて、なんとなくわかったことは…まず、オブジェクト指向は機能機構であるとともにそういう発想であるということです。プログラムを、ひたすら色々な流れに沿って順を追って記述するという発想、すなわち手続指向型だと、あらゆる場面を想定してそれぞれの道順に沿って記述されていくので簡単に何万行の世界になります。その副作用として、どこからどこへつながっているのかよくわからなくなり、どれとどれが関連しているのかわからなくなり、ある不用意な一行の命令だけでエラーが出て、原因が全くわからなくなると批判されています。

私もSWGを作っていたときに、一時的に使用する変数に「a」や「i」などの簡単な名前を使っていました。ところが、実はその内容が結構後々まで使う必要が出てきて、それをそのまま放置してしまうこともよくあります。それなのに、別の部分で「a」や「i」を使っていて、同時にそれぞれの部分が使用されたことによって数値の内容が変わってエラーを出し、そのエラー修正というか、いったいどこが間違ってるんだろう?とえらい苦労をしたなあ、といったようなことを思い出しました(^^;

それから、オブジェクト指向はできるだけ機能を独立分割して作っていくという発想です。これは同じ機能の記述の重複を避けて見やすくしようという私の指向にマッチします(^-^)ある本の中では1つの部品を作った後、別の似た部品を作るのにコピペしてしまうと、70%同じで30%異なる内容というプログラムの部品ができやすい、私なら70%部分をまとめて別の部品にしてしまうとありました。いやあ、反省ですねえ〜(^^;Aわかってるつもりの私も、先程の軍師任命部分から都尉任命部分をコピペしてましたが、確かにほとんど同じです。80%以上共通なので、組み立て方をとにかく共通化すれば、同じようなプログラムを100作らなくてすみます。まさしく「発想の転換」ですね(^^;A

オブジェクト指向は発想だから、その発想の転換が最も難しいという話もありました。手続指向型で慣れると、順番に順番に順番に次々命令を書き進めがちです。これがオブジェクト指向だと、必要な機能のための部品を作り、部品から部品へ処理を流すイメージになります。今現に書いていたプログラムを見直すと、やっぱり順番に順番に処理が流れていて、ひとつの機能部品が異様に大きくなったりしています。これも、まとまった機能をもった部品の組み合わせという発想からでなく、順番に順番に処理を流していこうとする発想の賜物ですね(^^;

ということで、早速発想を転換させて、機能をまとめてできた部品を組み合わせるという方向に変換しました。多少はできるようになったんでしょうか?まだ、なんとなく違和感がありますねえ〜(^^;Aただ、確かにひとつの機能において付随する機能部分を次から次へとくっつけていくと、本流がどれかわかならないくらい複雑になります(--;)本流は本流、支流は支流で分けていくオブジェクト指向を目指してわかりやすく作っていきたいと思います(^-^)

ということで今週はここまでm(__)mまだ思いつきの段階ですが、ゲームルールの方で、命令実行のあり方変更とか、武将の身分の二重化複数化といったアイデアがありますけども、この話題は来週以降に持ち越します。ううん、どうやら2周年記念特別企画はなさそうな(^^;三國志製作が続くだけじゃろうか…(^^;;;

index

〔TopPage〕

このページへのリンクはフリーです。
このページについてのご意見、ご質問などは、kr_ryo_green@yahoo.co.jpまでお願いします。
Copyright 2003© kr_ryo All rights reserved.
訪問件数