简化此功能是否可接受/良好的风格:
bool TryDo(Class1 obj, SomeEnum type)
{
if (obj.CanDo(type))
{
return Do(obj);
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
如:
bool TryDo(Class1 obj, SomeEnum type)
{
return obj.CanDo(type) && Do(obj);
}
Run Code Online (Sandbox Code Playgroud)
第二个版本较短但可以说不太直观.
Kev*_*imm 64
我要编码的是:
return obj.CanDo(type) ? Do(obj) : false;
Run Code Online (Sandbox Code Playgroud)
Svi*_*ack 24
带括号的版本:
bool TryDo(Class1 obj, SomeEnum type)
{
if (obj.CanDo(type))
{
return Do(obj);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
或者没有括号的版本(在回答评论中是关于它的高度争论):
bool TryDo(Class1 obj, SomeEnum type)
{
/*
* If you want use this syntax of
* "if", this doing this on self
* responsibility, and i don't want
* get down votes for this syntax,
* because if I remove this from my
* answer, i get down votes because many
* peoples think brackets i wrong.
* See comments for more information.
*/
if (obj.CanDo(type))
return Do(obj);
return false;
}
Run Code Online (Sandbox Code Playgroud)
你的第一个代码示例更好,但我认为我的版本更好.
你的第二个版本的可读性不好,使代码难以维护,这很糟糕.
Pau*_*des 18
它else是无用的&&,但是很明显,它不像纯文本那样可读.
我更喜欢以下内容:
bool TryDo(Class1 obj, SomeEnum type)
{
if (obj.CanDo(type))
{
return Do(obj);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 13
是.
尤其是类似于您选择的名称,即名称CanDoSomething和DoSomething它是绝对清楚任何有能力的程序员什么第二个代码所做的:" 当且仅当该条件成立,做一些事情,返回的结果"."当且仅当"是短路&&运营商的核心含义.
第一个代码是复杂的并且不必要地长,而不提供比第二个代码更多的信息.
但总的来说,这两个条件可能不会形成如此亲密的关系(如在CanDo和中Do)并且最好将它们逻辑地分开,因为将它们置于相同的条件中可能并不具有直观意义.
很多人都声称第一个版本"更加清晰".我真的很想听听他们的论点.我什么都想不到.
在另一方面,有这密切相关的(虽然不是很相同)的代码:
if (condition)
return true;
else
return false;
Run Code Online (Sandbox Code Playgroud)
这应该总是转变为:
return condition;
Run Code Online (Sandbox Code Playgroud)
没有例外.对于掌握该语言能力的人来说,它更简洁,更具可读性.
Kev*_*van 12
缩短版本隐藏了Do做某事的事实.看起来你只是在进行比较并返回结果,但实际上你正在进行比较并执行一个动作,并且代码具有这种"副作用"并不明显.
我认为问题的核心在于您返回评估结果和操作的返回代码.如果你以这种方式返回两个评估的结果,我就不会有问题了
另一个可能更具可读性的替代方法是使用条件运算符:
bool TryDo(Class1 obj, SomeEnum type) {
return obj.CanDo(type) ? Do(obj) : false;
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种设计,也许不是因为显而易见的原因.困扰我的是.return Do(obj); 对我而言,Do函数具有bool返回类型是没有意义的.这是否可以替代推动错误的财产?很可能这个函数应该是void或返回一个复杂的对象.这种情况应该不会出现.此外,如果一个bool现在以某种方式有意义,它将来很容易停止有意义.随着代码的更改,需要更多的因子来修复
也不是,因为当TryDo返回False时,您无法确定它是否是因为'Not CanDo'或'Do return False'.
我完全理解你可以忽略结果,但它表达的方式暗示结果有意义.
如果结果毫无意义,那么意图就会更加清晰
void TryDo(Class1 obj, SomeEnum type)
{
if (obj.CanDo(type))
Do(obj);
return;
}
Run Code Online (Sandbox Code Playgroud)
如果结果确实有意义,那么应该有一种方法来区分两个"错误"的回报.IE"If(!TryDo(x))" 是什么意思?
编辑:换句话说,OP的代码是说'我不会游泳'与'我试图游泳和淹死'相同
| 归档时间: |
|
| 查看次数: |
2072 次 |
| 最近记录: |