【发布时间】:2015-10-04 02:31:25
【问题描述】:
我正在学习 OO SOLID 原则和设计模式,我想在上面做一些练习。所以我从我正在进行的项目中得到了一个问题并尝试设计它。请检查它是否正确实施或过度设计或我实施不佳。您的回应是最重要的。
问题 我必须在一个系统中管理短信和电子邮件活动。我的意思是说将它存储在数据库中并检索它等等。
所以我认为会有一些特定于活动的东西,比如创建日期状态等。因此我创建了一个名为活动模型的类,它负责一些与活动相关的常见功能
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 原则(以及是否需要/正确使用策略模式)。
【问题讨论】:
-
那我们可以把这个问题转移到那个网站上还是我想在那里重写这个问题@deceze
-
这个问题看起来像是实际代码的一个非常精简的“基本”版本。因此,它是“伪”或假设代码,并且 off-topic 用于 codereview.se
-
@Siddhesh 迁移是可能的,但需要主持人干预,并且只有在给出有用的答案/cmets 时才需要。您不妨加快速度并自己在那里发布,然后将其删除。
-
@deceze:停止尝试将问题硬塞到 CR 中。如果这个问题在这里是题外话,那么投票关闭它适当的,列出的原因。您可以建议某个问题可能很适合 CR,但投票结束帖子的第一条规则是它必须在此处实际上是题外话。您正在滥用自定义关闭原因。
-
@deceze:例如,这个问题可能太宽泛了。此时您投票关闭它,建议 OP 它可能更适合 CR(首先检查他们的主题帮助信息)并标记帖子以要求版主迁移它。但不要为此滥用自定义关闭投票消息。
标签: php oop design-patterns solid-principles