首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种简单的方法在函数中重用代码,而不是复制代码?

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

Stack Overflow用户
提问于 2019-09-13 23:42:18
回答 3查看 111关注 0票数 1

我正在使用Laravel框架构建我的第一个web应用程序。然而,模型开始变得相当繁忙,我注意到重复的代码-特别是在函数中。

我在编码方面的经验非常有限,所以我对在函数中进行重构和将函数拆分成只有一个任务的代码变得很有信心。

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

我附上了一个我想要重构的代码示例--这是一个小示例,因为我有几个模型,其中这些类型的重复发生了4-5次,现在读起来相当困难。

正如您所看到的,这两个函数之间唯一的区别是名称中的IsPast / IsFuture文本和对$date的调用。

有人能推荐我如何重构这段代码吗?

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-13 23:47:54

尝试动态命名函数

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2019-09-13 23:48:50

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
public function f1() {
    ...a lot of duplicate code
}

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

您可以这样做:

代码语言:javascript
复制
private function helper() {
    ...a lot of duplicate code
}

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

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

您还可以查看traits

票数 0
EN

Stack Overflow用户

发布于 2019-09-14 00:31:15

我使用特征在许多控制器中使用相同的函数。

在Http目录中,创建一个名为特征的新目录,下面是一个特征的示例:

App/Http/Traits/MyTrait.php

代码语言:javascript
复制
<?php

namespace App\Http\Traits;


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

你可以像这样在你的控制器中使用:

代码语言:javascript
复制
<?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();
        ...
    }   
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57926633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档