Jus*_*ner 14
我在大学时曾经有一位教授告诉我,任何好的代码都不应该需要任何评论.
她的方法是将非常精确的逻辑组合成具有非常描述性的方法/属性/变量名称的小函数.事实上,她提出的大部分内容都非常易读,没有任何评论.我试着对我写的一切做同样的事情......
我喜欢'人性化'代码,所以代替:
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)
在某些情况下 - 是的,但在许多情况下没有.其他人已经回答了" 是"部分 - 保持简单,写得很好,给它可读的名字等等.当你在代码中解决的问题根本不是代码问题而是域特定问题或业务时,没有任何部分可用逻辑问题.即使它没有评论,我也没有问题阅读糟糕的代码.这很烦人,但可行.但是,如果不理解为什么它会像这样以及它试图解决什么,那么几乎不可能阅读一些代码.所以像:
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)
使用描述性变量名称和描述性方法名称。使用空格。
让你的代码读起来就像正常对话一样。
对比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)