我正在使用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;
}发布于 2019-09-13 23:47:54
尝试动态命名函数
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;
}发布于 2019-09-13 23:48:50
对于您提供的两种特定方法,您可以执行以下操作:
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方法中调用的较小的“子方法”来减少代码重复。而不是这样做:
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
发布于 2019-09-14 00:31:15
我使用特征在许多控制器中使用相同的函数。
在Http目录中,创建一个名为特征的新目录,下面是一个特征的示例:
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();
...
}
}https://stackoverflow.com/questions/57926633
复制相似问题