以下のような、クラスにまとめた処理を一度実行してるファイルがあります。
<?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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
オブジェクト指向の問題ではなく、
ソフトウェアの要求がどうなっているかですね。
どれも間違えではないですが、仕様がまるで違います。
まず仕様を明確にして、仕様を満たすように実装するといいですよ。
No.3
- 回答日時:
何をしたいのか今ひとつわかりませんが、書いてある程度のプログラムだったらオブジェクトを作ることが既にオーバーエンジニアリングだと思います。
これで十分です。
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さんがあげているデザインパターンもそれがもたらす複雑さとソフトウェアを今後どう発展せるかのバランスを考えないと、簡単にオーバーエンジニアリングをもたらすことになる諸刃の刃です。
No.4
- 回答日時:
1、設定値の違う複数のインスタンスを同時に利用する必要があるのか?
2、設定値だけが違うインスタンスをこの二種類以外にも作る事になる可能性があるか?
3、設定する値自体が増えたりすることはあるのか?
そのへんでどれが最適かは変わってくるでしょう
そもそもその仕様をなしにしてるみたいですが
コンストラクタに設定値を入れて渡すのが本来だと思います
設定する値自体が増えたりする可能性を考えると
設定値の連想配列を渡すような形にしとくのが
以降なんらか変更があったとき、子クラスを作る場合にも対応しやすいです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
protectedなのにアクセスできな...
-
PHP正規表現の難題・preg_repla...
-
VBA コレクションに2次元配列...
-
number_formatが勝手に四捨五入
-
PHPで呼び出し元の関数名の取得...
-
既存関数の上書き
-
エラーの理由が分りません。Pri...
-
DMMの動画を全件取得したのです...
-
Yahoo! JAPAN IDを新規取得でき...
-
Dosブロンプトでtabを出力したい
-
フォームを使わずにPOST送信す...
-
アクセスの度にIPアドレスを変...
-
【C#】DataGridViewの最大列数...
-
ローカルのコンピュータ名を取...
-
【C#】FindWindowExの使い方を...
-
先日NISAの投資信託で、初めて...
-
初歩的な質問だと思います。IF...
-
Parse error というエラーの対...
-
バッチファイルで、全てのウィ...
-
IEを使わないでhtmlテキストを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Let's Encryptで自動更新がされ...
-
VBA コレクションに2次元配列...
-
VB.NETからVBAマクロ(引数)を呼...
-
エラーの理由が分りません。Pri...
-
PHP、ヒアドキュメント内でのIF...
-
PHPでの画像の形式の変換
-
CSVファイルをブラウザのキャッ...
-
可変変数にアロー演算子を使いたい
-
次のhtml・cssでspan内の文字を...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
ExcelVBAで部分一致(*)をしたい
-
PHPの変数値をリンクさせたい
-
file_existsが動作しない
-
protectedなのにアクセスできな...
-
PHPプログラム上で「URLを直接...
-
ASPのResponse.WriteをPHPでは...
-
PHPでXMLの置換 replaceData
-
[C#]Arraylistに追加した構造体...
-
[C++]std:mapの扱いを教えて頂...
おすすめ情報