Nesne Tabanlı Tasarım sorun

3 Cevap php

Hey,
I have been designing a site locally in PHP 5, but have come across a few design issues I'd like advice now.

Şu anda orada sitenin üç özellik vardır ve her özellik bir sınıfı vardır. Bu özellikler şunlardır:

  • bir blog
  • bir arkadaş listesi
  • görüntülerin bir dizi

Her bir sınıf var ama her sınıfta ben temelde tüm [bloglar | Arkadaşlar | görüntüleri] alır benzer bir yöntem tanımlar. Aranızda ben çok ince olmak için bu sınıfları azaltmak ve muhtemelen her bir özelliği için aynıdır tüm yöntemler için her üç özellik arasındaki jenerik bir sınıf var nasıl biliyor merak ediyordum. (Yani getAllById ($ özellik, $ id)).

Aşağıdaki gibi benim varolan blog sınıf için bir örnek işlevi:

function getBlogsByUserId($userId) {
    global $db;
    $blogs = array();
    $db->where(array("userId"=>$userId));
    $rows = $db->get("blog")->fetch(0);
    foreach($rows as $row) {
 $blog = new Blog();
 $blog->id = $row['id'];
 $blog->userId = $row['userId'];
 $blog->content = $row['content'];
 $blogs[] = $blog;
    }
return $blogs;
}

Not: Ben DB şeyler için kendi sınıfı tanımladık yani bu konuda endişelenmeyin.

I've looked at the gateway design pattern but haven't yet found a solution. I also want this to be reusable so if I increase the features to seven or more then I won't have to change much of the class.

Thanks, Matt

3 Cevap

Sen gibi pek, Model, diyelim ki, adında bir üst sınıf oluşturabilirsiniz:

abstract class Model {
  protected static $_featureTable;

  static public function getAllById($id) {
    global $db;
    $items = array();
    $db->where(array("userId"=>$userId));
    $rows = $db->get(self::$_featureTable)->fetch(0);
    foreach($rows as $row) {
      $item = self::getInstance();
      $item->setValues($row);
      $items[] = $item;
    }
    return $items;
  }

  abstract static protected function getInstance();
  abstract protected function setValues($row);
}

class Blog extends Model {
  protected static $_featureTable = 'blogs';

  protected static function getInstance() {
    $self = __CLASS__;
    return new $self();
  }

  protected function setValues($row) {
    $this->content = $row['content'];
    // etc.
  }
}

Sonra, bloglar bir listesini almak için:

$blogs = Blog::getAllById($id);

Belki Doctrine veya Propel gibi bazı ORM sistemlerinde bir göz olmalıdır. <-> Nesne haritalama Bu veritabanı ile size çok yardımcı olacaktır.

Ve ben (üst sınıf, ortak yöntemleri uygulamaya olanak sağlar) en azından Doktrini tabloları inheritances destekler ve tabii bir sınıf hiyerarşisi de bu yapısını eşler biliyoruz.

You Bir parameterizeable Fabrika nesne / fonksiyonu oluşturmak olabilir. Bu bir 'row_to_object' işlevi bir 'sorgu' nesnesi toplamak istiyorum:

function row_to_blog( $row ) {
    return new Blog( $row["id"], $row["title"] );
}

function create_from_query( $query, $row_to_object ) {
    $objects=array();
    foreach( $row as $db->fetch( $query ) ) {
       $objects[]=$row_to_object( $row );
    }
    return $objects;
}

$query=new Query( "blogs", new Where("userid",$id) );
$blogs=create_from_query( $query, row_to_blog );