Я использую 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
)? Разве я не должен использовать этот главный вид вообще? Вместо того, чтобы выполнять какие-либо вычисления, на мой взгляд, я должен просто выполнять те, что в самом классе? У меня сложилось впечатление, что я должен использовать только один класс для описания стада. Если бы я создал новое стадо, я бы использовал этот класс. Если бы я хотел получить данные, я бы просто заполнил их, используя фабрику. Но если я заполняю его с использованием фабрики, как насчет дополнительных деталей, содержащихся в моем главном представлении? Может кто-нибудь помочь мне прояснить это? Спасибо!
Ну, я бы, вероятно, имел класс Flock, представляющий одну строку в таблице «flocks», и класс FlockEx, который расширяет класс Flock, добавляя поля, которые вы получаете в результате вычисления в db. Таким образом, когда вы хотите обновить или добавить новое стадо в базу данных, вы используете класс Flock, а когда вы извлекаете поля стада вместе с вычисленными полями, вы используете FlockEx. Имеет смысл?
Других решений пока нет …