2011-02-04 4 views
1

빈 인스턴스를 사용하는 것이 좋거나 나쁜 연습입니까? ID로 시작 "제품"클래스가있다OOP 연습 "빈"개체

:

class product 
{ 
    __construct($id = 0) 
    { 
     // populate class, there is no product with id = 0 
    } 

    function new($name, $data) 
      ... 
} 


$product = new Product(123); // normal using 

그러나 나는 또한 새로운 제품을 만드는 데 필요한, 그래서 거기에는 초기 객체가 없다, 나는 빈 하나를 만들 :

$product = new Product(); 
$product->new($name, $data); 

좋든 나쁘니?
제품 클래스 외부의 일반 함수 new_product()를 작성해야합니다. 인스턴스를 사용하지 않으므로 비어있게 만듭니다.
이 문제의 최선의 방법은 무엇입니까?

+0

잠깐, 인스턴스를 사용하여 인스턴스를 만드는 중입니다. 뭐라 구요? – BoltClock

+0

인스턴스 생성없이'new()'를 어떻게 얻을 수 있습니까? 정적 함수 사용? 그것이 어떻게되어야 하는가? – Qiao

답변

3

둘 다 좋은 습관이 될 수 있습니다. 어쩌면 두 번째 구현이 그렇게 좋지 않을 수도 있습니다.

실제로 두 번째는 공장 패턴의 간단한 구현입니다. 이 링크를 확인하고 더 이해하게 될 것입니다 :

이 아마 것은 공장 방법은 그래서, ProductFactory->new(...)이 큰이 할 수있는 가장 좋은 방법이 될 것입니다 ProductFactory 같은 몇 가지 클래스에 있어야입니다 공장!

0

나쁜 형태. 본질적으로 당신은 혼란스러운 이름으로 setter 메서드를 제공했습니다.

또한 setter 초기화로 생성자 초기화를 혼합합니다. 둘 중 하나만 선택하십시오.

4

정확하게 이해하고 방법론을 올바르게 따라 갔다면 다음과 같은 것을 원할 것입니다. 이렇게하면 새 제품을 만들기 위해 Product 클래스의 인스턴스를 만들 필요가 없습니다.

class Product { 
    public function __construct($id = 0) { 
     // Load the data for existing product with Id > 0 
    } 

    public static function create($name, $data) { 
     // Create a new product from scratch 
     $obj = new self(); 
     $obj->Name = $name; 
     // Do something with data 
     return $obj; 
    } 
} 

// Load a product 
$product = new Product(123); 

// Creating a product 
$product = Product::Create('My new product', /* Data? Possible an array */); 
2

이상적으로, 개체의 상태는 항상 valid이어야합니다. 이것은 대개 외부에서 볼 수있는 상태보다는 내부 상태의 문제이지만 여기에서 개념을 적용 할 수 있습니다. 빈 이름이나 데이터가 있거나 ID가 0 인 경우 유효하지 않습니다 (ID가 0 인 경우 "영구 저장 장치에 존재하지 않습니다"의 마커이면 올바른 것입니다). 그렇다면 모범 사례가 아닙니다. 코드가 객체를 유효하게 유지한다고 주장한 이유는 프로그래머가 클래스의 문서를 읽는 것에 의존하기 때문입니다. 전자 상거래 사이트에서 학급을 이용하는 누군가가 비어있는 항목을 가지고 있다고 불만을 전자 메일로 보내면이 접근법의 지혜가 나타납니다.

PHP에서 항상 유효한 상태를 유지하는 최상의 방법을 구현하려면 Matías에 언급 된대로 팩터 리 패턴을 사용하거나 product에 정적 메서드 만 사용하면됩니다 (팩토리 패턴보다 조금 간단합니다. 이 메소드들은 기술적으로 단지 생성자입니다.) 또는 func_get_args을 사용하여 생성자 오버로드를 수동으로 구현 (인수를 검사하고 그 인수에 따라 다른 조치 수행) 할 수 있습니다. 이것은 컴파일 타임보다는 런타임에 호출 에러를 잡아낼 것이고, 다른 방법보다 열등하다.

물론 스크립트 실행 중에 제품이 일부 속성을 잃어 버리는 것은 완전히 유효 할 수 있지만 저장된 개체에는 속성이 누락 될 수 있습니다.이 경우 product을 저장/검색하는 코드는 비어 있지 않은 속성을 적용합니다.