2017-02-17 52 views
1

這可能會討論好幾次,但我想知道OOP如何幫助我改進代碼。我習慣以程序的方式進行編碼。但是要有合理的邏輯。整個項目中使用的代碼段都包含在函數中。然而,所有的功能都放在一個大的functions.php文件中(我發現效率不高)。 例如,這是檢查的功能,如果一個銷售過期或不:php - 如何用OOP改善代碼

function is_sales_expired($salesId, PDO $conn) { 
    $now=time(); 
    $sql="SELECT * FROM specialoffers WHERE id=:id"; 
    $st=$conn->prepare($sql); 
    $st->bindvalue(":id",$salesId,PDO::PARAM_STR); 
    $st->execute(); 
    $sales_array=$st->fetchAll(); 
    if($now<$sales_array[0]['finishdate'] && $now>$sales_array[0]['startdate']) { 
     return FALSE; 
    } else { 
     return TRUE; 
    } 
} 

現在香港專業教育學院決定搬到OOP和轉換我的代碼OOP。所以我創建了類,並將與特定行爲相關的函數放入每個類中。例如具有is_sales_expired()以及與銷售相關的其他方法的銷售類別。性能和構造是這樣的:

class Sales 
{ 
    private $conn; 
    private $stockObj; 
    private $userObj; 
    private $cartObj; 
    private $randomObj; 

    function __construct(PDO $conn) 
    { 
     $this->conn = $conn; 
     $this->stockObj = new Stock($this->conn); 
     $this->userObj = new User($this->conn); 
     $this->cartObj = new Cart($this->conn); 
     $this->randomObj = new Random($this->conn); 
    } 
    //methods come here// 
} 

然後我用spl_autoload_register所以我沒有包括所有其他文件中的所有類文件加載在我的代碼的類。使用這種方法,調用方法更簡單一些,我不需要將PDO $conn傳遞給每個方法調用,並且它已經與構造函數一起傳遞。

好吧,這些都很好,所有相關的代碼現在在一個地方,也許更容易管理。但我有一種感覺,即面向對象應該提供更多的東西。與我使用的方法,我不覺得,現在我的代碼更高效和可維護。我覺得我應該在這裏錯過一些概念。 您的幫助表示讚賞。

+0

[OOP vs Functional Programming vs Procedural]的可能重複(http://stackoverflow.com/questions/552336/oop-vs-functional-programming-vs-procedural) –

回答

1

很好,你已經開始組織你的代碼到對象中,這是一個很好的進入更好的應用程序結構。當你開始深入研究它時,你會發現將當前對象分割成更小的部分並以更好的方式組織它們的方法,減少代碼以更靈活的方式解決更多問題。

例如,在您的代碼中,業務邏輯仍與數據庫緊密耦合。如果您決定使用mysqli而不是PDO,該怎麼辦?您必須觸摸應用程序中的每個課程。

但是,如果數據庫交互被提取到您的業務邏輯使用的自己的一組對象中,那麼替換數據庫訪問層會容易得多。事實上,在這種情況下,你可以很容易地用PostgreSQL替換MySQL,甚至可以用普通文件替換。

我可以通過兩種方法來了解更多關於OOP的工作方式:閱讀book或從現有代碼中學習。

我連接的這本書是我最喜歡的面向對象的書,並且展示了一些很好的例子,說明如何通過將程序分解成協作對象來解決OOP問題。

而且我也建議開始使用一些OOP框架,過去我和Yii有過一些很好的經驗,請查看guide,看看它是怎麼樣的。您將看到大量有用的對象解決您在開發Web應用程序時必須解決的所有問題。 嘗試使用它構建一些簡單的應用程序,然後嘗試查看框架代碼內部,以查看其實際工作方式。

還有一個建議是研究自動測試。這不僅會讓應用程序保持活躍狀態​​,還會教你如何編寫更好的對象。您必須在兩種不同的情況下使用您的類 - 您的實際代碼和測試。在內部測試中,您希望將您正在測試的對象與其餘代碼隔離開來,例如,在不觸及數據庫的情況下測試銷售統計信息算法。而且你必須將代碼分成更小更靈活的結構才能做到這一點。

1

你已經開始了一個良好的開端,需要時間開始思考對象的體系結構。 OOP的優勢在於它可以模擬代碼必須與之交互的事物。因此,想想它需要處理的事情以及需要採取的行動。所以在你的例子中,你可以有一個新的SpecialOffers類,它將處理與你的specialoffers表有關的所有事情。

例如:

class SpecialOffers { 

function __construct(PDO $conn) 
{ 
    // this is connected to the server table 
    $this->conn = $conn; 

} 

// get the details of a special offer 
private function get($salesId) { 

    $sql="SELECT * FROM specialoffers WHERE id=:id LIMIT 1"; 
    $st=$this->conn->prepare($sql); 
    $st->bindvalue(":id",$salesId,PDO::PARAM_STR); 
    $st->execute(); 
    $rows = $st->fetchAll(); 

    if (count($rows) > 0) { 
     return $rows[0]; 
    } else { 
     return null; 
    } 

} 

// answers whether a particular sales is active 
public function isActive($salesId) { 
    $answer = $this->get($salesId); 

    if (isset($answer['finishdate']) && isset($answer['startdate'])) { 
     $now=time(); 
     return $now<$answer['finishdate'] && $now>$answer['startdate'];   
    } else { 
     return false; 
    } 

} 

}

還有很多事情要做,比如錯誤處理,但你可以看到它是如何開始的事情被分解變得更加明顯,你只想着特別優惠。他們如何工作?有什麼可以出錯的?

最後,當試圖考慮類的範圍時,最好的建議是來自SOLID原則。第一個,S - 單一職責原則:

類應該只有一個單一的責任(即只有一個 在軟件的規格電位變化應該能夠 影響類的規範)

最好的一類可以用一句話來描述。方法也一樣,用一句話來描述它的功能。