想象一下,对于一个方法来说,应该是真的。哪个区块代表最佳方法(性能相关和可读性),或者如果不是,您的建议是什么?!
private void method()
{
if(!condition)
{
MessageBox.Show("ERROR!");
return;
}
else
{
//DO STUFF
}
}
OR
private void method()
{
if(condition)
{
//DO STUFF
}
else
{
MessageBox.Show("ERROR!");
return;
}
}
答案 0 :(得分:13)
都不是。改为使用保护条款:
private void method()
{
if(!condition)
{
MessageBox.Show("ERROR!");
return;
}
//inputs have been checked, proceed with normal execution
}
通过这种方式,您可以预先处理所有异常行为,并避免正常执行路径的过度缩进。
答案 1 :(得分:3)
嗯,两者都没有,因为你不会同时使用else
和return
。
所以,你要么:
private void method() {
if (!condition) {
MessageBox.Show("ERROR!");
} else {
//DO STUFF
}
}
或:
private void method() {
if (condition) {
//DO STUFF
} else {
MessageBox.Show("ERROR!");
}
}
或:
private void method() {
if (!condition) {
MessageBox.Show("ERROR!");
return
}
//DO STUFF
}
或:
private void method() {
if (condition) {
//DO STUFF
return;
}
MessageBox.Show("ERROR!");
}
您使用的主要取决于代码实际执行的操作。代码很少像示例中那样简单,因此代码将会更加重要。
前两个具有单个退出点的优势,这通常使得更容易遵循代码。您通常会先将较短的代码放在首位,因为在较大的代码块之后,它比在else
中更容易发现。
第三个通常用于在继续使用主代码之前验证输入,并且您可以轻松地进行多个验证:
private void method() {
if (!condition) {
MessageBox.Show("ERROR!");
return
}
if (!anotherCondition) {
MessageBox.Show("ANOTHER ERROR!");
return
}
//DO STUFF
}
如果你有几个条件不想放在同一个if
语句中,那么第四个是有用的:
private void method() {
if (condition) {
var data = GetSomeData();
if (data.IsValid) {
var moreData = GetSomeMoreData();
if (moreData.IsValid) {
//DO STUFF
return;
}
}
}
MessageBox.Show("ERROR!");
}
答案 2 :(得分:1)
二!第二!
但是我确实承认如果“// DO STUFF”真的很长并且是嵌套的,那么有时会做第一次。
答案 3 :(得分:0)
我更喜欢“如果条件”的方法,而不是对条件的否定,但这只是个人偏好。
答案 4 :(得分:0)
这取决于。
在大多数情况下,第二个版本。
如果(!condition)块中的代码量只有几行代码,并且(条件)块中的代码是很多代码,那么我会反过来回答。如果您可以在不必滚动的情况下看到“其他”,则更容易阅读if语句。
答案 5 :(得分:0)
我更喜欢大卫提到的保护条款,但在一般情况下,你应该把最常见的案例放在第一位。它使得更容易遵循方法的流程。
答案 6 :(得分:0)
这更像是一个风格问题,而不是一个“逻辑”问题。这两种方法都有效,您将使用哪种方法通常取决于您作为思想家/开发者的风格。
也就是说,一旦你开始使用这些风格中的任何一种,通常都要保持一致。拥有大型课程,其中某些功能以第一种方式执行,而其他功能则采用第二种方式,这可能导致以后的可维护性问题。
罗伯特·马丁的Clean Code提出了一个有趣的章节,建议无论你选择哪种方式,// DO STUFF部分应该另一个函数调用
功能应该只做一件事
答案 7 :(得分:0)
可读性/标准明智。我会接受2号。我认为表现并不明显,但我不是一个低级别的人。
答案 8 :(得分:0)
通常这是一个问题,要求得到以下答案:“这取决于”,我将通过两个例子来说明。
如果不是条件
对于ASP .Net Web Forms验证,我经常看到这段代码
protected void btSubmit_OnClick(object sender, EventArgs e)
{
Page.Valide();
if (!Page.IsValid)
return;
var customer = new Customer();
// init 20 properties of customer
....
var bo = new CustomerBO();
bo.Save(customer);
}
还有一个更受欢迎:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
}
}
IF CONDITION
public void UpdateCustomer(int customerId, string ...../*it might be a customer type also*/)
{
using (var ctx= CreateContext())
{
var customer = ctx.Customers.FirstOrDefault(c=>c.CustomerId = customerId);
if ( customer != null)
{
/*code update 20 properties */
}
}
}
我希望代码清楚:P