为清楚起见,重构嵌套的IF语句

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)