2012-05-23 1 views
0

저는 취미 프로그래머라는 말로 시작해야합니다. 나는 약을 연습하지 못하고 시간이 지남에 따라 지식을 쌓으려고 노력할 때 (대부분) PHP를 연습하면서 길을 따라 사람들을위한 몇 가지 문제를 해결합니다.이 시공 평가 프로젝트에 어떤 디자인 패턴을 고려해야합니까?

최근에 저는 가족의 주택 개조 사업 신청서를 작성했습니다. 이 프로젝트는 codeigniter와 mongodb를 기반으로하며 작동하는 동안 꽤 좋지 않다는 것을 알고 있습니다. 나는 약간의 시간을 디자인 패턴에 대해 읽은 후이 프로젝트의 '평가자'부분에 맞는 것을 결정하는 데 어려움을 겪고 있습니다. 그것이 어떻게 작동하는지

은 다음과 같습니다

사용자가 가격을 결정하는 방법과 관련된 일련의 측정에 들어간다. 때때로 이러한 측정은 일종의 제품 (예 : 거터)에만 해당됩니다. 다른 경우, 측정은 제품보다 훨씬 더 밀접한 관련이 있습니다. 예를 들어 비닐로 된 외장 덮개를 비닐 & 알루미늄으로 덮습니다.

모든 구체적인 추정 방법마다 다른 유형이 필요합니다. 측정. 위의 두 가지 예를 계속 ...

우리가 알아야 할 거터를 추정하려면 (작음, 큰, 화면) 및 선형 피트를 입력하십시오. 각 유형마다 자체 가격이 있다는 것을 아는 것이 중요합니다.

절정을 추정하려면 선형 피트 만 알아야합니다.

견적 공식은 비교적 쉽습니다. - 수량 x 가격 = 견적 - 수량은 조각 수, 피트 수 또는 평방 피트 수입니다.

내가 필요로하는 것보다 더 복잡하게 만들지는 모르겠지만 내 기술을 다음 단계로 가져와 좋은 객체 지향 코드를 디자인하는 방법을 배우고 싶습니다. 프로젝트의 다음 단계는 이러한 측정을 수행하고 작업에 필요한 재료 목록을 개발하는 것입니다. 사용 가능한 제품의 수가 많아서 훨씬 더 복잡한 작업입니다.

어떤 디자인 패턴을 고려해야합니까? 지금까지 대부분은 Abstract Factory입니다. Builder을 내 목록에 포함시켜야합니까? 또 뭐야?

답변

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

나는이 문제에 다른 패턴 및 솔루션을보고 싶어요 있지만, 그것은 고유하지 않은,하지만 좋은 해결책은 공식화하기 어려울 수 있습니다.

+0

이것은 좋은 예입니다. @ mazzzzz. 감사. 나는 그것이 프로젝트의이 부분을 위해 아름답게 작동 할 것이라고 생각한다. 다음 질문을 따르십시오 : 프로젝트의 다른 부분은 작업 크루에게 작업을 완료하는 데 필요한 자료를 알려주는 "자료 목록"을 작성하는 것입니다. 예를 들어 특정 작업에 필요한 비닐 처마 밑의 양은 여러 가지 측정 값에서 비롯됩니다 (추정치에 별도 측정 값으로 표시됨). 내 질문은 이것입니다 ... 만약 내가'인터페이스'클래스 안에 클래스를 정의한다면, 나중에 그 클래스의 함수를 사용하여 빌더에게 정보를 제공 할 수 있습니까? – Ryan

+0

후속 질문에 대한 답변을 실제로 작성하는 데 필요한 정보가 충분하지 않았습니다 (달성하려는 목표를 조용히 이해하지 못함). 원할 경우 인터페이스에 다른 함수를 만들 수 있습니다 (BuilderInfo 또는 기타 호출 할 수도 있음). 각 클래스에 해당 함수를 구현하여 정보 (sqft, length, specific name 등)를 생성합니다. . 나는 이것을 포함하도록 예제를 업데이트 할 것이다. – Ben

관련 문제