- PR -

分岐が多数ある機能の実装方法

投稿者投稿内容
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-06-18 13:52
TADさん、回答レスポンス有難う御座います。

引用:

っていうと、実は分岐じゃないんじゃないでしょうか?

普通分岐処理というと、
処理aで設定や処理結果をみて、trueなら処理cへ、falseなら処理dへ
処理cで設定や処理結果をみて、trueなら処理eへ、falseなら処理fへ
処理dで.<略> 処理g, 処理hへ
というように設定や結果によって処理そのものが違った流れになるものを
いうのでは? (合流することもあってややこしいですが)


簡単に書くために、「設定値aを見て、AをBに変換する。」と書かせて
頂きました。実際は設定値によって処理そのものが違った流れになります。
分かりやすくと思い簡単に書いたのが、逆に裏目に出たようです。
申し訳御座いませんでした。

引用:

  • 主処理としては処理a,処理b,処理cの呼び出しを順次記述する。
  • 処理a,処理b,処理cはそれぞれ関数やクラスで記述する


たしかにこの方法でも、実装は可能ですしメンテナンス性もさほど悪く
ならないかと思います。しかし、よりスマートな方法はないのかと
模索しております。

そして、パスの数がかなり多いので良い方法ないのかと思い、今回質問
させて頂きました。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-06-18 14:07
では、チェインではどうでしょうかね。

…と思ったけど、100もチェインするのはさすがに多いですね;
ループはそれとして、順次呼び出す…かなあ。

[ メッセージ編集済み 編集者: mio 編集日時 2007-06-18 14:25 ]
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-06-18 17:05
引用:

mioさんの書き込み (2007-06-18 14:07) より:
では、チェインではどうでしょうかね。

…と思ったけど、100もチェインするのはさすがに多いですね;
ループはそれとして、順次呼び出す…かなあ。

[ メッセージ編集済み 編集者: mio 編集日時 2007-06-18 14:25 ]


チェインというのは、デザインパターンのChain of Responsibility
のことでしょうか?そうですね、100もチェインするのは厳しいですね。

デザインパターンから何か導き出せないかと色々考えていますが、、、
これといったのはありませんね。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-18 17:33
かなり複雑そうですから、アクティビティ図などでモデリングはしているわけですよね。
こんなソースはどうでしょうか。
コード:
static void Main(string[] args)
{
	Action action = new ActionA();
	while ((action = action.Run()) != null) ;
}

abstract class Action
{
	public abstract Action Run();
}

class ActionA : Action
{
	public ActionA() { }

	public override Action Run()
	{
		ObjectA obj;
		//処理
		return new ActionB(obj);
	}
}

class ActionB : Action
{
	ObjectA objectA;

	public ActionB(ObjectA obj) { }

	public override Action Run()
	{
		int i;
		bool flg;
		//処理
		if(flg) return new ActionC(objectA, i);
		else return new ActionD();
	}
}

class ActionC : Action
{
	public ActionC(ObjectA obj, int i) { }

	public override Action Run()
	{
		//処理
		return new ActionD();
	}
}

class ActionD : Action
{
	public ActionD() { }

	public override Action Run()
	{
		//処理
		return null;
	}
}

class ObjectA { }


並列処理などもなさそうなので、アクションとその後の分岐(Decision Node?)を合わせてひとつのクラス(Action)で表現してみました。
モデルとソースの対応関係がはっきりしていてアクションの追加などもしやすいと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-06-18 17:43
引用:

リミットさんの書き込み (2007-06-18 10:50) より:
単純にif文とswich文を羅列して実装することも可能かと
思いますがそれではメンテナンス性、ソースの可視化、
オブジェクト指向の面から好ましくない実装になってしまう
のではと思ってしまいます。


プログラムとはそういうものではないでしょうか。すなわち、if/switch があるからプログラムなのではないでしょうか。

たとえば、文字列抽出をするときに、if/switch のプログラムでやるか、正規表現のようなやりかたでやるか、という選択肢がある場合に、正規表現のほうを使いたい、という感じなのかなと思います。正規表現なら、なんとなくですが「メンテナンス性」や「ソースの可視化」というキーワードを実現できていそうな趣もあります。
(「正規表現」はあくまでもたとえです。)

おそらく、データーとプログラムの中間に位置しそうなモノを、プラグイン的に差し替えできるような感じで扱われたいのだと思います。本格的なものだと、アプリケーションが自前のスクリプトエンジンを持っていて、ユーザーがスクリプト(マクロ)を書くというのになるかもしれません。そこまでするのが大変だとしたら、プラグインを通常の言語で書いて、アプリケーションにロードする、という感じにすることが多いです。
プログラムはやっぱり、言語なりスクリプトやマクロなりで書かないとどうしようもないんじゃないでしょうか。パラメーターの延長でプログラマブルなことをしようとすると、やはり限界が来ると思います。どの程度、プログラマブルなことをするつもりなのかが分かれ目になるでしょう。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-18 18:50
引用:

リミットさんの書き込み (2007-06-18 10:50) より:

単純にif文とswich文を羅列して実装することも可能かと思いますがそれではメンテナンス性、ソースの可視化、オブジェクト指向の面から好ましくない実装になってしまうのではと思ってしまいます。


単純な if と switch による分岐とオブジェクト指向は関係ないですね。どちらかというと構造化の問題です。まあ、Action のパターンがクラス設計で何とかなる場合ではオブジェクト指向は関係します。そういう意味合いで仰っているのであれば、扱うデータと分岐の関係をもっと明らかにした方が良いかもしれません。

引用:

このように分岐が多数ある機能の実装はどのようにすればスマートにいくのでしょうか?


クラス設計 (ポリモーフィズム / Action クラスの使い分け) で何ともならない (もしくは、逆に可読性を損ねる) 場合は、switch での分岐ごとに別々のメソッドに飛ばすなどという単純な方法で考えます。無理に簡素化しようとして可読性を損ねたりすると、それこそ、オブジェクト指向の面からして本末転倒であります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-06-18 19:41
オブジェクティブに考えると、ifやswitchが(ある程度)なくなる方向には、基本的にはなると思います。
が、無理にオブジェクトを作り出してifやswitchをなくそうというのも、違いますね。

ではまた別のところから。
その100もの処理を、ひとつのクラス内で行う必要はあるのでしょうか?
処理をある程度グループ分けできるなら、同じIN/OUTを持つクラスをいくつか並べても良いのでは、
と思いました。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-06-18 19:43
あんまり凝ったことすると メンテナンスが非常に困難な
プログラムになります。

if文とswich文を羅列だとしても うまくクラス化 関数化 構造化
すれば それなりにすっきりします。

スキルアップ/キャリアアップ(JOB@IT)