- - PR -
分岐が多数ある機能の実装方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-18 13:52
TADさん、回答レスポンス有難う御座います。
簡単に書くために、「設定値aを見て、AをBに変換する。」と書かせて 頂きました。実際は設定値によって処理そのものが違った流れになります。 分かりやすくと思い簡単に書いたのが、逆に裏目に出たようです。 申し訳御座いませんでした。
たしかにこの方法でも、実装は可能ですしメンテナンス性もさほど悪く ならないかと思います。しかし、よりスマートな方法はないのかと 模索しております。 そして、パスの数がかなり多いので良い方法ないのかと思い、今回質問 させて頂きました。 | ||||||||
|
投稿日時: 2007-06-18 14:07
では、チェインではどうでしょうかね。
…と思ったけど、100もチェインするのはさすがに多いですね; ループはそれとして、順次呼び出す…かなあ。 [ メッセージ編集済み 編集者: mio 編集日時 2007-06-18 14:25 ] | ||||||||
|
投稿日時: 2007-06-18 17:05
チェインというのは、デザインパターンのChain of Responsibility のことでしょうか?そうですね、100もチェインするのは厳しいですね。 デザインパターンから何か導き出せないかと色々考えていますが、、、 これといったのはありませんね。 | ||||||||
|
投稿日時: 2007-06-18 17:33
かなり複雑そうですから、アクティビティ図などでモデリングはしているわけですよね。
こんなソースはどうでしょうか。
並列処理などもなさそうなので、アクションとその後の分岐(Decision Node?)を合わせてひとつのクラス(Action)で表現してみました。 モデルとソースの対応関係がはっきりしていてアクションの追加などもしやすいと思います。 | ||||||||
|
投稿日時: 2007-06-18 17:43
プログラムとはそういうものではないでしょうか。すなわち、if/switch があるからプログラムなのではないでしょうか。 たとえば、文字列抽出をするときに、if/switch のプログラムでやるか、正規表現のようなやりかたでやるか、という選択肢がある場合に、正規表現のほうを使いたい、という感じなのかなと思います。正規表現なら、なんとなくですが「メンテナンス性」や「ソースの可視化」というキーワードを実現できていそうな趣もあります。 (「正規表現」はあくまでもたとえです。) おそらく、データーとプログラムの中間に位置しそうなモノを、プラグイン的に差し替えできるような感じで扱われたいのだと思います。本格的なものだと、アプリケーションが自前のスクリプトエンジンを持っていて、ユーザーがスクリプト(マクロ)を書くというのになるかもしれません。そこまでするのが大変だとしたら、プラグインを通常の言語で書いて、アプリケーションにロードする、という感じにすることが多いです。 プログラムはやっぱり、言語なりスクリプトやマクロなりで書かないとどうしようもないんじゃないでしょうか。パラメーターの延長でプログラマブルなことをしようとすると、やはり限界が来ると思います。どの程度、プログラマブルなことをするつもりなのかが分かれ目になるでしょう。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2007-06-18 18:50
単純な if と switch による分岐とオブジェクト指向は関係ないですね。どちらかというと構造化の問題です。まあ、Action のパターンがクラス設計で何とかなる場合ではオブジェクト指向は関係します。そういう意味合いで仰っているのであれば、扱うデータと分岐の関係をもっと明らかにした方が良いかもしれません。
クラス設計 (ポリモーフィズム / Action クラスの使い分け) で何ともならない (もしくは、逆に可読性を損ねる) 場合は、switch での分岐ごとに別々のメソッドに飛ばすなどという単純な方法で考えます。無理に簡素化しようとして可読性を損ねたりすると、それこそ、オブジェクト指向の面からして本末転倒であります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-06-18 19:41
オブジェクティブに考えると、ifやswitchが(ある程度)なくなる方向には、基本的にはなると思います。
が、無理にオブジェクトを作り出してifやswitchをなくそうというのも、違いますね。 ではまた別のところから。 その100もの処理を、ひとつのクラス内で行う必要はあるのでしょうか? 処理をある程度グループ分けできるなら、同じIN/OUTを持つクラスをいくつか並べても良いのでは、 と思いました。 | ||||||||
|
投稿日時: 2007-06-18 19:43
あんまり凝ったことすると メンテナンスが非常に困難な
プログラムになります。 if文とswich文を羅列だとしても うまくクラス化 関数化 構造化 すれば それなりにすっきりします。 |