在这种情况下我可以避免重复自己(Java)

时间:2010-06-08 23:03:14

标签: java dry

 if (openFile == null) {

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

 }

 if (openFile == null) {

      return;

 }

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

6 个答案:

答案 0 :(得分:2)

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

// 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;
    }    
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我会做类似的事情:

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;

答案 3 :(得分:0)

我会尝试摆脱那种副作用(在chooseFile方法中设置openFile),因为它使代码很难遵循。你不能退货吗?

虽然不会解决双重空检查。

答案 4 :(得分:0)

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

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变量,从不从任何其他方法访问openFile变量(可能除了closeFile()方法。我有时会使用这个技巧,制作一个“逻辑上私有”的变量为了降低复杂性,只需要几种方法。

答案 5 :(得分:0)

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

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