引入参数对象
重构动机
如果一组数据项总是一同出现在一个又一个函数中,那么这组数据项就是数据泥团。
我们可以将数据项组织成结构,这会让数据项之间的关系变得清晰,而且使用新的数据结构,函数的参数列表也能缩短。
数据项除了可以组织成数据结构,也可以使用类组织起来,然后传入对象。
重构前
<?php
namespace app\controller;
class Index
{
/**
* @var array 值日表
*/
protected $studentsDutyTable = [
'一年级' => [
'1班' => ['星期一' => '小和', '星期二' => '小梧'],
'2班' => ['星期一' => '小晓', '星期二' => '小流']
],
'二年级' => [
'1班' => ['星期一' => '小A', '星期二' => '小B'],
'2班' => ['星期一' => '小C', '星期二' => '小D']
]
];
/**
* 输出今天值日生的姓名
*/
public function theStudentOnDutyToday()
{
$name = $this->getStudentDutyTable('一年级', '2班', '星期二');
echo "今天的值日生是" . $name;
}
/**
* 获取今天值日的学生姓名
*/
public function getStudentDutyTable($grade, $class, $today)
{
return $this->studentsDutyTable[$grade][$class][$today];
}
}
重构后
<?php
namespace app\controller;
class Index
{
/**
* @var array 学生名字数组
*/
protected $studentsDutyTable = [
'一年级' => [
'1班' => ['星期一' => '小和', '星期二' => '小梧'],
'2班' => ['星期一' => '小晓', '星期二' => '小流']
],
'二年级' => [
'1班' => ['星期一' => '小A', '星期二' => '小B'],
'2班' => ['星期一' => '小C', '星期二' => '小D']
]
];
/**
* 输出今天值日生的姓名
*/
public function theStudentOnDutyToday()
{
$duty = ['grade' => '一年级', 'class' => '2班', 'today' => '星期二'];
$name = $this->getStudentDutyTable($duty);
echo "今天的值日生是" . $name;
}
/**
* 获取今天值日的学生姓名
*/
public function getStudentDutyTable($duty)
{
return $this->studentsDutyTable[$duty['grade']][$duty['class']][$duty['today']];
}
}