Bla*_*man 9 refactoring coding-style
我想重构一个方法的mumbo jumbo以使其更易读,它可以根据我的喜好使用许多嵌套的IF.
你会如何重构这个?
public static void HandleUploadedFile(string filename)
{
try
{
if(IsValidFileFormat(filename)
{
int folderID = GetFolderIDFromFilename(filename);
if(folderID > 0)
{
if(HasNoViruses(filename)
{
if(VerifyFileSize(filename)
{
// file is OK
MoveToSafeFolder(filename);
}
else
{
DeleteFile(filename);
LogError("file size invalid");
}
}
else
{
DeleteFile(filename);
LogError("failed virus test");
}
}
else
{
DeleteFile(filename);
LogError("invalid folder ID");
}
}
else
{
DeleteFile(filename);
LogError("invalid file format");
}
}
catch (Exception ex)
{
LogError("unknown error", ex.Message);
}
finally
{
// do some things
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*ers 24
我会将测试中的条件反转为如果不好然后deleteAndLog如下例所示.这可以防止嵌套并将操作置于测试附近.
try{
if(IsValidFileFormat(filename) == false){
DeleteFile(filename);
LogError("invalid file format");
return;
}
int folderID = GetFolderIDFromFilename(filename);
if(folderID <= 0){
DeleteFile(filename);
LogError("invalid folder ID");
return;
}
...
}...
Run Code Online (Sandbox Code Playgroud)
jam*_*esh 10
守卫条款.
对于每个条件,否定它,将else块更改为then块,然后返回.
从而
if(IsValidFileFormat(filename)
{
// then
}
else
{
// else
}
Run Code Online (Sandbox Code Playgroud)
变为:
if(!IsValidFileFormat(filename)
{
// else
return;
}
// then
Run Code Online (Sandbox Code Playgroud)