[英]Slightly different result data when filtering per month or all time. Which design patterns applies?
因此,我创建了一个时间轴,在该时间轴上,我计算了当月的一些KPI,以显示在时间轴旁边。 总数与上个月相比有所改善。
当我选择“所有时间”时,我想显示除一个以外的所有相同的KPI。 与上个月相比,此改进将是每位用户的所有时间的平均值。
我使用哪种设计模式案例来实现此功能? 由于对我的Symfony2后端的两个API调用都可能仅使用相同的端点,因此仅使用了不同的参数MONTH vs All Time(或可能使用了不同的端点)。 对于90%的用户,他们将进行相同的计算,我想使其尽可能通用,以在将来允许使用不同的参数。
我应该创建像MonthFilterStrategy和AllTimeFilterStrategy这样的策略并根据参数设置上下文,还是有一种适用于此用例的更好的设计模式。
网址:
http://my-domain.com/get-results/2014/06
http://my-domain.com/get-results/all-time
控制器/动作:
public function getResultsByMonthAction($year, $month) {
$from = DateTime::createFromFormat('Y-m-d', sprintf('%d-%d-01', $year, $month));
$from->setTime(0, 0, 0);
$to = $from->modify('next month');
$results = $this->myService->getResultsByDateRange($from, $to);
return $this->handleCommonCode($results);
}
public function getAllTimeResultsAction() {
$results = $this->myService->getAllTimeResults();
return $this->handleCommonCode($results);
}
private function handleCommonCode($results) {
...
$abc = $this->processResultsSomehow($results);
return $this->renderTemplate('...', [
'someExtraData' => $abc,
'results' => $results
]);
}
服务:
public function getResultsByDateRange(DateTime $from, DateTime $to) {
if ($from > $to) {
throw new LogicException('Invalid range. $from must be lower than $to.');
}
$criteria = [
'date-rage' => [$from, $to]
];
return $this->getResults($criteria);
}
public function getAllTimeResults() {
return $this->getResults();
}
protected function getResults(array $criteria = []) {
// let's assume you're quering database (using Doctrine)
$queryBuilder = ...;
if (isset($criteria['date-rage'])) {
$queryBuilder
->andWhere('abc.someDate BETWEEN :dateRangeStart AND :dateRangeEnd')
->addParameters([
'dateRangeStart' => $criteria['date-rage'][0],
'dateRangeEnd' => $criteria['date-rage'][1]
]);
}
return $queryBuilder->getQuery()->getResult();
}
这种方法需要更多的代码,但有很多好处:
if
语句, 我建议,如果没有参数可用于确定日期范围,则应在N个月内应用计算,其中N是合理的限制(或不是; YMMV)。 鉴于此,处理应该在N个月的数据上进行,并且永远不要假设只能处理单个对象。 始终假设您要处理N个月的数据,然后继续使用范围/筛选参数的存在来驱动UI。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.