Proper way of coding return statement with many conditions
我想知道是否有一种很好的编码方法:
1 2 3 4 | return IOTools.CreateFile(@"D:\test") && IOTools.CreateDir(@"D:\test_folder") && IOTools.DeleteFile(@"D:\test_file_2") && IOTools.DeleteDir(@"D:\test_folder_2"); |
我知道我可以把它全部放在其他函数中,并且在每个条件之后使用if语句返回false,但是如果一个条件是false,也许还有其他方法阻止程序尝试执行下一个条件?
if x is false, y is not evaluated, because the result of the AND
operation is false no matter what the value of y is. This is known as
"short-circuit" evaluation.
顺便说一句,只要有一个条件是
如果你要求一种更易读的方式,你可以使用变量:
1 2 3 4 5 6 | bool canCreateFile = IOTools.CreateFile(@"D:\test"); bool canCreateDir = IOTools.CreateDir(@"D:\test_folder"); bool canDeleteFile = IOTools.DeleteFile(@"D:\test_file_2"); bool canDeleteDir = IOTools.DeleteDir(@"D:\test_folder_2"); return canCreateFile && canCreateDir && canDeleteFile && canDeleteDir; |
如果代码变得过于复杂,我会使用变量来提高可读性、可维护性和可测试性。
一些非常重要的指导方针:
- 如果您使用"&;&;"并且某些返回错误,则不会执行其余的"if"。这可能是愿望,也可能不是。在您的情况下,如果任何create directory/delete失败,其余的将不会被执行。
- 您需要考虑代码的可维护性。检查一系列有副作用的条件的布尔语句以后可能很难编辑,因为进行更改的程序员可能不知道这些副作用。
希望这能有所帮助。
更多细节
编辑困难的例子。假设另一个程序员想要向您的程序添加一个新的创建。现在的计划是:
1 2 3 4 5 | return IOTools.CreateFile(someNewFile) && IOTools.CreateFile(@"D:\test") && IOTools.CreateDir(@"D:\test_folder") && IOTools.DeleteFile(@"D:\test_file_2") && IOTools.DeleteDir(@"D:\test_folder_2"); |
但是新的程序员犯了一个错误,这个文件碰巧永远不会被创建。它们遵循了你的模式——实际上破坏了你的代码。突然之间这是一个严重的问题!更好的模式是:
1 2 3 4 5 6 7 | var overallSuccess = false; overallSuccess |= IOTools.CreateFile(someNewFile); overallSuccess |= IOTools.CreateFile(@"D:\test"); overallSuccess |= IOTools.CreateDir(@"D:\test_folder"); overallSuccess |= IOTools.DeleteFile(@"D:\test_file_2"); overallSuccess |= IOTools.DeleteDir(@"D:\test_folder_2"); return overallSuccess; |
现在所有语句都运行,返回值表示任何创建是否成功。如果所有语句都成功,则可以将"="更改为"&;="以获得真正的返回。祝你好运!
这是你能得到的最干净的。引入任何其他东西都可能增加而不是减少复杂性。