重构条件 PHP
Refactoring Conditional PHP
我想知道是否还有其他方法可以重构我的条件 if/else 语句。我觉得我一遍又一遍地重复同样的事情,
这是一个片段(记住比那个长很多,但它遵循相同的原则)我可以做一个 switch 语句,但它不会减少总代码量。
我只想就将此代码投入生产的最佳方法征求意见。同样重要的是要提到我正在比较的语句 $screen->id;如果用户选择复选框,则最有可能动态生成,但这超出了问题的范围。
//check admin screen
$screen = get_current_screen();
if ( $screen->id === 'topic') {
$in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
$in['block_formats'] = $topics_blocks;
return $in;
}
elseif ( $screen->id === 'provider-jobs') {
$in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
$in['block_formats'] = $providers_blocks;
return $in;
}
//for all the page options
else {
$in['block_formats'] = $global_blocks;
return $in;
}
}
谢谢!任何指导表示赞赏。
更新! 这是重构后的代码,更简洁一点!并完成整个上下文显示。
//check admin screen
$screen = get_current_screen();
//global ones
$in['block_formats'] = $global_blocks;
$in['toolbar1'] = $global_toolbar;
if ( $screen->id === 'topic') {
$in['block_formats'] = $topics_blocks;
$in['toolbar1'] = $topics_toolbar;
} elseif ( $screen->id === 'forum') {
$in['block_formats'] = $forums_blocks;
$in['toolbar1'] = $forums_toolbar;
} elseif ( $screen->id === 'post') {
$in['block_formats'] = $blogs_blocks;
$in['toolbar1'] = $blogs_toolbar;
} elseif ( $screen->id === 'jobs') {
$in['block_formats'] = $jobs_blocks;
$in['toolbar1'] = $jobs_toolbar;
}
elseif ( $screen->id === 'provider-jobs') {
$in['block_formats'] = $providers_blocks;
$in['toolbar1'] = $providers_toolbar;
}
return $in;
您可以注册 key/value 对所有已知 options/blocks。所以你的代码直接减少了,像这样:
$options = [
'topic' => $topics_blocks,
'provider_jobs' => $providers_blocks,
// ...
];
//check admin screen
$screen = get_current_screen();
if (array_key_exists($screen->id, $options) {
$in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
$in['block_formats'] = $options[$screen->id];
} else {
$in['block_formats'] = $global_blocks;
}
return $in;
编辑,适用于OP的第二版
这里的问题有点不同,所以这里是另一个解决方案:
$options = [
'topic' => 'topics',
'forum' => 'forums',
'post' => 'blogs',
'jobs' => 'jobs',
'provider_jobs' => 'providers',
];
//check admin screen
$screen = get_current_screen();
//global ones
$in['block_formats'] = $global_blocks;
$in['toolbar1'] = $global_toolbar;
// variable ones
if (array_key_exists($screen->id, $options) {
$in['block_formats'] = ${$options[$screen->id] . '_blocks'};
$in['toolbar1'] = $options[$screen->id] . '_toolbar'};
}
return $in;
我想知道是否还有其他方法可以重构我的条件 if/else 语句。我觉得我一遍又一遍地重复同样的事情,
这是一个片段(记住比那个长很多,但它遵循相同的原则)我可以做一个 switch 语句,但它不会减少总代码量。
我只想就将此代码投入生产的最佳方法征求意见。同样重要的是要提到我正在比较的语句 $screen->id;如果用户选择复选框,则最有可能动态生成,但这超出了问题的范围。
//check admin screen
$screen = get_current_screen();
if ( $screen->id === 'topic') {
$in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
$in['block_formats'] = $topics_blocks;
return $in;
}
elseif ( $screen->id === 'provider-jobs') {
$in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
$in['block_formats'] = $providers_blocks;
return $in;
}
//for all the page options
else {
$in['block_formats'] = $global_blocks;
return $in;
}
}
谢谢!任何指导表示赞赏。
更新! 这是重构后的代码,更简洁一点!并完成整个上下文显示。
//check admin screen
$screen = get_current_screen();
//global ones
$in['block_formats'] = $global_blocks;
$in['toolbar1'] = $global_toolbar;
if ( $screen->id === 'topic') {
$in['block_formats'] = $topics_blocks;
$in['toolbar1'] = $topics_toolbar;
} elseif ( $screen->id === 'forum') {
$in['block_formats'] = $forums_blocks;
$in['toolbar1'] = $forums_toolbar;
} elseif ( $screen->id === 'post') {
$in['block_formats'] = $blogs_blocks;
$in['toolbar1'] = $blogs_toolbar;
} elseif ( $screen->id === 'jobs') {
$in['block_formats'] = $jobs_blocks;
$in['toolbar1'] = $jobs_toolbar;
}
elseif ( $screen->id === 'provider-jobs') {
$in['block_formats'] = $providers_blocks;
$in['toolbar1'] = $providers_toolbar;
}
return $in;
您可以注册 key/value 对所有已知 options/blocks。所以你的代码直接减少了,像这样:
$options = [
'topic' => $topics_blocks,
'provider_jobs' => $providers_blocks,
// ...
];
//check admin screen
$screen = get_current_screen();
if (array_key_exists($screen->id, $options) {
$in['content_css'] = get_template_directory_uri() . "/build/styles/tiny-mce-editor.css";
$in['block_formats'] = $options[$screen->id];
} else {
$in['block_formats'] = $global_blocks;
}
return $in;
编辑,适用于OP的第二版
这里的问题有点不同,所以这里是另一个解决方案:
$options = [
'topic' => 'topics',
'forum' => 'forums',
'post' => 'blogs',
'jobs' => 'jobs',
'provider_jobs' => 'providers',
];
//check admin screen
$screen = get_current_screen();
//global ones
$in['block_formats'] = $global_blocks;
$in['toolbar1'] = $global_toolbar;
// variable ones
if (array_key_exists($screen->id, $options) {
$in['block_formats'] = ${$options[$screen->id] . '_blocks'};
$in['toolbar1'] = $options[$screen->id] . '_toolbar'};
}
return $in;