パスワードを忘れた? アカウント作成
12033545 journal
日記

imaicの日記: 組合せ爆発によるテスト限界 14

日記 by imaic

情報システムではモジュールの共通化・共用化を計る場合がある。
昨今では積極的に共通化・共用化を狙って設計する場合も多い。

注意しなければならないのは、構成によっては組合せ爆発が発生する場合があることだ。

以下引用。
オブジェクト指向では変数を他のオブジェクトから扱えないように隠蔽(英語版)(conceal)することで、保守を独自にできるようにする効果がある。しかし内部変数のとりうる状態の数は実はそのオブジェクトの果たす機能と密接であり、他のオブジェクトの設計者がそれらを意識しなければならないことも多い。すなわち、オブジェクト化で組合せの数を減らそうとしてもそれほど単純には減らない。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2015年04月28日 14時48分 (#2805592)

    オブジェクト内部に隠蔽された状態によって、同じ関数を呼んでも違う結果が返ってくる、さらには隠蔽された内部状態の遷移先まで違ってくる。
    グローバル変数だけでプログラム書くほうが見通しよくてまだマシって思えてきたよ。
    Javaの検査例外と同じ。良いアイデアに思えたのに実戦投入したら使えないことが判明したかんじ

    • javaの検査例外もオブジェクト指向も、リスコフの置換原則も知らんような
      糞プログラマーには猫に小判、豚に真珠。

      なんかペーパードライバーにF1マシンを運転させて,スピードが出過ぎて事故っただけなのに
      「F1マシンが悪い、これは欠陥品だ。俺は悪くない」と言ってるような感じ。

      • by Anonymous Coward

        Javaみたいなクソ言語がF1なわけないじゃん

        • by Anonymous Coward

          別ACですが。

          Javaが糞ならもっと生産性の高い言語を使えばよろしいかと、Delphiなんていかがですか?

          それはさておき

          オブジェクト指向が悪いと考えておられるようですが、大きなプログラムを手に負える範囲に押さえる分割と隠蔽の手段がオブジェクト指向です。組み合わせの爆発を防ぐのにも有用です。単体テストという言葉くらいご存知ですよね。

          そもそもが、他のオブジェクトの内部状態を細かく知っておく必要があるとか、それを意識して網羅的にテストする必要があるとか、そのプログラムの分割の仕方、隠蔽の仕方に先ず疑問を抱かれた方がよろしいと思います。

          とは言え既に粗方出来上がっているプログラムに対して卓袱台返しなんて出来ないでしょうし、ご愁傷様とかしか言えませんが、もし次にそういう設計をなされるなら、グローバル変数を多用する方向に進む他に、ちゃんとプログラムを分割するという方向での検討をされること、お勧めします。

          • by Anonymous Coward

            >大きなプログラムを手に負える範囲に押さえる分割と隠蔽の手段がオブジェクト指向です。

            オブジェクト指向は手助けにすぎんよ。
            設計ということをしっかりと考えるべきなんだよ。

          • by Anonymous Coward

            参照透過性が必要ですな。

          • by Anonymous Coward

            組合せ(結合試験)レベルの話に単体テストの話出して
            何かうれしいの?

    • by Anonymous Coward

      大規模プロジェクトにニワカJavaプログラマーが大量投入された挙句、利用者から「ログインユーザと違うユーザの情報が表示される」問題がいろんなシステムで多発した時期がありましたなあ。

    • by Anonymous Coward

      見通しをよくするのが最近のテーゼですからね。
      局所化は必要だとしても、隠蔽化は良くないアイデアだと思う。

      • by Anonymous Coward

        いやいや、関係ないことは知る必要が無いというのが隠蔽化ですよ。
        知る必要があるというなら、それはプロパティやアクセサを実装しなければ。
        さらに、隠蔽化されることによって知る必要があるものとないものが区別されるので
        思考のリソースが割かれないというメリットもあります。

        他のコメントでもありますが、オブジェクト指向なのに内部状態を意識しなければならないなんて設計が悪い証拠です。

        • by Anonymous Coward

          外部に影響があるということは隠蔽に失敗してるということだよね。
          クラス使うだけで完璧にオブジェクト指向に沿った適切なコードになるってわけじゃないもんね。
          クラス使ってスパゲッティコードを毛玉コードかオナモミコードにするのが関の山みたいな連中も多々。

    • by Anonymous Coward

      えと・・・staticおじさん降臨?

  • by Anonymous Coward on 2015年04月28日 17時38分 (#2805729)

    モジュールを単機能にすれば
    1x1=1
    であるから、組合せ爆発を防ぐことができる。
    1に何を掛けても1なのだから。
    1に近づけることで、複雑さを低減できる。

    • by Anonymous Coward

      モジュールを単機能にしたら、システムを構成するモジュールは増えるから同じだろ
      1に何をかけても1だが、1に近づけただけの数字は1じゃないから爆発を引き起こす。

      複雑さは問題自体、つまりシステムの外に存在するのだから、モジュールの
      分割の仕方でそれを解決するのは無理だよ。低減させられないではないがね。

typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...