2011-10-28 3 views
2

私はいつもどのようにして次のことを行うのが最善であるか混乱しています。たとえば、BlogPostTagという2つのクラスがあり、データベーステーブルPostsTagsに対応しています。他のクラスの中でクラスをインスタンス化するのは悪い設計ですか、あるいは独立しているべきですか?別のクラスの中でクラスをインスタンス化するのは悪い設計ですか?

class BlogPost { 
     private $db; 
     private $title; 
     private $description; 
     private $tagsArray; 

     public function __construct($db){$this->db = $db;} 
     public function getTitle(){/*...*/} 
     public function getDescription(){/*...*/} 
     public function getTags(){/*...*/} 
     public function setTitle($title){/*...*/} 
     public function setDescription($desc){/*...*/} 
     public function setTags($tags){/*...*/} 
     public function addPost(){ 
      //insert into database query 
      //bindParams 
      //execute 

      $this->addTags($this->db->last_insert_id()); 
     } 
     public function addTags($lastInsertId){    
      require_once('class.Tag.php'); 

      foreach($tagsArray as $tagItem){ 
       $tagClass = new Tag($this->db, $lastInsertId); 
       $tagClass->setTagName($tagItem["title"]); 
       $tagClass->addTag(); 
      } 
     } 
    } 

のindex.php

require_once('class.BlogPost.php'); 
    $blogPost = new BlogPost($db); 
    $blogPost->setTitle("title"); 
    $blogPost->setDescription("description"); 
    $blogPost->setTags($tagsArray); 
    $blogPost->addPost(); 

それとも独立したクラスを保つために良いですか?そのような:

class BlogPost { 
    private $db; 
    private $title; 
    private $description; 

    public function __construct($db){$this->db = $db;} 
    public function getTitle(){/*...*/} 
    public function getDescription(){/*...*/} 
    public function getId(){/*...*/} 
    public function setTitle($title){/*...*/} 
    public function setDescription($desc){/*...*/} 
    public function setId($id){/*...*/} 
    public function addPost(){ 
     //insert into database query 
     //bindParams 
     //execute 

     $this->setId($this->db->last_insert_id()); 
    } 
} 

のindex.php

require_once('class.BlogPost.php'); 
$blogPost = new BlogPost($db); 
$blogPost->setTitle("title"); 
$blogPost->setDescription("description"); 
$blogPost->addPost(); 

$lastInsertId = $blogPost->getId(); 

require_once('class.Tag.php'); 
$tagClass = new Tag($db, $lastInsertId); 
$tag->setTags($tagsArray); 
$tag->addTag(); 

任意の情報をお寄せいただきありがとうございます!

答えて

1

これは間違いなく悪いデザインです。 OOには「これをしてはいけない」ということは何もありません。依存関係を減らすことはもちろん目標ですが、最初にTagを作成するという目的で操作を実行するときには、Tagクラスに不要な依存関係はありません。

Tagオブジェクトはデータベース関係によってBlogPostに依存しているため、BlogPostメソッドでオブジェクトを作成するのは完全に意味があります。コードを取り出すことで、コードを手作業で書く必要がなくなるだけでなく、間違ってコードを書くことができるようになります。

+0

**確かに、それはまだ悪いデザイン**です。 – Jimbo

+0

@Jimbo: 'addTags'の内部で作成されたインスタンスは、コードを慎重に読んでも外部に漏れることはありません。 'addTags'自体は最初から公開すべきではありません。正確に何が悪いデザインだと思いますか?なぜですか? – Jon

+0

わかりやすく答えを編集する必要がありますか?私はOPの質問に対するあなたの反応を信じていました:*別のクラスの中でクラスをインスタンス化するのは悪い設計ですか?*:「確かに悪い設計ではありません。笑! – Jimbo

2

依存関係の注入は、現在PHP世界で多くの勢いを増しています。これは、依存オブジェクトを外部にインスタンス化し、コンストラクタまたはセッタを渡すことになります。これは単体テストに非常に役立ち、依存オブジェクトが変更された場合の柔軟性を可能にします。インターフェースを渡す方が良いでしょう。もしあなたが何かを変えたならば、あなたのデータベースに言えば、アプリケーションコードを変更する必要はなく、ベースのDBクラスやファクトリだけを変更する必要があります。

+1

私はちょうどパトリックのコメントを読んで、私は完全に同意します。 "ITag"を実装するクラスを渡すことはさらに柔軟になり、 "シンプル"と "アドバンス"の両方のタグを持つことができます(単なる理論的な例)。 –

+0

これは明らかな答えです。 – Jimbo

0

私の意見では、「タグ」ファクトリクラスを作成して、一度に1つずつまたはまとめて「タグ」を生成し、その後、「タグ」ファクトリクラスを作成して、 BlogPost "、その配列を" BlogPost "クラスに渡します。

これはちょうどよりクリーンなデザイン、IMOのために作る。

-1

クラスにはrequire/includeを使用しないでください。 Class Loader

+0

これはこの質問に対する回答ではなく、コメントでなければなりません。 –

関連する問題