我们有一个中间开发人员,他非常擅长他的工作,但这个钻石有一个粗略的优势.他确实坚持每个方法只有一个入口和一个出口点.
我正在采取的方法是不要为他编写的代码做出太大的交易(除非存在严重的清晰度问题).困扰我的是他开始重构其他代码,以便它只有一个入口和出口点.这是已经过测试的代码(但并不总是使用自动化测试),因此存在风险.
我是团队的高级开发人员,所以我有权在代码库中定义规则.但是这里要遵循的正确道路是什么?我应该让他继续重构像这样的其他代码吗?如果没有,接近这种情况的最佳方法是什么?
通常情况下,您可能会有一个检查众多条件并返回状态的方法(现在就说布尔值).最好定义一个标志,在方法中设置它,并在结尾返回它:
boolean validate(DomainObject o) {
boolean valid = false;
if (o.property == x) {
valid = true;
} else if (o.property2 == y) {
valid = true;
} ...
return valid;
}
Run Code Online (Sandbox Code Playgroud)
或者,一旦你知道方法的结果,简单地返回会更好/更正确吗?
boolean validate(DomainObject o) {
if (o.property == x) {
return true;
} else if (o.property2 == y) {
return true;
} ...
return false;
}
Run Code Online (Sandbox Code Playgroud)
现在显然可能有try/catch块和所有其他类型的条件,但我认为这个概念很清楚.意见?
这只是一个简单的检查,以查看输出的字母等级.有没有更快,更有效的方法来实现目标?
if ( $grade >= 90 ) {
echo "A";
} elseif ( $grade >= 80 ) {
echo "B";
} elseif ( $grade >= 70 ) {
echo "C";
} else {
echo "Failed."
}
Run Code Online (Sandbox Code Playgroud) 有时我喜欢使用早期的 return 语句来防止嵌套 if 语句,我发现这会导致代码可读性较差。
我想知道是否存在任何客观或压倒性的普遍共识,以下两种模式是更好的做法?我不认为这是一个主观问题,因为我真正要问的是近乎客观的偏好。
void func() {
if (a) {
do b
}
else {
do c
}
}
Run Code Online (Sandbox Code Playgroud)
或者
void func() {
if (a) {
do b
return;
}
do c
}
Run Code Online (Sandbox Code Playgroud) 我知道这是一个风格问题,因此是主观标签.我有一小段代码,有两个嵌套条件.我可以用两种方式对它进行编码,我希望看到更有经验的开发人员认为它应该是什么样子.
风格1:
while (!String.IsNullOrEmpty(msg = reader.readMsg()))
{
RaiseMessageReceived();
if (parseMsg)
{
ParsedMsg parsedMsg = parser.parseMsg(msg);
RaiseMessageParsed();
if (processMsg)
{
process(parsedMsg);
RaiseMessageProcessed();
}
}
}
Run Code Online (Sandbox Code Playgroud)
风格2:
while (!String.IsNullOrEmpty(msg = reader.readMsg()))
{
RaiseMessageReceived();
if (!parseMsg) continue;
ParsedMsg parsedMsg = parser.parseMsg(msg);
RaiseMessageParsed();
if (!processMsg) continue;
process(parsedMsg);
RaiseMessageProcessed();
}
Run Code Online (Sandbox Code Playgroud)
(附带问题:如何在源代码示例中放置空行?)
好吧,这可能是一些黑客攻击,但请忍受我:)背景是我厌倦了一些方法,那些if语句会弄乱整个方法,例如:
public SomeClass DoStuff(string inputStr)
{
SomeClass result =null;
if (IsOpenFilter(inputStr))
{
....
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
所以我在想,如果我可以做这样的事情,那不是很好吗:
public SomeClass DoStuff(string inputStr)
{
Require(IsOpenFilter(inputStr),null);
....
return result;
}
Run Code Online (Sandbox Code Playgroud)
这种情况可能会被某种形式的代码合同所涵盖,如果是这样,请纠正我:)
我们的想法是,如果语句的计算结果为true,则返回null.如果该方法没有返回类型,则只需:Require(IsOpenFilter(inputStr));
所以我想有两个问题,这可以以某种方式完成吗?我对如何通过调用方法进行条件返回感到困惑.
另一个问题是,这是一个好主意吗?monkeypatch这样的语言有点奇怪,但我更喜欢代码读取的方式.如果它可以放在方法上面的属性中,我会更干净:[Require(IsOpenFilter(inputStr))]
我正在考虑允许我返回计算结果和状态的模式:
我可以考虑的方法有以下几种:
函数返回计算结果,状态通过输出参数返回(并非所有语言都支持输出参数,这似乎是错误的,因为通常您不期望参数被修改)。
函数返回包含两个值的对象/对(缺点是您必须创建人工类才能返回函数结果或使用没有语义意义的对 - 您可以根据顺序知道哪个参数是哪个)。
如果您的状态只是成功/失败,您可以返回计算值,并且在出现错误时抛出异常(看起来是最好的方法,但仅适用于成功/失败场景,不应被滥用于控制正常程序流程)。
函数返回值,函数参数是 onSuccess/onFailure 过程的委托。
有一个(状态完整)方法类,它具有状态字段和返回计算结果的方法(我更喜欢拥有无状态/不可变对象)。
请给我一些关于使用上述方法的优点、缺点和情况前提条件的提示,或者向我展示我可以使用的其他模式(最好提示何时使用它们的前提条件)。
编辑:现实世界的例子:我正在开发java ee互联网应用程序,我有一个类解析请求参数,将它们从字符串转换为一些业务逻辑对象。解析器正在数据库中检查是否正在创建或编辑对象,然后将新对象或从数据库获取的对象返回到控制器。控制器根据从解析器读取的对象状态(新/编辑)采取行动。我知道这很糟糕,我想改进这里的代码设计。
我有一个try块,用于尝试运行数据库查询,还有一个finally块,用于释放数据库资源.如果数据库中不存在值,则返回null.
在try块中返回是个好主意吗?
一些示例代码:
try {
if (!jedis.exists(name)) {
return null; // Is this a good idea?
}
// Do database related stuff...
} catch (JedisConnectionException e) {
// Fix any problems that happen
} finally {
// Return all objects to pools and clean up
}
Run Code Online (Sandbox Code Playgroud) 给出表单中的简单if语句
public static String test(boolean flag) {
if (!flag) {
return "no";
} else {
System.out.println("flag enabled");
}
return "yes";
}
Run Code Online (Sandbox Code Playgroud)
要么
public static String test(final boolean flag)
{
if (flag)
{
System.out.println("flag enabled");
return "yes";
}
else
{
return "no";
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse给了我警告,强调整个其他块
声明不必要地嵌套在else子句中.相应的then子句不能正常完成
但是,这......
public static String test(final boolean flag)
{
if (flag)
{
System.out.println("flag enabled");
return "yes";
}
return "no";
}
Run Code Online (Sandbox Code Playgroud)
没有发出警告.
这个问题似乎有关系,但我没有在第一个例子的其他地方使用return,否则最终没有.
我知道这只是一个偏好,它可以被关闭.但是,我不喜欢忽视事情只是因为我不明白是什么问题.而且我似乎找不到任何关于为什么Eclipse将其添加为可配置警告的文档.
总而言之,The corresponding then clause does not complete normally意味着什么?这个警告试图保护我的问题是什么?
这段代码一直困扰着我,部分是因为
if (result != OpResult.Success) { // return
Run Code Online (Sandbox Code Playgroud)
代码重复,到处都是.
1..n执行一系列评估.每次评价后,进行检查,以确保手术很成功(利用枚举派生的自定义返回值): OpResult.Success.
这是一个例子(带有示例对象等):
OpResult result = OpResult.Sucess;
result = performOperationOne(commonObjectArgument);
if (result != OpResult.Success)
{
trace.Exit(); // Exit logging mechanism
return result;
}
result = performOperationTwo(commonObjectArgument);
if (result != OpResult.Success)
{
trace.Exit();
return result;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,if (result != OpResult.Success)用作流控制,即除非所有先前的操作都成功,否则下一个操作不会运行.
使用.Net 4.*,C#在语法上已经具备了一些非常令人难以置信的功能.我可以采取哪些措施来消除每次操作后需要重新编写此评估的内容吗?
coding-style ×4
java ×3
c# ×2
if-statement ×2
.net ×1
performance ×1
php ×1
return ×1
return-path ×1
return-value ×1