【问题标题】:How to optimize and clean these loops?如何优化和清理这些循环?
【发布时间】:2021-11-04 15:56:15
【问题描述】:

我正在用 Laravel 编写一个项目。我有一个循环,有很多这样的条件:

  foreach ($transactionsGroupBys as $transactionsGroupBy) {

        if ($this->checkExistSettlement($transactionsGroupBy, Carbon::today())) {
            $this->setErrorLog('This settlement has already been created', $transactionsGroupBy);
            continue;
        }

        try {

            if ($this->doChunk()) {

                $transactions = $this->getTransactions($transactionsGroupBy);
                $maxAmountSettle = $this->configRepository->find('transaction_chunk:PUBLIC')->value;
                $transactionChunk = app(ChunkTransaction::class)->chunk($transactions, $maxAmountSettle);

                foreach ($transactionChunk as $chunk) {
                    $transactionsIds = collect($chunk->transactions)->pluck('id')->toArray();
                    $settlements[] = $this->insertSettlement($chunk->transactions_group_by, $transactionsIds)->toArray();
                    $this->setInfoLog("Created $counter/$countSettlements settlement", $chunk->transactions_group_by);
                }

            } else {

                $transactions = $this->getTransactions($transactionsGroupBy, ['id']);
                $transactionsIds = $transactions ? collect($transactions)->pluck('id')->toArray() : [];

                $settlements[] = $this->insertSettlement($transactionsGroupBy, $transactionsIds)->toArray();
                $this->setInfoLog("Created $counter/$countSettlements settlement", $transactionsGroupBy);
            }

            $counter += 1;

        } catch (\Exception $exception) {
            $this->setErrorLog($exception->getMessage());
            continue;
        }

    }

我正在检查$this->doChunk(),如果为真,则运行其他循环。我觉得这段代码非常复杂,而且我有重复的代码。我需要新的模式来解决这个问题。

【问题讨论】:

    标签: php laravel lumen


    【解决方案1】:

    不,没关系。

    可以纠正的一点是 - 删除 try {} catch {} 块并使用 Laravel ExceptionHandler 重写它。

    另一种方法是将该方法拆分,将大if语句中的每个分支放入单独的方法中,然后将if重写为三元运算符。

    您还可以用array_reduce 重写foreach 以降低与“计数器”相关的代码复杂度

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2018-09-16
      • 1970-01-01
      • 2014-09-07
      • 2011-05-30
      • 2019-03-21
      • 1970-01-01
      相关资源
      最近更新 更多