代码之家  ›  专栏  ›  技术社区  ›  4thSpace wkw

使用方法标志还是新方法?[关闭]

  •  1
  • 4thSpace wkw  · 技术社区  · 15 年前

    如果我有一个方法可以执行某些操作并另外记录信息,那么如果我不想记录或使用标志,我应该创建一个新方法吗?

    public void MethodA(string myMessage, bool logIt)
    {
      if(logIt)
      {
        //do stuff with logging
      }
      {
        //don't need to log
      }
    }
    

    public void MethodA(string myMessage)
    {
      //do stuff with logging
    }
    
    public void MethodANoLogging(string myMessage)
    {
      //don't need to log
    }
    

    我的场景很简单,我主要对flag参数感兴趣,它可以是一个枚举,在同一方法中创建许多if…else if…else if场景。而不是仅仅用一个不同的名字创建一个新方法。我赞成第二种解决方案(新方法),因为它允许方法有一个职责。从根本上说,这是一个更简单的解决方案。

    4 回复  |  直到 15 年前
        1
  •  3
  •   ChssPly76    15 年前

    也不是。日志配置应该完全独立于业务方法。那就是 AOP 是为了。

        2
  •  2
  •   Dean Povey    15 年前

    你不应该(几乎)用布尔标志重载一个方法。原因有很多:

    1. Robert C. Martin ).

    2. 阅读这样一个方法的代码会使我们不清楚到底发生了什么。如果我是新的代码,我看到:

      如果不看一下代码,就不太清楚false是什么意思。这违背了一个原则,即一个方法的意图应该只从其名称中清晰可见。

    3. 当以后可能需要添加多个选项时,它有时是对二进制选项的不必要绑定。例如:假设您有一个方法:

      public UpdateCustomer(字符串名,布尔值isPremiumCustomer);

    如果以后决定添加不同类别的客户,则必须重构调用此方法的每一行代码。在您的情况下,一个更好的例子是,如果您希望有一个方法,使您仅在启用调试标志时才登录。

    1. 使用不同的名称创建函数。这是你采取的方法,可能也是我喜欢的方法。在大多数情况下,有一个:剂量计和一个不同的剂量计就足够了。但是,如果您需要第二个带标志的方法,则应考虑选项2:

    2. 创建描述选项的枚举。在你的情况下,可能是这样的: enum EnableLogging { ENABLE_LOGGING, DISABLE_LOGGING }

      方法A(“消息”,禁用日志记录);

    这至少是明确的。(注:该溶液来自 Effective Java 2nd Edition 作者:Joshua Bloch,但同样适用于其他语言)。

        3
  •  1
  •   Luke Schafer    15 年前

    通常,为了避免过度思考,我会做一个重载,默认为“false”

    public void MethodA(string myMessage)
    {
        MethodA(myMessage, false);
    }
    
    public void MethodA(string myMessage, bool logIt)
    {
      if(logIt)
      {
        //do stuff with logging
      }
      {
        //don't need to log
      }
    }
    

    这是我个人的喜好,我相信其他人会不同意的。不过,这并不涵盖所有情况。

        4
  •  0
  •   Adam Robinson    15 年前

    这类事情一直(也将)争论不休,但著名的答案是“这取决于”。

    创建新方法。你将不得不重复你的逻辑,这意味着在未来的两个地方保持它,没有真正的原因。做一些像。。。

    if(logIt) // log information
    
    // do something
    
    if(logIt) // log other info
    
    // do more
    
    ....etc
    

    推荐文章