【问题标题】:Can I avoid repeating myself in this situation (Java)我可以避免在这种情况下重复自己吗(Java)
【发布时间】:2012-11-23 20:06:42
【问题描述】:
 if (openFile == null) {

      new AppFileDialog().chooseFile("Save", appFrame);

 }

 if (openFile == null) {

      return;

 }

这里我需要检查用户是否已经选择了一个文件。如果没有,他们会得到提示。如果文件仍然为空,则函数返回而不保存。问题是两个相同的 if 语句,我可以避免吗?我非常重视 DRY,但同时也是 KISS。理想情况下,两者是齐头并进的,但在这种情况下,它们似乎是相互排斥的。

【问题讨论】:

  • 或许您可以提供更多上下文。 AppFileDialog.chooseFile() 是否设置了 openFile 变量?
  • AppFileDialog.chooseFile 返回什么?

标签: java dry


【解决方案1】:

不完全是,虽然我认为不同的结构会使问题更加明显:

// If no file, give the user a chance to open one
if (openFile == null) {
    new AppFileDialog().chooseFile("Save", appFrame);

    // still no file, user must not want to do this
    if (openFile == null) {
        return;
    }    
}

【讨论】:

  • 是的,是的。只需将其粘贴到它自己的方法中(它接受文件,可能返回一个布尔值)并添加一些好的 cmets。
【解决方案2】:

把它放在一个循环中?用户选择的文件永远不应该为空

但是你已经删掉了太多的代码给出任何具体的答案。我所看到的只是两张相同的支票,我将它们合并为一张,但我认为您来这里是为了更多。

【讨论】:

    【解决方案3】:

    我会做类似的事情:

    int tries = 0;
    int maxTries = 3;
    do {
       openFile = new AppFileDialog().chooseFile("Save", appFrame);
       if (openFile != null) 
          tries = maxTries;
       tries++;
    } while (tries < maxTries);
    
    if (openFile == null)
       return;
    

    【讨论】:

      【解决方案4】:

      我会尝试消除这种副作用(在 chooseFile 方法中设置 openFile),因为它使代码难以理解。不能退货吗?

      但它不会解决双重空检查。

      【讨论】:

        【解决方案5】:

        您可以尝试这样的操作,但这假设chooseFile 将返回该文件。

        if ((openFile == null ? new AppFileDialog().chooseFile("Save", appFrame) : openFile) == null) 
          return;
        

        【讨论】:

          【解决方案6】:

          它们实际上是不同的条件。我认为你真正的意思是:

          if (openFile == null) {
              openFile = new AppFileDialog().chooseFile("Save", appFrame);
          
              if (openFile == null) {
                  return;
              }
          }
          

          这表明它们的含义不同,但是如果您希望添加更多条件(可以打开文件的更多方式,例如如果用户不提供默认文件名,则使用默认文件名),您的会更优雅自己)

          不过我更喜欢:

          openFile = getOpenFile()
          if(openFile == null)
              return;
          
          public File getOpenFile() {
             if(openFile == null)
                 openFile = new AppFileDialog().chooseFile("Save", appFrame);
          
             return openFile;
          }
          

          这允许 getOpenFile() 方法完全控制 openFile 变量,从不从任何其他方法(可能是 closeFile() 方法除外)访问 openFile 变量。我有时使用这个技巧,创建一个“逻辑上私有”的变量为了稍微降低复杂性,只需要几种方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            • 2020-04-18
            • 1970-01-01
            • 2023-03-24
            • 2011-05-08
            • 2019-08-24
            相关资源
            最近更新 更多