繁体   English   中英

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

[英]Can I avoid repeating myself in this situation (Java)

 if (openFile == null) {

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

 }

 if (openFile == null) {

      return;

 }

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

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

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

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

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

生病做的事情如下:

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;

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

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

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

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()方法。我有时使用这个技巧,使一个“逻辑上私有”的变量只是一个耦合方法以减少复杂性。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM