Могу ли я избежать повторения в этой ситуации (Java) - PullRequest
1 голос
/ 09 июня 2010
 if (openFile == null) {

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

 }

 if (openFile == null) {

      return;

 }

Здесь необходимо проверить, выбрал ли пользователь файл.Если нет, им дают подсказку.Если файл все еще нулевой, функция возвращается без сохранения.Проблема в том, что два идентичных утверждения if, я могу избежать этого?Я отношусь к СУХОЙ очень серьезно, но в то же время целую.В идеале оба идут рука об руку, но в такой ситуации кажется, что они взаимоисключающие.

Ответы [ 6 ]

2 голосов
/ 09 июня 2010

Не совсем, хотя я думаю, что другая структура сделала бы проблему более очевидной:

// 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 голос
/ 09 июня 2010

Я сделаю что-то вроде:

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;
1 голос
/ 09 июня 2010

Поместить это в петлю? Файл, выбранный пользователем, никогда не должен быть нулевым, хотя

Однако, вы вырезали слишком много кода, дайте конкретный ответ. Все, что я вижу, - это две одинаковые проверки, которые я бы слил в одну, но я думаю, что вы пришли сюда ради чего-то большего.

0 голосов
/ 09 июня 2010

Вы можете попробовать что-то вроде этого, но это предполагает, что chooseFile вернет файл.

if ((openFile == null ? new AppFileDialog().chooseFile("Save", appFrame) : openFile) == null) 
  return;
0 голосов
/ 09 июня 2010

На самом деле это разные условия.Я думаю, что вы на самом деле имеете в виду:

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 (). Иногда я использую этот трюк, делая переменную, которая является «Логически частной», для пары методов, чтобы немного уменьшить сложность.

0 голосов
/ 09 июня 2010

Я бы попытался избавиться от этого побочного эффекта (установив openFile в методе chooseFile), потому что это затрудняет выполнение кода. Вы не можете вернуть его?

Это не решит двойную проверку нуля.

...