下面二者中有一人是对业绩和标准做法的最大侵犯。 如何。 该网络内部处理这两个法典的刀子?
法典1
If(result)
{
process1();
}
else
{
process2();
}
第2条
If(result)
{
process1();
return;
}
process2();
下面二者中有一人是对业绩和标准做法的最大侵犯。 如何。 该网络内部处理这两个法典的刀子?
法典1
If(result)
{
process1();
}
else
{
process2();
}
第2条
If(result)
{
process1();
return;
}
process2();
在任何正常情况下,业绩差异微不足道。
一种标准做法(除其他做法外)是试图从一种方法中保留一个单一出点,以便谈判有利于第一种选择。
在中间对<代码>return的实际实施最有可能使该方法的末端出现跳跃,而关于该方法的打字框架的代码是这样,最终的可执行代码可能与这两项守则相同。
我个人总是要回来,这样我就想像:
if (result)
{
// do something
return;
}
// do something if not result
在业绩方面,我怀疑,无论是哪一方都比另一方都拥有任何优势,而是真正做到可读性和个人信条。 我假定,“网络”将优化你的第一组代码,使之达到上述标准。
我认为,单一出境点已经过高。 定时太仓促,可能会导致某些非常复杂的法典,而实际上这些法典要么有多个出境点,要么分为较小的方法。
我要说,两者之间的选择取决于语义。
如果情况确实如此,否则地图就完全照样。
if (isLoggedIn) {
RedirectToContent();
} else {
RedirectToLogin();
}
如果有些条件允许的话,就会进行一些清理,并将地图更好地排到第2条。 这被称为守卫模式。 这使得该法典的体质尽可能正常、清晰、不必要地.。 它通常用于验证参数或状态(如果某种东西无效,或者有些事情如).)。
if (user == null) {
RedirectToLogin();
return;
}
DisplayHelloMessage(user.Name);
看到同一项目中使用的两种形式并不罕见。 正如我所说的那样,什么使用取决于你再次试图传达的东西。
如果存在共同的法典,则需要在选择1之后执行。
如果是哪类企业是履行某种职能的最后一件事,则选择2。
我本人总是使用选择1。 如果返回国,则是在其他障碍之后。
如果你去掉第2版周围的镜头,那就完全是我使用的。 我宁愿使早期验证部分成为一项职能的明显部分,然后我可以去做生意。
尽管如此,它还是提出了意见。 只要你对此持一致态度,就走了一条路,并坚持下去。
<<>strong>edit: 关于业绩,已申报的IL完全相同。 选择一种或另一种方式,对这两种情况都没有任何惩罚。
这两者将汇编成相同的释放模式(在Debug可能有几个不同的Nop剧)。 因此不会有业绩差别。 这完全取决于你和你的团队如何看待该守则。
我曾经在难民营中反对尽早撤离,但现在我感到,可以使守则更加简单。
// C#
public static void @elseif(bool isTrue)
{
if (isTrue)
Process1();
else
Process2();
}
// IL
.method public hidebysig static void elseif(bool isTrue) cil managed
{
// Code size 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: brfalse.s IL_0009
IL_0003: call void elseif.Program::Process1()
IL_0008: ret
IL_0009: call void elseif.Program::Process2()
IL_000e: ret
} // end of method Program::elseif
// C#
public static void @earlyReturn(bool isTrue)
{
if (isTrue)
{
Process1();
return;
}
Process2();
}
// IL
.method public hidebysig static void earlyReturn(bool isTrue) cil managed
{
// Code size 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: brfalse.s IL_0009
IL_0003: call void elseif.Program::Process1()
IL_0008: ret
IL_0009: call void elseif.Program::Process2()
IL_000e: ret
} // end of method Program::earlyReturn
可以说是业绩不佳,但第1号法律对我来说是更加清楚和更加符合逻辑的。 在“
http://www.c2.com/cgi/wiki?GuardClause” rel=“nofollow noretinger” http://www.c2.com/cgi/wiki?GuardClause。
我看不到一个词,即我认为很重要——警卫条款的目的是提高可读性。 单一退出方法可能倾向于采用“狭义”法(在加固发言后,arrow头).)。
返回将使《刑法》从任何一种方式返回,如果该声明有的话,则不会再执行任何法典。 如果没有回来的话,声明将完全删除。
我将使用<代码>Code 1,因为如果在if/code>说明之后添加一些内容,那么Im仍将执行,但我无需记住删除<代码>return
。 载于<代码>的条款 准则2
这两种风格都很常见,宗教战争已经战胜。
我通常这样做:
然而,可以说,一项更为重要的规则是“对研究守则的下一个开发商来说,这一规则更可读和(或)更可维持?
正如其他人所说的那样,业绩差异微不足道。
我认为,你应该对这方面的业绩表示担忧。 在这种情况下,可读性和可维持性更为重要。
例行公事的起点是良好做法。
然而,有时多重回报只会使守则更加清楚,特别是当你在守则的开始附近进行了一些测试(即检查所有投入参数是否都采用正确的格式),如果真实情况会导致回报。
即:
if (date not set) return false;
age = calculateAgeBasedOnDate();
if (age higher than 100) return false;
...lots of code...
return result;
I think it does not matter. You should go for readability and I think the less brackets the better. So I would return without the last 2 brackets (see sample below). Please do not think about performance when writing something like this it won t give you anything but too much complexity at an too early stage.
if(result)
{
process 1
return;
}
process 2
I think the second option is better for cases of many condition (such as validation). If you use the first in these cases you will get ugly indentation.
if (con){
...
return;
}
if (other con){
...
return;
}
...
return;
我倾向于有一个单一的出境点,这对于在多面环境下设置路障非常有用,以确保释放锁。 随着第一次执行,这项工作更加困难。
I tend to have multiple points of exit from a function. Personally I think it s clearer and in some cases it can be faster. If you check on something and then return the program won t execute any left commands. Then again as HZC said if you work on multi-threaded applications then your best shot might be using your first example. Anyway for small pieces of code it won t make any difference(probably not even for some larger ones). Most important is that you write how you feel comfortable with.
如果我不得不说的话,我会说,更好的做法是,如果是,而不是“简单化”。 理由是,如果其他人修改你的法典,他们可以轻易地通过轮.来达到。
我回顾,在方案拟订世界中,就你是否应在你们的法典中发表多次回归声明进行了大量辩论。 人们可以说,这会造成很大的混乱,因为如果你在“如果”声明中有多个漏洞,并且有有条件的回报,那就会造成一些混乱。
我的惯常做法是发表一份“有选择的声明”和一份单一的返回声明。
例如,
type returnValue;
if(true)
{
returnValue = item;
}
else
returnValue = somethingElse;
return returnValue;
我认为,上述内容可以稍加读。 然而,情况总是如此。 有时,如果说话的话,最好在中间发表返回声明,特别是如果它需要trick的返回声明的话。
它取决于“结果”、“过程1”和“过程2”是什么。
如果程序2是“结果”的必然结果,那么就应当适用第1条。 如果程序1和过程2是同等的替代物,则这是最可读的模式。
if (do_A_or_B = A)
A()
else
B()
如果结果属于某种“非目标”条件,而“程序1”只是满足这种条件所需要的清理,那么你应当选择第2条。 如果“处理2”是该职能的主要行动,这是最可读的模式。
if (NOT can_do_B)
{
A()
return
}
B()
它取决于具体情况。
如果这一功能在计算价值时,一经您(备选案文2)。 你正在表明,你已经做了你需要和将要完成的所有工作。
如果这是方案逻辑的一部分,则尽可能准确(备选方案1)。 想选择1的人会知道你的话(这句话就是说),如果选择2可能是错误的(在这种情况下,N ALWAYS就是这样做的——我对你来说是正确的!) 否则。
汇编这些内容通常相同,但我们对业绩不感兴趣。 这就是可读性和可维持性。
What is the use of default keyword in C#? Is it introduced in C# 3.0 ?
I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...
I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...
I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...
I have two EF entities. One has a property called HouseNumber. The other has two properties, one called StartHouseNumber and one called EndHouseNumber. I want to create a many to many association ...
How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...
Since I cannot order my dictionary, what is the best way of going about taking key value pairs and also maintaing an index?
Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...