2011-02-04 82 views
1

使用空實例是好習慣還是壞習慣?面向對象練習「空」對象

有「產品」類,與ID啓動:

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 2011-02-04 08:05:06

回答

3

兩者都可能是良好的做法。也許你的第二個實施不太好。

其實第二個是工廠模式的簡單實現。檢查這個環節,你會更好地理解:

也許就是工廠方法應該是像ProductFactory一些類,所以,ProductFactory->new(...)將有你的偉大的最佳方式廠!

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的代碼將強制執行非空屬性。