「Estimator」インターフェースを作成するだけでなく、Estimate()というメソッドを必要とし、そのインターフェースを一連のクラスで拡張して、それぞれが異なる推定を完了するようにすることはできませんか。それらはすべて、入力引数(見積もりに必要なすべての情報)を受け取るコンストラクターを持ち、それらはすべて、合計コストを出力する見積もり関数を暗示します。
これに非常によく似たパターンをリストアップしているので、このパターンを理解していることを私は知っています。私がそれをどのようにコーディングするかをお見せしたいので、それがどのように機能するかを見ることができます。悪い考えのように聞こえても、非常にうまく機能し、視覚化できない場合があります。
何かのようなもの:
interface Estimator
{
public function Estimate ();
public function BuildInfo ();
}
class Estimate_gutter implements Estimator
{
private $totalLength, $gutterType;
function __construct ($totalLength, $gutterType)
{
$this->totalLength = $totalLength;
$this->gutterType = $gutterType;
}
function Estimate ()
{
return $this->totalLength * .45; // 45 cents a foot, consider a binary math library here though
}
function BuildInfo ()
{
return "Gutter Type: {$this->gutterType}, Length: {$this->totalLength}"; //to keep different classes from having to output different values, thus breaking the idea of abstraction we are trying to achieve; we'll just output a string that will be printed to the job list.
}
}
class Estimate_sidewall implements Estimator
{
private $width, $height, $type;
function __construct ($drywallType, $width, $height)
{
$this->width = $width;
$this->height = $height;
$this->type = $drywallType;
}
function Estimate ()
{
return $this->width * $this->height * 1.12; // 1.12 a square foot, again consider a binary math library
}
function BuildInfo ()
{
return "SideWall type '{$this->type}' {$this->width}ft x {$this->height}ft = ". ($this->width * $this->height) ."sqft.";
}
}
$gutter = new Estimate_gutter(100, "Type to gutter"); //pass this to the view
$gutter->Estimate(); //this would be run in the view, or be assigned in the controller to a variable for the view. This must exist, because it is implementing the Estimator class. The reason for this is so that you don't need to know what class type it is in the view, you just need to call the same function, no matter what.
/*
This would print out all the information needed to retrieve
the needed product. It is important this function always returns
the *exact* same data type every time for every class, otherwise
the abstraction will break. (because if you output an array for one,
and a string for another, how do you know when to deal with an array,
and when to deal with a string? You'd need to know what type of estimate
you're making, and you're attempting to eliminate needing to know that
using this design pattern).
*/
echo $gutter->BuildInfo ();
この問題に対する他のパターンや解決策を見たいのですが、それはユニークではありませんが、良い解決策を考案するのは難しいかもしれません。