是否有可能在没有任何评论的情况下编写好的和可理解的代码?

pan*_*ang 15 comments

任何人都可以建议在没有一行注释的情况下编写可以理解的优秀代码的最佳方法是什么?

Ins*_*ter 15

阅读Code Complete,第2版封面.也许两次.

给出一些细节:

  • 使代码可读
  • 消除代码重复
  • 在编写代码之前进行设计/体系结构


Jus*_*ner 14

我在大学时曾经有一位教授告诉我,任何好的代码都不应该需要任何评论.

她的方法是将非常精确的逻辑组合成具有非常描述性的方法/属性/变量名称的小函数.事实上,她提出的大部分内容都非常易读,没有任何评论.我试着对我写的一切做同样的事情......

  • 我希望我的教授们更喜欢这样.我的大多数评论都很疯狂.我记得在每个源文件的开头需要一个大格式的注释部分,在每个函数之前至少有一个四行格式的注释部分,并且函数中的每一行也必须有一个内联注释.每次任务后我的手指疼痛. (5认同)
  • @Kenneth这就是我们得到像i ++这样的东西; //将1添加到i并将结果存储在i中. (3认同)

Chr*_*ell 7

我喜欢'人性化'代码,所以代替:

if (starColour.red > 200 && starColour.blue > 200 && starColour.green > 200){
   doSomething();
}
Run Code Online (Sandbox Code Playgroud)

我会这样做的:

bool starIsBright;
starIsBright = (starColour.red > 200 && starColour.blue > 200 && starColour.green > 200);

if(starIsBright){
   doSomething();
}
Run Code Online (Sandbox Code Playgroud)


Dim*_*ima 6

在某些情况下 - 是的,但在许多情况下没有.其他人已经回答了" 是"部分 - 保持简单,写得很好,给它可读的名字等等.当你在代码中解决的问题根本不是代码问题而是域特定问题或业务时,没有任何部分可用逻辑问题.即使它没有评论,我也没有问题阅读糟糕的代码.这很烦人,但可行.但是,如果不理解为什么它会像这样以及它试图解决什么,那么几乎不可能阅读一些代码.所以像:

if (starColour.red > 200 && starColour.blue > 200 && starColour.green > 200){
   doSomething();
}
Run Code Online (Sandbox Code Playgroud)

看起来不错,但在程序实际执行的环境中可能毫无意义.我宁愿这样:

// we do this according to the requirement #xxxx blah-blah..
if (starColour.red > 200 && starColour.blue > 200 && starColour.green > 200){
   doSomething();
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*som 6

编写良好的代码可能不需要评论来解释你正在做什么,但你仍然需要评论来解释原因.


Ale*_*x B 1

使用描述性变量名称和描述性方法名称。使用空格。

让你的代码读起来就像正常对话一样。

对比Junit中Matchers的使用:

assertThat(x, is(3));
assertThat(x, is(not(4)));
assertThat(responseString, either(containsString("color")).or(containsString("colour")));
assertThat(myList, hasItem("3"));
Run Code Online (Sandbox Code Playgroud)

与传统风格的assertEquals:

assertEquals(3, x);
Run Code Online (Sandbox Code Playgroud)

当我查看该assertEquals声明时,不清楚哪个参数是“预期”,哪个是“实际”。

当我查看时,assertThat(x, is(3))我可以将其用英文读作“断言 x 是 3”,这对我来说非常清楚。

编写自记录代码的另一个关键是用清晰的名称包装方法调用中任何不清楚的逻辑。

if( (x < 3 || x > 17) && (y < 8 || y > 15) )
Run Code Online (Sandbox Code Playgroud)

变成

if( xAndYAreValid( x, y ) )  // or similar...
Run Code Online (Sandbox Code Playgroud)