- PR -

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

投稿者投稿内容
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-06-18 10:50
こんにちは。リミットと申します。
C#2.0を使って開発しております。

実装しようとしている機能は設定値(DBの値)を見て
分岐処理を行い、また次の設定値を見て分岐処理を行う
というのを繰り返し行わなければなりません。

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

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

意見をお持ちの方、是非参考にさせて下さい。
宜しく御願い致します。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-06-18 11:19
引用:

実装しようとしている機能は設定値(DBの値)を見て
分岐処理を行い、また次の設定値を見て分岐処理を行う
というのを繰り返し行わなければなりません。



(1)DBから取得した設定値を元に分岐する
(2)それはいくつかある

とだけ読み取りました。

(a)設定値とは何だろう?
(b)for文は使えなさそうな状況なのだろうか?
(c)繰り返しの数はいくつくらいなのか?今後も増えそうなのか?

といった疑問点も同時に沸きました。
もう少し前提条件やその処理の目的などを明確化しないと
回答しづらいと思います。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-06-18 11:25
Main 1 - * IProcess
IProcessは条件と処理を持つ。
拡張処理は継承して作成したり。
後で分岐や処理が増えてもクラスを追加して
定義ファイルに書き込むだけで対応できるようにするとか。

のようにやるとかっこいいですね。

でも、各処理をサブルーチン化して
分岐から呼び出すだけでもメンテナンス性は高まると思います。
1ファイルに全部書くとメンテナンス性は下がりますので
静的な処理クラスを用意するといいでしょう。
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-06-18 11:49
よねKENさん、早速のレスポンス有難う御座います。

前提条件やその処理の目的をお伝えするのは難しいので
例を書かせて頂きます。

1.Aという値があります。

2.設定値aを見て、AをBに変換する。
(設定値aがtureかfalseを判断して、trueの場合はA + 3、
falseの場合はA - 3する等の処理を行う)

3.設定値bを見て、BをCに変換する。

4.設定値cを見て、CをDに変換する。



という、設定値を見て変換するという処理が多数あります。

> (1)DBから取得した設定値を元に分岐する
具体的にいうとDBからだけではありませんが、設定値の取得方法
は考慮して頂かなくても結構です。
> (2)それはいくつかある
はい、多数あります。

> (a)設定値とは何だろう?
文字列の場合もあれば数値の場合もあります。
> (b)for文は使えなさそうな状況なのだろうか?
設定値をひとつひとつ判断していかなくてはいけないので、ループ
処理は使えそうにありません。
> (c)繰り返しの数はいくつくらいなのか?今後も増えそうなのか?
設定値をみて、値を変換するといった処理は100前後あります。
今後も増えますが、増えれば都度ソースを修正して対応するといった
方法で問題ありません。

以上、少し分かって頂けましたでしょうか?分かりにくい文章に
なってしまい、申し訳御座いません。

具体的にこういうクラスを使って、こう実装すればいいんじゃないの、
というのが知りたいわけではありません。例えば、分岐ひとつに
ついてパーシャルクラスをひとつ作ったらいいんじゃないの、という
実装の概要例が知りたいです。

引き続き、参考意見をお持ちの方宜しく御願いします。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-06-18 12:36
「設定値」による「変換」は、本当に全部ばらばらなんでしょうか。
なんらかのパターンはないんですか?

・nを足すか引くパターン
・mをかけるか割るパターン

とか。

なんらかのパターンがあるなら、「設定値を見て値を変更する」のをループにして、
設定値aとcならこのパターンの処理を呼び出し、bとfならこのパターンを呼び出し、
とかいうことはできませんかね。
TAD
ベテラン
会議室デビュー日: 2007/03/20
投稿数: 52
お住まい・勤務地: 海のそば
投稿日時: 2007-06-18 13:18
引用:
2.設定値aを見て、AをBに変換する。
(設定値aがtureかfalseを判断して、trueの場合はA + 3、
falseの場合はA - 3する等の処理を行う)

3.設定値bを見て、BをCに変換する。

4.設定値cを見て、CをDに変換する。



という、設定値を見て変換するという処理が多数あります。

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

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

今回やりたい処理は常に
処理a-処理b-処理c-...
という流れなわけですね? であれば、
  • 主処理としては処理a,処理b,処理cの呼び出しを順次記述する。
  • 処理a,処理b,処理cはそれぞれ関数やクラスで記述する
だけの話ではないかと思うのですが。
別に主処理が多少長くなっても意味が単純明解であればメインテナンスに問題は
発生しないと思いますし、そもそも100個やそこいらを長いと考えるかどうか...
#本当に分岐が100回あったらパスの数は大したことになりますけど。
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-06-18 13:37
あすかさん、書き込み有難う御座います。

引用:

Main 1 - * IProcess
IProcessは条件と処理を持つ。
拡張処理は継承して作成したり。
後で分岐や処理が増えてもクラスを追加して
定義ファイルに書き込むだけで対応できるようにするとか。


そうですね。このようなつくりにするとかっこいいですね。
IProcessということはインターフェイスとして実装するという
ことですよね?条件と処理だけだと、インターフェイスでなく
ても良いように思いますが、インターフェイスにされた理由を
教えて頂けませんか?

引用:

でも、各処理をサブルーチン化して
分岐から呼び出すだけでもメンテナンス性は高まると思います。
1ファイルに全部書くとメンテナンス性は下がりますので
静的な処理クラスを用意するといいでしょう。


たしかにそう思われます。しかし、もっとスマートな方法は
ないのかと模索しております。静的な処理クラスも良いですね。
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-06-18 13:42
mioさん、回答レスポンス有難う御座います。

引用:

mioさんの書き込み (2007-06-18 12:36) より:
「設定値」による「変換」は、本当に全部ばらばらなんでしょうか。
なんらかのパターンはないんですか?

・nを足すか引くパターン
・mをかけるか割るパターン


具体的な例のために、単純に変換と書かせてもらいましたが、
実はその変換にはかなりの処理が含まれます。一部の変換処理を
共通化させることは可能かもしれませんが、分岐を共通化すること
は出来ないと思います。

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