0

私は趣味のプログラマーだと言うことから始めるべきです。私は(ほとんどの場合)PHPを練習していますが、医学の練習をやめたときに、時間をかけて知識を積み上げていき、途中で人々の問題を解決していきたいと思っています。

最近、家族のリノベーション事業の申し込みに取り組んでいます。このプロジェクトはcodeigniterとmongodbに基づいて構築されており、機能しているものの、きれいではないことはわかっています。私はデザインパターンについて読むことに時間を費やしましたが、どれがこのプロジェクトの「見積もり」部分に適合するかを判断するのに苦労しています。

仕組みは次のとおりです。

ユーザーは、価格を決定する方法に固有の一連の測定値を入力します。これらの測定値は、製品のタイプ(たとえば、側溝)に固有の場合があります。また、測定値は、製品よりも実行中の作業に密接に関連している場合があります。たとえば、外部の軒裏をビニールやアルミニウムで覆います。

つまり、特定の推定方法ごとに異なるタイプの測定が必要になるということです。上記の2つの例を続けます...

樋を推定するには、タイプ(小、大、画面)と直線フィートを入力する必要があります。各タイプには独自の価格が関連付けられていることを知っておくことが重要です。

軒裏を推定するには、直線フィートのみを知っている必要があります。

見積もりの​​式はかなり簡単です-数量x価格=見積もり-しかし、数量は、ピースの数、フィートの数、または平方フィートの数である可能性があります。

これを必要以上に複雑にしているのではないかと思いますが、スキルを次のレベルに引き上げて、優れたオブジェクト指向コードの設計を学びたいと思います。プロジェクトの次のステップは、これらの測定を行い、仕事に必要な材料のリストを作成することです。利用可能な製品の数が非常に多いため、はるかに複雑な作業です。

どのようなデザインパターンを検討する必要がありますか?これまで私は主にを見てきましたAbstract FactoryBuilder私のリストに載るべきですか?ほかに何か?

4

1 に答える 1

1

「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 ();

この問題に対する他のパターンや解決策を見たいのですが、それはユニークではありませんが、良い解決策を考案するのは難しいかもしれません。

于 2012-05-23T01:51:59.257 に答える