使用方法标志还是新方法?

时间:2009-08-25 23:51:27

标签: design-patterns oop methodology

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

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

... ... VS

public void MethodA(string myMessage)
{
  //do stuff with logging
}

public void MethodANoLogging(string myMessage)
{
  //don't need to log
}

我的场景很简单,我主要对flag参数感兴趣,这可能是一个枚举创建很多if ... else if ... else如果同一方法中的场景。而只是创建一个具有不同名称的新方法。我赞成第二种解决方案(新方法),因为它允许方法承担一项责任。从根本上说,这是一个更简单的解决方案。

使用旗帜版本的原因是什么?

4 个答案:

答案 0 :(得分:3)

都不是。您的日志记录配置应完全独立于您的业务方法。这就是AOP的用途。

答案 1 :(得分:2)

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

  1. 为了避免混淆,方法应该只做一件事。布尔标志清楚地表明方法不止一件事(来自Robert C. Martin)。

  2. 阅读这种方法的代码使得不清楚究竟发生了什么。如果我对代码不熟悉,我会看到:

    MethodA(“这是一条消息”,false);

    如果不看代码那么虚假意味着什么并不完全清楚。这不符合一个原则,即方法的意图应该仅从其名称中清楚。

  3. 如果以后需要添加多个选项,有时会对二进制选项进行不必要的绑定。例如:假设你有一个方法:

    public UpdateCustomer(String name,boolean isPremiumCustomer);

  4. 如果您以后决定添加不同类别的客户,则必须重构调用此方法的每行代码。在您的情况下,一个更好的示例是,如果您想要一个方法,只有在打开调试标志时才记录。

    替代方法大致如下:

    1. 使用其他名称创建一个函数。这是你采取的方法,可能是我喜欢的方法。在大多数情况下,只需要一个:doSomething和doSomethingADifferentWay就像你的例子一样。但是,如果您需要第二个带标记的方法,那么您应该考虑选项2:

    2. 创建一个描述选项的枚举。在你的情况下,这将是这样的: enum EnableLogging { ENABLE_LOGGING, DISABLE_LOGGING }然后您将代码编写为:

      MethodA(“消息”,DISABLE_LOGGING);

    3. 哪个至少是明确的。 (注意:此解决方案来自Joshua Bloch的Effective Java 2nd Edition中的第40项,但同样适用于其他语言)。

答案 2 :(得分:1)

通常情况下,为避免过度思考,我会做过载,默认为'假'

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
  }
}

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

答案 3 :(得分:0)

这种事情已经(并将会)无休止地辩论,但着名的答案是“它取决于”。

对于是否记录(意味着应用程序中不应存在任何副作用),我绝对创建新方法。您将不得不复制您的逻辑,这意味着将来在两个地方维护它,没有任何理由。做一些像...这样的事情更有意义。

if(logIt) // log information

// do something

if(logIt) // log other info

// do more

....etc

无论您是否想要登录,您的核心逻辑都是相同的,并且只在一个地方。