猿问

有没有一种简单的方法来重用函数中的代码,而不是重复?

我正在使用 Laravel 框架构建我的第一个 Web 应用程序。然而,模型开始变得非常忙碌,我注意到重复的代码——尤其是在函数中。


我的编码经验非常有限,所以我对在函数内部进行重构和将函数拆分成一小段代码很有信心,这只有一项任务。


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


我附上了一个我想重构的代码示例 - 这是一个小例子,因为我有一些模型,这些类型的重复发生 4-5 次,现在很难阅读。


如您所见,这两个函数之间的唯一区别是它们名称中的 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;

}


繁星coding
浏览 131回答 3
3回答

largeQ

尝试动态命名函数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;}

月关宝盒

对于您提供的两种特定方法,您可以这样做: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();}您还可以查看特征

呼唤远方

我使用特征在许多控制器中使用相同的功能。在 Http 目录中,创建一个名为 Traits 的新目录,这是一个 Trait 的示例:应用程序/Http/Traits/MyTrait.php<?phpnamespace App\Http\Traits;trait MyTrait{&nbsp;&nbsp;&nbsp; &nbsp;public function myTraitFunction(){&nbsp; &nbsp; &nbsp;...&nbsp; &nbsp;}}您可以像这样在控制器中使用:<?phpnamespace App\Http\Controllers;use App\Http\Traits\MyTrait;class MyController extends Controller{&nbsp; &nbsp; use MyTrait;&nbsp; &nbsp; public function controllerFunction(){&nbsp; &nbsp; &nbsp; &nbsp; //calling the trait function&nbsp; &nbsp; &nbsp; &nbsp; $this->myTraitFunction();&nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; }&nbsp; &nbsp;}
随时随地看视频慕课网APP
我要回答