Получить все объекты определенного класса в объектно-ориентированном программировании - PullRequest
1 голос
/ 20 января 2011

Недавно я видел несколько вариантов получения всех объектов, и мне особенно нравится метод Factory, но я видел людей, использующих функции вне своих классов, вызывающих метод getAll для своих пользовательских объектов, и еще несколько.

В следующем примере показано, как я чаще всего получаю всех пользователей из базы данных. Хотя это PHP-код, я хотел бы увидеть некоторые идеи, как люди делают то же самое на разных языках программирования.

Что вы предпочитаете и почему? Это скорее дискуссия, и я надеюсь, что она даст мне больше идей в следующий раз, когда я приду к этому.

class userFactory extends Factory {
     public function __construct(){

     }

     public function getAllUsers() {
          $users = array();
          $result = $this->db->Execute("SELECT * FROM user");
          while (!$result->EOF) {
              $users[] = new user($result);
          }
          return $users;
     }
}

Ответы [ 2 ]

3 голосов
/ 21 января 2011

Вы реализовали часть шаблона проектирования DAO (не фабрика, даже когда он возвращает пользовательские экземпляры).DAO обычно заботится о поиске, создании, сохранении, редактировании и удалении объектов одного и того же вида.

См. Также шаблон хранилища - хранилище является более высоким уровнем абстракции - оно может запрашивать несколько DAOоднако для получения ожидаемых результатов один DAO должен запросить только одну таблицу базы данных.

PHP персистентные фреймворки

  • Doctrine ORM - Java-подобный ORM, без зависимостей, см. примеры (методы получения / установки должны быть необязательными)
  • Kohana ORM - ActiveRecord, часть веб-инфраструктуры Kohana 3.0
  • Zend_Table - ActiveRecord, часть Zend Framework
  • было немного других (google orm / activerecord / persistence for php)

Затем вы можете определить отношения и работать с объектами, например так:

//ORM/ActiveRecord way
$user = Repo :: get ( "users" ) -> find_by_id ( $user_id );
$user = User :: find_by_id ( $user_id );

$user_payments = $user -> payments;
$user_articles = $user -> articles;

вместо:

$user_repository = Repo :: get ( "users" );
$articles_repository = Repo :: get ( "articles" );

$user = $user_repository -> find_by_id ( $user_id );
$user_articles = $articles_repository -> find_all_for ( $user );

ActiveRecord намного проще и проще в использовании, но не очень ООП.Методы, такие как:

  • $ user -> save (),
  • $ user -> delete (),
  • User :: find_all ()
  • User :: find_by_id ($ id)

просто не должен быть частью класса User, потому что объект не обязан знать, как найти все экземпляры, как их хранить вв любом случае - это хорошее начало, заставляет задуматься о богатой доменной модели.Итак - перейдите на ActiveRecord и после того, как вы достигнете некоторого навыка, попробуйте переключиться на настоящий ORM

Другие языки

  • Для JAVA проектов, Google для JPA, Hibernate, Toplink, iBatis.
  • Для Ruby , есть класс ActiveRecord
  • , и если вы действительно любите ООП, Google для настойчивости Smalltalk: -)
1 голос
/ 20 января 2011

Что ж, если вы просто ищете идеи, вы можете рассмотреть возможность использования Object-Relational Mapper (ORM). Это позволяет вам использовать результаты запросов к базе данных в качестве первоклассных объектов на выбранном вами языке. Например, если бы у меня была таблица компаний и сотрудников, я мог бы сделать это в Ruby / Rails (используя ActiveRecord ORM):

mycompany = Company.where(:name => "MyCompany").first
employee1 = mycompany.employees.first

Это генерирует запрос SQL и автоматически создает систему объектов первого класса. В предыдущем примере вы могли бы выполнить это с помощью кода такого типа:

$users = UserQuery::create()=>all();

Если вы используете PHP, там уже есть несколько хороших ORM, просто найдите "php orm" в Google. Есть некоторые клоны ActiveRecord, а также некоторые, которые более точно вписываются в язык php.

...