2017-02-17 4 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を渡す必要はなく、コンストラクタですでに渡されています。

これらはすべていいですし、関連するコードはすべて1か所にあり、管理しやすくなります。しかし、私は、OOPにもっと多くのものを提供しなければならないと感じています。私が使用したアプローチでは、私のコードがより効率的で保守的になったとは思いません。私はここでいくつかのコンセプトを欠場すべきだったと思う。 あなたの助けに感謝します。

+0

[OOP vsプロシージャ]の可能な複製(http://stackoverflow.com/questions/552336/oop-vs-functional-programming-vs-procedural) –

答えて

1

コードをオブジェクトに整理することを開始したことは良いことです。これは、より良いアプリケーション構造への良い移行です。 深く見ていくと、現在のオブジェクトをより小さな部分に分割してより良い方法で整理し、より多くの問題をより柔軟に解決するコードを減らすことができます。

たとえば、コードでは、ビジネスロジックは依然としてデータベースに緊密に結合されています。 PDOの代わりにmysqliを使用するとどうなりますか?アプリケーションのすべてのクラスに触れる必要があります。

ただし、データベースの操作がビジネスロジックで使用された独自のオブジェクトセットに抽出された場合、データベースアクセスレイヤーを置き換える方がはるかに簡単です。実際、MySQLをPostgreSQLで置き換えることも、その場合は普通のファイルでも簡単に置き換えることができます。

OOPの仕組みについては、bookを読んだり、既存のコードから学ぶことができます。

私がリンクしている本は私の好きなOOPの本です。このプログラムを協力オブジェクトに分解することで、問題をOOPでどのように解決できるかの非常に良い例をいくつか示しています。

また、いくつかのOOPフレームワークの使用を開始することをお勧めします。これまでのところ、Yiiの良い経験がありました。guideを確認してください。あなたは、Webアプリケーションを開発するときに常に解決しなければならないさまざまな問題を解決するたくさんの有用なオブジェクトを見ていきます。 いくつかの単純なアプリケーションをビルドして、フレームワークコードを調べて実際の動作を確認してみてください。

さらに1つのアドバイスは、自動テストを調べることです。これにより、アプリケーションを生き生きとした状態に保つだけでなく、より良いオブジェクトを構成する方法を教えてくれます。実際のコードとテストの2つの異なる状況でクラスを使用する必要があります。テストの中で、テストしているオブジェクトをコードの残りの部分から分離したいとします。たとえば、データベースに触れることなく販売統計アルゴリズムをテストします。そして、それを可能にするには、コードをより小さく柔軟な構造に分割する必要があります。

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の原則です。最初の1、S - シングル責任の原則:

クラスは、単一の責任(つまり、ソフトウェアの仕様で唯一 電位変化が にできるはずであるクラスの仕様に影響を与える)

を持つべきです

最高のクラスは1つの文で記述することができます。メソッドと同じで、それが何をするかを記述する1つのセンテンス。