有没有一种简单的方法可以在函数中重用代码,而不是进行复制?

时间:2019-09-13 15:42:18

标签: php laravel

我正在使用Laravel框架构建我的第一个Web应用程序。但是,模型开始变得很忙,我注意到重复的代码-特别是在函数内部。

我在编码方面的经验非常有限,因此我对在函数内部进行重构并将函数拆分为一口大小的代码充满信心,

但是...我想知道是否有任何方法可以轻松地重用函数中的代码?

我已经附上了一个我想重构的代码示例-这是一个小例子,因为我有一些模型,这些类型的重复发生4-5次,现在变得很难读懂了。< / p>

如您所见,这两个函数之间唯一的区别是它们名称中的IsPast / IsFuture文本以及对$ date的调用。

有人可以推荐我如何重构此代码吗?

public function getIsPastAttribute(): bool
{
    return $this->date_period->map(static function ($date) {
        /** @var Carbon $date */
        return $date->isPast();
    })->contains(false) === false;
}


public function getIsFutureAttribute(): bool
{
    return $this->date_period->map(static function ($date) {
        /** @var Carbon $date */
        return $date->isFuture();
    })->contains(false) === false;
}

3 个答案:

答案 0 :(得分:2)

尝试动态命名函数

public function getIsPastAttribute(): bool
{
    return $this->isDate('isPast');
}

public function getIsFutureAttribute(): bool
{
    return $this->isDate('isFuture');
}

public function isDate($tense): bool
{
    return $this->date_period->map(static function ($date) use ($tense) {
        /** @var Carbon $date */
        return $date->$tense();
    })->contains(false) === false;
}

答案 1 :(得分:0)

对于您提供的两种特定方法,您可以执行以下操作:

public function getTimeAttribute($time): bool
{
    return $this->date_period->map(static function ($date) use($time) {
       /** @var Carbon $date */
       return $time == 'future' ? $date->isFuture() : $date->isPast();
    })->contains(false) === false;
}

您可以使用在主方法中调用的较小的“子方法”来减少代码重复。 而不是这样做:

public function f1() {
    ...a lot of duplicate code
}

public function f2() {
    ...a lot of duplicate code
}

您可以这样做:

private function helper() {
    ...a lot of duplicate code
}

public function f1() {
    $this->helper();
}

public function f2() {
   $this->helper();
}

您还可以签出traits

答案 2 :(得分:0)

我使用特质在许多控制器中使用相同的功能。

在Http目录中,创建一个名为Traits的新目录,这是Trait的示例:

App / Http / Traits / MyTrait.php

<?php

namespace App\Http\Traits;


trait MyTrait{  
   public function myTraitFunction(){
     ...
   }
}

您可以像这样在控制器中使用

<?php

namespace App\Http\Controllers;


use App\Http\Traits\MyTrait;

class MyController extends Controller{

    use MyTrait;

    public function controllerFunction(){
        //calling the trait function
        $this->myTraitFunction();
        ...
    }   
}