2015-07-15 5 views
2

Я изучаю принципы OO SOLID и образцы дизайна, и я хочу немного поработать над этим. Поэтому я получаю одну проблему из моего текущего проекта и пытаюсь ее разработать. Проверьте, правильно ли она выполнена или она слишком переработана или я плохо ее реализую. Ваш ответ наиболее важен.Правильно ли это OOD?

Задача Мне нужно управлять кампаниями смс и электронной почтой в одной системе. Я хотел сказать, храня его в базе данных и извлекая его и т. Д.

Итак, я думаю, что будет какая-то особенность для кампании, такой как дата создания даты и т. Д. Таким образом, я создал класс с именем campaignmodel, который отвечает за некоторые общие функции, связанные с агитировать

Class CampaignModel 
{ 
    public function save($data) 
    { 
     // add campaign specific data 
     // save the campaign. 

    } 

    public function get() 
    { 
     // select the row from database and return it. 

    } 
} 

я сделать smscampaign и электронной почты кампании

class SMSCampaignModel extends CampaignModel 
{ 
    public function save($data) 
    { 
     // add sms specific data and 
     parent::save($data); 
    } 

    public function gets() 
    { 
     //fire the query to get the sms campaigns and returns it. 
    } 
} 

class EmailCampaignModel extends CampaignModel 
{ 
    public function save($data) 
    { 
     // add email specific data 
     parent::save($data); 
    } 

    public function gets() 
    { 
     //fire the query to get the email campaigns and returns it. 
    } 

} 

Теперь каждая кампания будет иметь получателей, и мы должны сохранить статус каждого получателя, как он открывает почту или почту/смс отправленное или сбой и т.д. . Я думаю, что мы будем посылать кампании с большим количеством писем или цифрами, поэтому я решил создать другую таблицу базы данных для хранения таких деталей, таких как sms_campaign_log, email_campaign_log и т.д. Я создал интерфейс для него

interface CampaignLogs 
{ 
    function insert_log(); 
    function get_details(); 
} 

class SmsCampaignLogs implements CampaignLogs 
{ 
    public function insert_log($data) 
    { 
     // get the number and status save it into the sms logs table. 
    } 

    public function get_details($campagin_id) 
    { 
     // get the logs from campagin table and return it. 
    } 
} 

class EmailCampaignLogs implements CampaignLogs 
{ 
    public function insert_log($data) 
    { 
     // get the number and status save it into the email logs table. 
    } 

    public function get_details($campagin_id) 
    { 
     // get the logs from campagin table and return it. 
    } 
} 

и, наконец, я думаю, теперь я должен использовать шаблон стратегии для его реализации (я не знаю, правильно это или нет).

class Campaign 
{ 
    private $log; 
    private $campaign_type; 
    public function __construct($campaign, $logger) 
    { 
     $this->campaign_type = $campaign; 
     $this->log = $logger; 
    } 

    public function save($data) 
    { 
     $this->campagin_type->save(); 

    } 
    public function gets() 
    { 
     $this->campaign_type->gets(); 
    } 

    public function log($data) 
    { 
     $this->log->insert_log($data); 
    } 

    public function get_campaign_details($campaign_id) 
    { 
     $this->log->get_details($campaign_id); 
    } 
} 

сейчас код реализации.

$campaign = new SmCampaignModel(); 
$logger = new SmsCampaignLogs(); 
$c = new Campaign($campagin,$logger); 
$c->save($data); 
$c->get($campaign_id); 
$c->get_campaing_details(); 

Тогда я думаю, что если требуется шаблон стратегии. Просто, я могу реализовать:

$campaign = new SmCampaignModel(); 
    $logger = new SmsCampaignLogs(); 
    $campaign->save($data); 
    $campaign->get($campaign_id); 
    $logger->get_campaing_details($campaign_id); 

Так теперь я полностью запутался. Я хочу, чтобы ваше мнение о том, правильно ли я применил принципы SOLID в моем дизайне (и шаблон стратегии необходим/правильно использован) или нет.

+0

то мы можем передать этот вопрос на этот сайт, или я хочу переписать этот вопрос там @deceze – Siddhesh

+3

Этот вопрос выглядит как очень урезанная версия «голых костей» фактического кода. Таким образом, это «псевдо» - или гипотетический код и ** вне темы ** для codereview.se – Vogel612

+0

@ Сидшедшая миграция возможна, но требует вмешательства модератора и необходима, только если были предоставлены полезные ответы/комментарии. Вы могли бы ускорить процесс и опубликовать его там сами, а затем удалить его. –

ответ

3

В этом случае ваш класс кампании - это только фасад. Стратегия не используется.

Фактически вы используете шаблон «Фасады», а не «Стратегия». Класс вашей кампании не имеет собственного поведения. Он просто передает свое поведение компонентам подсистем. Это не плохо, но это делает ваш код как-то сложнее поддерживать. Это хорошо с точки зрения скрытия информации.

Неправильно или неправильно в аспекте OOD. Образцы дизайна не обязательно должны быть включены, если причины не представлены. Вы должны спросить себя: «В чем моя главная проблема, и это разрешает?». «Будет ли причина для частого изменения кода?».

Поскольку мы все иногда испытываем соблазн злоупотреблять шаблонами проектирования, я хотел бы показать вам, как сделать простые отношения с ОО будет очень хорошо, и будет даже легче читать и поддерживать.

abstract class Campaign { 

    protected $ages; 
    protected $countries; 
    protected $dailyBudget; 

    protected $recipientsStatus = array(); // associative array or a composition of Recipients object 

    public function startCampaign() 
    { 
     // check there is not another run 
     $this->executeCampaign(); 
     $this->collectRecipientsStatus(); 
     $this->generateStatistics(); 
    } 

    abstract protected function executeCampaign(); 
    abstract protected function collectRecipientsStatus(); 
    abstract protected function generateStatistics(); 

} 

class EmailCampaign extends Campaign { 

    protected $addresses; 

    protected function executeCampaign() 
    { 
     $this->filterEmailsByCampaignData(); 
     $this->sendEmails(); 
    } 

    protected function filterEmailsByCampaignData() 
    { 
     // populate $this->addresses based on ages, countries etc. 
    } 

    protected function sendEmails() 
    { 
     // send email to addresses 
    } 

    protected function collectRecipientsStatus() 
    { 
     // collect status and fill parent $recipientsStatus 
    } 

    protected function generateStatistics() 
    { 
     // generate statistics 
    } 
} 

Кампания теперь представляет собой класс с данными и поведением. Мы не должны отделять его от компонентов, таких как Model и Logs. Это будет работать отлично.Однако, если вы когда-либо находите себя с более сложным массивом получателей (слишком много значений ключа или запаха кода массива), вы можете отделить его от другого набора классов. Но это должно произойти с эволюцией кода. Мы просто не можем предвидеть все заранее.

Кстати, единственный шаблон, который я использовал, - это легкий метод шаблонов и функция наследования ООП.

+0

, но sir @techwisdom вы объединяете все функциональные возможности кампании в один класс, поэтому SRP будет прерываться. также, если я изменю библиотеку отправки электронной почты или что-нибудь еще. Он также нарушит открытый принцип закрытия? я думаю так. – Siddhesh

+0

и код сэра выглядит как шаблон стратегии, который я узнал, используя пример утки «первый образец дизайна». – Siddhesh

+0

Я получаю шаблоны неправильно? – Siddhesh

Смежные вопросы