zoukankan      html  css  js  c++  java
  • 把boolean 参数放到最后面(Put boolean arguments last)

    在CodeProject上看到一篇有意思的文章,特翻译和分享下:

    每当我看到一个方法调用如下:

    Enum.TryParse(stringRepresentationOfEnum, true, out enumValue);

    我就会想这个’true’ 参数代表的是什么意思呢。在这个例子中,基于我过去的经验我知道在这个方法中它代表的是ignoreCase 参数。

    但是,如果这是一个你从未见过的完全不同的方法呢:

    service.DoOperation(DateTime.Now, true, false, false, true, currentValue, userName);
     

    这是一个特别XXX的方法。但是假设一下这就是这个方法必须要的签名,可悲的是,在这个方法想要明白boolean 参数的值的含义很难,

    假设我们不能改变接口,我们还能做什么来让代码更清楚呢?

    首先,我们可以为每个boolean值传递命名好的变量:

    bool includeHeader = true;
    bool checkSecurity = false;
    bool validateDate = false;
    bool fireCompletionEvent = true;
    service.DoOperation(DateTime.Now, includeHeader, checkSecurity, validateDate, fireCompletionEvent, currentValue, userName);

    除了代码有点不简洁外,这的确好了很多。

    当然在C# 4.0 中,我们不需要这样做,相反我们可以使用命名参数:

    service.DoOperation(DateTime.Now, includeHeader: true, checkSecurity: false, validateDate: false, fireCompletionEvent: false, currentValue, userName);

    不幸的是,它并不能如期的正常运行 - 最后面的两个参数无法出现在命名参数的后面。

    这意味着我们必须添加一些额外的代码:

    service.DoOperation(DateTime.Now, includeHeader: true, checkSecurity: false, validateDate: false, fireCompletionEvent: false, currentValue: currentValue, userName: userName);

    这就是为什么我建议把布尔参数放到参数列表的最后的原因:

    service.DoOperation(DateTime.Now, currentValue, userName, includeHeader: true, checkSecurity: false, validateDate: false, fireCompletionEvent: false);

    这的确清楚多了,但它确实需要你在设计你的方法签名时牢记这一点。

    原文链接:Put boolean arguments last [Technical Blog]

  • 相关阅读:
    dom4j解析XML时忽略DTD文件,加速文件解析过程
    mysql 中 in 语句参数个数
    N皇后 java
    springboot+jpa多表查询
    使用lua脚本在nginx上进行灰度流量转发
    RestTemplate将字符串以文件的方式上传
    在idea中编写自动拉取、编译、启动springboot项目的shell脚本
    逻辑回归调优方向
    流程图采用mindmanager进行绘制相关流程图体验较好
    尝试使用utool进行一些任务管理,例如ocr功能,使用讯飞ocr可以提高效率,替换图床
  • 原文地址:https://www.cnblogs.com/LoveJenny/p/2672792.html
Copyright © 2011-2022 走看看