如何将boolean参数传递给函数以充当开关?

时间:2017-10-18 04:55:52

标签: php function

如果标题不清楚,我很抱歉,但我发现这很难描述。基本上,我有一个函数,它在给定类ID号和日期的情况下查找类(学校类)的实例。如果需要,该函数还可以创建新的类实例。

function get_class_instance($class_id, $date, $create)

在函数内部是 class_instances 表中的数据库选择,使用 class_id 日期作为参数。如果找到匹配的 class_instance ,则返回其ID。如果没有找到,则创建参数有条件。如果是,则使用数据库插入创建新的 class_instance ,并返回其ID。如果为false,则数据库中不会更改任何内容,并返回 false

我仍然是PHP和编码的初学者,所以我认为可能有更好的方法。问题在于,在调用函数时,某些人可能不清楚为什么会传递布尔值。

$original_cinstance_id = get_class_instance($original_class_id, $original_date, 1);

4 个答案:

答案 0 :(得分:3)

您可以使用默认值进行创建,因此如果您向其传递任何内容,则它会充当正常的" get"数据库的操作。像这样:

function get_class_instance($class_id, $date, $create = false);

您可以像这样查询您的ID:

$class_id = get_class_instance(1, "18-10-2017");

然后你可以通过" true"无论什么时候需要在数据库上创建它:

$class_id = get_class_instance(1, "18-10-2017", true);

答案 1 :(得分:2)

将布尔标志传递给函数以使它们执行两个不同的事情而不仅仅是一个在Code SmellRobert Martin中被视为Clean Code book。建议的更好选择是使用两个函数get_whatevercreate_whatever

虽然Code Smell依赖于上下文,但我认为布尔标志气味确实适用于这种情况,因为创建一些东西不仅仅是阅读它。前者是命令,后者是查询。 So they should be separated。一个改变状态,另一个改变状态。它使语义更好,separation of concerns分割它们。此外,它会将函数的Cyclomatic Complexity减少一个分支,因此您需要少一个单位测试来覆盖它。

引用https://martinfowler.com/bliki/FlagArgument.html

  

布尔参数大声声明该函数不止一件事。它们令人困惑,应该被淘汰。

引用http://www.informit.com/articles/article.aspx?p=1392524

  

我的理由是,单独的方法可以更清楚地传达我打电话时的意图。当我看到book(martin, false)时,我可以轻松阅读regularBook(martin),而不必记住标志变量的含义。

其他讨论和阅读材料:

答案 2 :(得分:1)

您可以传递一个真实的布尔值,而不是传递数值:

$original_cinstance_id = get_class_instance($original_class_id, $original_date, true);

同样在函数声明中,您可以指定一个默认值,以避免每次都传递布尔值:

function get_class_instance($class_id, $date, $create = false)

答案 3 :(得分:1)

一个选项是创建一个如下的枚举器:

abstract class create_options {
    const no_action = 0;
     const create = 1;
}

所以现在你的函数调用看起来像这样:

$original_cinstance_id = get_class_instance($original_class_id, $original_date, create_options::no_action);

在实践中,只要你的代码得到很好的评论,那么这不是布尔标志的主要问题,但是如果你有十几个可能的选项有不同的结果,那么这可能是有用的。

正如其他人所提到的,在许多语言中,您也可以将参数设为可选参数,并具有默认行为,除非调用者专门定义该参数。