Лучший способ заполнить объект свойствами, извлеченными из базы данных

Я использую PHP 5.4. Я пытаюсь сделать свое приложение более НАДЁЖНЫМ. В настоящее время я просматриваю свои объекты и убеждаюсь, что они следуют SRP. Я застрял в том, как справиться с заполнением моего объекта свойствами, особенно свойствами, которые «расширяют» свойства объекта. Позвольте мне лучше объяснить.

У меня есть класс под названием Flock (да, группа цыплят — я занимаюсь сельским хозяйством). Он состоит из нескольких свойств, которые находятся в таблице flocks в базе данных: id, member_id, integrator_id, date_placed, date_picked_up и т. д.:

<?php
class Flock
{
    private $id;
    private $member_id;
    private $farm_id;
    private $integrator_id;
    private $comments;
    private $production_sq_ft;
    private $number_of_houses;
    private $avg_effective_age_of_houses;
    private $date_placed;
    private $date_picked_up;
    private $head_started;
    private $head_picked_up;
    private $pounds_picked_up;
    private $pounds_sold;
    private $base_rate;
    private $performance_rate;
    private $fuel_rate;
    private $other_rate;
    private $feed_pounds_consumed;

    public function __construct() {}

    //Then a bunch of getters and setters.
}

Моя цель — использовать один и тот же объект как для создания, так и для извлечения стада. Однако в моей базе данных я создал несколько «главных» представлений — представлений, которые объединяют все таблицы поиска и выполняют любые основные вычисления с данными, которые могут быть выполнены на уровне строк. В этом примере в моем основном представлении для стад я объединил таблицу integrators с моим flocks, что дало мне столбец integrator_name в моем представлении. То же самое касается таблиц members и farms. Я также нашел разницу в днях между date_placed и date_picked_up, что дало мне столбец под названием total_time_in_facility. В моей текущей версии этого приложения все эти данные просто хранятся в массиве и доступны с помощью магических методов (__get). Поэтому, если бы я хотел получить имя интегратора, я бы просто использовал $flock->integrator_name. Однако, если бы я использовал свой класс Flock для заполнения базы данных, я бы не передал имя интегратора — я бы просто передал значения, перечисленные выше.

Мой вопрос: как лучше всего получить расширенные данные о стае? Должен ли я использовать другой класс для обработки этого (например, FlockDetails)? Должен ли я вообще не использовать этот основной вид? Вместо того, чтобы выполнять какие-либо вычисления, на мой взгляд, должен ли я просто выполнять их внутри самого класса? У меня сложилось впечатление, что я должен использовать только один класс для описания стаи. Если бы мне нужно было создать новое стадо, я бы использовал этот класс. Если бы я хотел восстановить, я бы просто заполнил его с помощью фабрики. Но если я заполню его с помощью фабрики, как насчет дополнительных деталей, содержащихся в моем главном представлении? Может ли кто-нибудь помочь мне прояснить это? Спасибо!


person Jeff    schedule 28.10.2014    source источник


Ответы (1)


Ну, я бы, наверное, имел класс Flock, который представляет одну строку в таблице «flocks», и класс FlockEx, который расширяет класс Flock, добавляя поля, которые вы получаете в результате вычисления в db. Итак, когда вы хотите обновить или добавить новое стадо в базу данных, вы используете класс Flock, а когда вы извлекаете поля стада вместе с вычисленными, вы используете FlockEx. Имеет смысл?

person Next Developer    schedule 28.10.2014
comment
Да, это имеет большой смысл. Часть меня чувствует, что я чрезмерно анализирую это. Я просто хотел бы сделать это правильно в первый раз, а не переделывать потом. - person Jeff; 28.10.2014