繁体   English   中英

每月或始终过滤时,结果数据略有不同。 哪些设计模式适用?

[英]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这样的策略并根据参数设置上下文,还是有一种适用于此用例的更好的设计模式。

  1. 在控制器和商务层中创建单独的方法/端点
  2. 如果这些方法共享一些代码,则将其移至另一个非公共方法

网址:

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();
}

这种方法需要更多的代码,但有很多好处:

  1. 记录和理解API要容易得多,
  2. 无需无数的if语句,
  3. 由于代码的每个部分都在单独的方法中,因此更易于扩展/覆盖,
  4. 易于调试和维护,
  5. 每个方法可以包含一些单独的逻辑,
  6. 来自第三方工具(IDE,代码分析器等)的支持

我建议,如果没有参数可用于确定日期范围,则应在N个月内应用计算,其中N是合理的限制(或不是; YMMV)。 鉴于此,处理应该在N个月的数据上进行,并且永远不要假设只能处理单个对象。 始终假设您要处理N个月的数据,然后继续使用范围/筛选参数的存在来驱动UI。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM