質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

解決済

2回答

2669閲覧

汎用クラスの生成はどこがすべき?

i50

総合スコア227

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

0グッド

2クリップ

投稿2015/10/08 02:47

編集2015/10/09 00:42

PHP標準の配列関数を組み合わせて変換していた処理があるのですが、
それをクラス化して(ArrayConverterとします)、様々なクラスで使いたいと考えています。

ユーティリティクラスの様なものですが、
staticな関数を集めたクラスではなくて、状態管理するのでnewする必要があります。

その場合、ArrayConverterを使用するクラスは
ArrayConverterの生成について、どこの責任と捉えるべきなのでしょうか。

さしあたって、A案B案を考えていますが、
どちらも決め手に欠けているように思っています。

======================================
A案:コンストラクタでArrayConverterのインターフェースを指定する

PHP

1interface IArrayConverter {} 2class ArrayConverter implements IArrayConverter {} 3 4class Hoge { 5 6 protected $_converter; 7 8 function __construct(IArrayConverter $converter) { 9 $this->_converter = $converter; 10 } 11} 12

ArrayConverterの生成の責任はHogeには無い(生成すべきではない)と考え、
Hogeは、ArrayConverterを使用する事をコンストラクタで宣言だけすべきと考えました。
テストもできるので、無難な設計と考えています。

しかし、標準の配列関数の組み合わせなだけのクラスなので、
本質的にコンストラクタの引数に指定するレベルの物なのか?と悩んでいます。

感覚的には、(実際にはできませんが)PHPの標準関数を使用するからといって
コンストラクタの引数に標準関数を並べるような感覚でして、
似たようなクラスが増えていった場合、
**コンストラクタの引数が多くなりすぎるのでは?**と思っています。

======================================
B案:使う場所でnewするか、getInstanceする

PHP

1class ArrayConverter {} 2 3class Hoge { 4 5 public function foo() { 6 //newの場合 7 $converter = new ArrayConverter(); 8 } 9 10 public function bar() { 11 //getInstanceの場合 12 $converter = ArrayConverter::getInstance(); 13 } 14 15} 16

ArrayConverterのような汎用クラスであれば、
標準関数と同じように扱いコンストラクタを通じた使用の宣言は必要なく、
Hogeに生成の責任がある(というより自由に生成してよい)と考えました。
直感的で分かりやすいと考えています。

しかし、どちらの場合もHogeとArrayConverterの関係が密になりすぎて、
ArrayConverterをダミーに差し替えるといった事が出来なくなるのが心配です。
======================================

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/10/08 09:26

A案では、ArrayConverterをインスタンス変数で保持していますが、B案ではArrayConverterを使い捨てているように見えます。 ArrayConverterのインスタンスは使い捨ててもいいんですか?
i50

2015/10/08 23:51

ありがとうございます!おっしゃる通り、例がちぐはぐになっておりました。 私の考えから申しますと、使い捨てでもインスタンス変数保持でもどちらでも良いです。 ArrayConverterの様な便利クラス(?)を使用するときに、 その生成はどうすべきか(外部から与えてもらう or 内部で生成する or その他?)という悩みです。 使い捨ての場合と、インスタンス変数保持の場合で考え方が変わるという事でしたら、 その点の考え方も教えていただけると、とても嬉しいです!
guest

回答2

0

あまり質問の意図を理解できていないのですが、
B案にてダミーに差し替えるといった話があったので、
Factory::create("ArrayConverter");
とでもしておいて、ファクトリ側で必要に応じてダミーをnewして返す、
のではいけないのでしょうか?

投稿2015/10/08 18:05

livetc

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

i50

2015/10/09 01:11

回答ありがとうございます! 質問が悪くて申し訳ございません…質問の文言を修正をさせていただきました。 リフレクションで生成自体を動的にすれば差し替えは便利そうです。 今までしたことない方法なので検討させてください!
guest

0

ベストアンサー

ArrayConverterのインスタンスを使い捨てにできるなら、B案で良いと思います。
例えるなら、Iteratorクラスと似たような位置付けのものなのだと思います。

投稿2015/10/09 15:06

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

i50

2015/10/13 00:26

回答ありがとうございます! なるほど…使い捨て不可ならA案、使い捨て可能ならB案。 確かに標準関数の類やイテレータは使い捨てですし 基準としてとても分かりやすいです!スッキリしました! B案で差し替えが必要な場合はlivetc様案のリフレクションを使ったファクトリで対応。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問