我遇到了重构问题。我有很多类似的方法,但我找不到从它们中提取一行并制作另一个私有方法的方法。
private function constructRules($rules, 'Languages $langs) {
foreach ($rules as $fieldType => $rule) {
foreach ($langs->all() as $lang) {
//line below changes
$langRules[$fieldType . '[' . $lang->lang . ']'] = $rule;
}
}
return $langRules;
}
我在4个不同的地方有这些前臂环。如果我extact foreach循环并返回数组,我仍然需要在方法中创建一个foreach循环,以填充本例中的$langRules。也许有简单的方法可以做到,但我看不到…
这不仅仅是将代码的"任务"部分分解为回调的问题吗?
private function constructRulesUsingCallBack($rules, 'Languages $langs, $task) {
$langRules = [];
foreach ($rules as $fieldType => $rule) {
foreach ($langs->all() as $lang) {
$task($langRules, $fieldType, $lang, $rule);
}
}
return $langRules;
}
$langRules = constructRulesUsingCallBack($rules, $langs, function (&$langRules, $fieldType, $lang, $rule) {
$langRules[$fieldType . '[' . $lang->lang . ']'] = $rule;
});
我对PHP不太熟悉,我对内联函数表达式中所需的大量样板文件也不满意,但PHP似乎没有很好地实现闭包(无论如何,我都可以解决)。
然而,您可以让constructRulesUsingCallBack()
函数保持原样,现在只处理循环,每次需要处理这些循环中的某些内容时,只需将回调主体的不同实现传递给它。
根据你的例子,似乎是在满足你的需求。如果没有,请澄清,我可能会增加这一点,以满足您的需求。