プロが教えるわが家の防犯対策術!

以下のような、クラスにまとめた処理を一度実行してるファイルがあります。

<?php
class Hoge {
 public function __construct() {
  // 設定値
  $this->a = 1;
  $this->b = 2;
  $this->c = 3;
 }

 public function main() {
  // 設定値を使った処理
  print $this->a + $this->b + $this->c;
  }
}

// インスタンス生成・実行
$hoge = new Hoge();
$hoge->main();
?>


設定値を変更して2回処理を行いたい場合、
一番スマートな形はどれになるか教えてください。
もしくは、それ以外の方法など。


1.設定値を引数で制御し、インスタンスを2回生成する
(※設定値自体を引数に渡すことは考えてないです)

<?php
class Hoge {
 public function __construct($flg) {
  // 設定値
  if ( $flg ) {
   $this->a = 1;
   $this->b = 2;
   $this->c = 3;
  } else {
   $this->a = 4;
   $this->b = 5;
   $this->c = 6;
  }
}

 public function main() {
  // 設定値を使った処理
  print $this->a + $this->b + $this->c;
 }
}

// インスタンス生成・実行
$hoge = new Hoge(true);
$hoge->main();
// インスタンス生成・実行
$hoge = new Hoge(false);
$hoge->main();
?>


2.インスタンスの生成・実行は1度のままにし、クラスの処理を変更する

<?php
class Hoge {
 public function __construct() {
  // 設定値
  $this->a = 1;
  $this->b = 2;
  $this->c = 3;

  $this->a2 = 4;
  $this->b2 = 5;
  $this->c2 = 6;
 }

 public function main() {
  // 設定値を使った処理
  print $this->a + $this->b + $this->c;

  // 設定値の変更
  $this->a = $this->a2;
  $this->b = $this->b2;
  $this->c = $this->c2;

  // 設定値を使った処理2回目
  print $this->a + $this->b + $this->c;
  }
}

// インスタンス生成・実行
$hoge = new Hoge();
$hoge->main();
?>


3.設定値を変更するメソッドを作り、呼び出す

<?php
class Hoge {
 public function __construct() {
  // 設定値
  $this->a = 1;
  $this->b = 2;
  $this->c = 3;
 }

 public function change() {
  // 設定値変更
  $this->a = 4;
  $this->b = 5;
  $this->c = 6;
 }

 public function main() {
  // 設定値を使った処理
  print $this->a + $this->b + $this->c;
  }
}

// インスタンス生成・実行
$hoge = new Hoge();
$hoge->main();
$hoge->change();
$hoge->main();
?>


4.子クラスを作り、2回インスタンス生成・実行を行う

<?php
class Hoge {
 public function __construct() {
  // 設定値
  $this->a = 1;
  $this->b = 2;
  $this->c = 3;
 }

 public function main() {
  // 設定値を使った処理
  print $this->a + $this->b + $this->c;
  }
}

class Hoge2 extends Hoge{
 public function __construct() {
  parent::__construct();
  // 設定値
  $this->a = 4;
  $this->b = 5;
  $this->c = 6;
 }
}

// インスタンス生成・実行
$hoge = new Hoge();
$hoge->main();
// インスタンス生成・実行
$hoge = new Hoge2();
$hoge->main();
?>


5.設定値だけ異なるファイルを作りそれぞれ実行する

※省略


よろしくお願いします。m(__)m

A 回答 (4件)

オブジェクト指向の問題ではなく、


ソフトウェアの要求がどうなっているかですね。
どれも間違えではないですが、仕様がまるで違います。

まず仕様を明確にして、仕様を満たすように実装するといいですよ。
    • good
    • 0

デザインパターンくらい勉強したら?

    • good
    • 0

何をしたいのか今ひとつわかりませんが、書いてある程度のプログラムだったらオブジェクトを作ることが既にオーバーエンジニアリングだと思います。


これで十分です。
function hoge($a, $b, $c) {
// 設定値を使った処理
print $a + $b + $c;
}

class Hogeの中にmain以外にも複数のメソッドが存在し、class Hogeでデータを纏めて扱うことに意味があるなら、せめてこんな書き方をしませんか?
class Hoge {
 public function __construct($a, $b, $c) {
  // 設定値
  $this->a = $a;
  $this->b = $b;
  $this->c = $c;
 }

 public function main() {
  // 設定値を使った処理
  print $this->a + $this->b + $this->c;
  }
}
// インスタンス生成・実行
$hoge1 = new Hoge(1, 2, 3);
$hoge1->main();
$hoge2 = new Hoge(4, 5, 6);
$hoge2->main();

そもそも、クラスの中にクラスを作るたびに変わる可能性がある値を固定値として入れこむこと自体がモジュール化を全く理解していないナンセンスなことだと思います。そういう値は外部から与えるのが当たり前です。
また、固定値を与える場合でもconstで宣言して一箇所にまとめておくのが当たり前です。プログラム中に即値が大量に出てくる時点で、今後の拡張が難しいプログラムとなってしまいます。

あと、スクリプト言語では非常に簡単な文法で連想配列を使えますから、オブジェクトではなく連想配列で十分なことも多いと思います。オブジェクトとして書いたとしても、実行してみるまでそれが間違っているかどうかわからないことも多々ありますから、どちらで書いてもバグの混入のしやすさはそんなに変わらないと思います。
Javaのように強い型付けがある言語だとコンパイルタイムにミスを見つけられるという点でちょっとしたものでもクラスを定義したほうが楽になることはあるともいますが、そうでない言語の場合はテスト以外にそれを見つける方法はありません。

というわけで、自分だったらその程度にオブジェクトを作ることはないです。#2さんがあげているデザインパターンもそれがもたらす複雑さとソフトウェアを今後どう発展せるかのバランスを考えないと、簡単にオーバーエンジニアリングをもたらすことになる諸刃の刃です。
    • good
    • 0

1、設定値の違う複数のインスタンスを同時に利用する必要があるのか?


2、設定値だけが違うインスタンスをこの二種類以外にも作る事になる可能性があるか?
3、設定する値自体が増えたりすることはあるのか?

そのへんでどれが最適かは変わってくるでしょう

そもそもその仕様をなしにしてるみたいですが
コンストラクタに設定値を入れて渡すのが本来だと思います
設定する値自体が増えたりする可能性を考えると
設定値の連想配列を渡すような形にしとくのが
以降なんらか変更があったとき、子クラスを作る場合にも対応しやすいです
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!