Coding style 布尔值作为方法参数是否不可接受?

Coding style 布尔值作为方法参数是否不可接受?,coding-style,boolean,enumeration,Coding Style,Boolean,Enumeration,我的一位同事指出,布尔作为方法参数是不可接受的。应以枚举代替。起初我没有看到任何好处,但他给了我一个例子 什么更容易理解 file.writeData( data, true ); 或 现在我明白了!;-) 这无疑是一个示例,其中枚举作为第二个参数使代码更具可读性 那么,您对这个主题有何看法?枚举还允许将来进行修改,您现在需要第三个选择(或更多)。只有在不打算扩展框架功能的情况下,才可以接受布尔值。首选枚举,因为您可以扩展枚举,而不会中断函数调用的以前实现 枚举的另一个优点是易于阅读。布尔值表

我的一位同事指出,布尔作为方法参数是不可接受的。应以枚举代替。起初我没有看到任何好处,但他给了我一个例子

什么更容易理解

file.writeData( data, true );

现在我明白了!;-)
这无疑是一个示例,其中枚举作为第二个参数使代码更具可读性


那么,您对这个主题有何看法?

枚举还允许将来进行修改,您现在需要第三个选择(或更多)。

只有在不打算扩展框架功能的情况下,才可以接受布尔值。首选枚举,因为您可以扩展枚举,而不会中断函数调用的以前实现

枚举的另一个优点是易于阅读。

布尔值表示“是/否”选择。如果要表示“是/否”,则使用布尔值,它应该是自解释的


但是,如果在两个选项中进行选择,这两个选项都不是“是”或“否”,那么枚举有时会更具可读性。

我想你自己几乎已经回答了这个问题,我认为最终目标是使代码更具可读性,在这种情况下,枚举做到了这一点,我认为最好的做法是查看最终目标,而不是笼统的规则,也许可以将其更多地视为一个指导原则,即枚举在代码中通常比一般布尔值、整数等更具可读性,但该规则总会有例外。

枚举更好,但我不会将布尔参数称为“不可接受”。有时,如果方法提出以下问题,则更容易抛出一个布尔值并继续(想想私有方法等)

KeepWritingData (DataAvailable());
在哪里


布尔方法参数似乎有着绝对完美的意义。

这取决于方法。如果这个方法做了一些非常明显是真/假的事情,那么它是好的,例如下面[虽然我不是说这是这个方法的最佳设计,但它只是一个用法显而易见的例子]

CommentService.SetApprovalStatus(commentId, false);

但是,在大多数情况下,例如您提到的示例,最好使用枚举。在.NET Framework本身中,有许多示例没有遵循此约定,但这是因为他们在该周期的后期引入了此设计指南。

对于可能有两个以上选项的任何情况,枚举似乎都是明显的选择。但在某些情况下,布尔值就是您所需要的全部。在这种情况下,我会说,使用一个枚举,其中一个bool可以工作,这是一个使用7个单词的例子,而4个单词就可以了。

当您有一个明显的切换时,布尔值是有意义的,它只能是两件事情之一(即灯泡的状态,打开或关闭)。除此之外,最好以这样一种方式来编写它,即您正在传递的内容(例如,磁盘写入—无缓冲、行缓冲或同步—应按此方式传递)。即使您现在不想允许同步写入(因此您仅限于两个选项),也值得考虑将它们变得更详细,以便第一眼就知道它们是做什么的


也就是说,您也可以使用False和True(布尔值0和1),然后如果以后需要更多的值,则将函数扩展以支持用户定义的值(例如,2和3),旧的0/1值将很好地移植,因此您的代码不应该中断。

它确实使事情更加明确,但确实开始大规模扩展接口的复杂性——纯粹是一种布尔选择,比如添加/覆盖它似乎有点过头了。如果您需要添加进一步的选项(在本例中我想不出),您可以随时执行重构(取决于语言)

我不同意这是一个好的规则。显然,在某些情况下,Enum可以提供更好的显式或详细的代码,但一般来说,它似乎过于简单

首先让我以你为例: 程序员编写好代码的责任(和能力)并没有因为有一个布尔参数而受到损害。在您的示例中,程序员可以通过以下方式编写同样冗长的代码:

dim append as boolean = true
file.writeData( data, append );
或者我更喜欢一般的

dim shouldAppend as boolean = true
file.writeData( data, shouldAppend );
第二:
您给出的枚举示例只是“更好”,因为您正在传递一个常量。在大多数应用程序中,传递给函数的至少一些时间参数(如果不是大多数的话)是变量。在这种情况下,我的第二个示例(给变量起好名字)要好得多,Enum给您带来的好处也很小。

使用最能模拟您的问题的示例。在您给出的示例中,枚举是更好的选择。但是,布尔值在其他情况下会更好。这对你来说更有意义:

lock.setIsLocked(True);


在这种情况下,我可能会选择boolean选项,因为我认为它非常明确,而且我非常确定我的锁不会有两个以上的状态。尽管如此,第二个选择是正确的,但不必要的复杂,伊姆霍。

还记得阿德莱·史蒂文森在联合国会议期间向佐林大使提出的问题吗

“你在世界法庭上 现在就发表意见,你可以回答 是或否。你否认[导弹] 存在,我想知道我是否 我正确地理解了你……我是 准备等待我的回答直到 如果那是你的话,地狱就冻结了 决定。”

如果方法中的标志具有这样一种性质,您可以将其归结为一个二元决策,并且该决策将永远不会变成三元决策或n元决策,请选择布尔值。指示:您的标志名为isXXX

如果是模式开关,不要将其设置为布尔值。总是有一种模式比你最初编写方法时想象的多

还有一个模式难题困扰着Unix,其中
dim shouldAppend as boolean = true
file.writeData( data, shouldAppend );
lock.setIsLocked(True);
enum LockState { Locked, Unlocked };
lock.setLockState(Locked);
file.writeData(data, overwrite=true)
[file writeData:data overwrite:YES]
ProcessBatch(true, false, false, true, false, false, true);
public void Write(bool toOptical);
public void WriteOptical();
public void WriteMagnetic();
var worker = new BackgroundWorker { WorkerReportsProgress = true };
validates_presence_of :name, :allow_nil => true
connect_to_database( persistent=true )
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
if (!Enum.IsDefined(typeof(WriteMode), userValue))
    throw new ArgumentException("userValue");
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
  switch( writeMode )
  {
    case WriteMode.Append:
    case WriteMode.OverWrite:
      break;
    default:
      Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
      return false;
  }
  return true;
}
public bool IsFoo
public bool IsBar
enum FooBarType { IsFoo, IsBar, IsNeither };
var v = CallMethod(pData = data, pFileMode = WriteMode, pIsDirty = true);
file.appendData( data );  
file.overwriteData( data );
Enum.Parse(str);  
Enum.Parse(str, true); // ignore case
Enum.Parse(str, ignoreCase: true);
public void writeData(Stream data, boolean is_overwrite)
void writeData( DataObject data, bool use_append_mode );
file.writeData( data, true );
file.writeData( data, true /* use_append_mode */);