imaicの日記: 組合せ爆発によるテスト限界 14
日記 by
imaic
情報システムではモジュールの共通化・共用化を計る場合がある。
昨今では積極的に共通化・共用化を狙って設計する場合も多い。
注意しなければならないのは、構成によっては組合せ爆発が発生する場合があることだ。
以下引用。
オブジェクト指向では変数を他のオブジェクトから扱えないように隠蔽(英語版)(conceal)することで、保守を独自にできるようにする効果がある。しかし内部変数のとりうる状態の数は実はそのオブジェクトの果たす機能と密接であり、他のオブジェクトの設計者がそれらを意識しなければならないことも多い。すなわち、オブジェクト化で組合せの数を減らそうとしてもそれほど単純には減らない。
オブジェクト指向は失敗アイデアだった (スコア:0)
オブジェクト内部に隠蔽された状態によって、同じ関数を呼んでも違う結果が返ってくる、さらには隠蔽された内部状態の遷移先まで違ってくる。
グローバル変数だけでプログラム書くほうが見通しよくてまだマシって思えてきたよ。
Javaの検査例外と同じ。良いアイデアに思えたのに実戦投入したら使えないことが判明したかんじ
それはあんたがバカで糞なだけ (スコア:0)
javaの検査例外もオブジェクト指向も、リスコフの置換原則も知らんような
糞プログラマーには猫に小判、豚に真珠。
なんかペーパードライバーにF1マシンを運転させて,スピードが出過ぎて事故っただけなのに
「F1マシンが悪い、これは欠陥品だ。俺は悪くない」と言ってるような感じ。
Re: (スコア:0)
Javaみたいなクソ言語がF1なわけないじゃん
Re: (スコア:0)
別ACですが。
Javaが糞ならもっと生産性の高い言語を使えばよろしいかと、Delphiなんていかがですか?
それはさておき
オブジェクト指向が悪いと考えておられるようですが、大きなプログラムを手に負える範囲に押さえる分割と隠蔽の手段がオブジェクト指向です。組み合わせの爆発を防ぐのにも有用です。単体テストという言葉くらいご存知ですよね。
そもそもが、他のオブジェクトの内部状態を細かく知っておく必要があるとか、それを意識して網羅的にテストする必要があるとか、そのプログラムの分割の仕方、隠蔽の仕方に先ず疑問を抱かれた方がよろしいと思います。
とは言え既に粗方出来上がっているプログラムに対して卓袱台返しなんて出来ないでしょうし、ご愁傷様とかしか言えませんが、もし次にそういう設計をなされるなら、グローバル変数を多用する方向に進む他に、ちゃんとプログラムを分割するという方向での検討をされること、お勧めします。
Re: (スコア:0)
>大きなプログラムを手に負える範囲に押さえる分割と隠蔽の手段がオブジェクト指向です。
オブジェクト指向は手助けにすぎんよ。
設計ということをしっかりと考えるべきなんだよ。
Re: (スコア:0)
参照透過性が必要ですな。
Re: (スコア:0)
組合せ(結合試験)レベルの話に単体テストの話出して
何かうれしいの?
Re: (スコア:0)
大規模プロジェクトにニワカJavaプログラマーが大量投入された挙句、利用者から「ログインユーザと違うユーザの情報が表示される」問題がいろんなシステムで多発した時期がありましたなあ。
Re: (スコア:0)
見通しをよくするのが最近のテーゼですからね。
局所化は必要だとしても、隠蔽化は良くないアイデアだと思う。
Re: (スコア:0)
いやいや、関係ないことは知る必要が無いというのが隠蔽化ですよ。
知る必要があるというなら、それはプロパティやアクセサを実装しなければ。
さらに、隠蔽化されることによって知る必要があるものとないものが区別されるので
思考のリソースが割かれないというメリットもあります。
他のコメントでもありますが、オブジェクト指向なのに内部状態を意識しなければならないなんて設計が悪い証拠です。
Re: (スコア:0)
外部に影響があるということは隠蔽に失敗してるということだよね。
クラス使うだけで完璧にオブジェクト指向に沿った適切なコードになるってわけじゃないもんね。
クラス使ってスパゲッティコードを毛玉コードかオナモミコードにするのが関の山みたいな連中も多々。
Re: (スコア:0)
えと・・・staticおじさん降臨?
1x1=1 (スコア:0)
モジュールを単機能にすれば
1x1=1
であるから、組合せ爆発を防ぐことができる。
1に何を掛けても1なのだから。
1に近づけることで、複雑さを低減できる。
Re: (スコア:0)
モジュールを単機能にしたら、システムを構成するモジュールは増えるから同じだろ
1に何をかけても1だが、1に近づけただけの数字は1じゃないから爆発を引き起こす。
複雑さは問題自体、つまりシステムの外に存在するのだから、モジュールの
分割の仕方でそれを解決するのは無理だよ。低減させられないではないがね。