2012-06-07 3 views
3

Мой вопросУдалить повторяющийся код

IS-

У меня есть две строковые переменные site_inclusion и site_exclusion. Если site_inclusion имеет значение, то мне все равно, какие значения содержит site_exclusion. То есть site_inclusion переопределяет site_exclusion. Если, однако, site_inclusion is null и site_exclusion имеет значение, то я хочу изучить site_exclusion.

Чтобы быть более точным:

  1. Если site_inclusion и site_exclusion оба null затем установить useTheSynthesizer в true;
  2. Если site_inclusion не null, и он соответствует regexPattern, тогда useTheSynthesizer соответствует true. И мне все равно, какие значения есть в site_exclusion.
  3. Если site_inclusion является null и site_exclusion не null и site_exclusion не соответствует regexPattern установите useTheSynthesizer истина.

я написал ниже код, но почему-то я думаю, я повторял некоторые вещи здесь в если/еще цикле. Любые улучшения кода будут оценены, чтобы выполнить мои условия.

String site_inclusion = metadata.getSiteInclusion(); 
String site_exclusion = metadata.getSiteExclusion(); 

// fix for redundant data per site issue 
if(site_inclusion != null && site_inclusion.matches(regexPattern)) { 
    useTheSynthesizer = true; 
} else if(site_exclusion != null && !(site_exclusion.matches(regexPattern))) { 
    useTheSynthesizer = true; 
} else if(site_inclusion == null && site_exclusion == null) { 
    useTheSynthesizer = true; 
} 
+2

Вероятно, лучше подходит для [codereview.stackexchange.com] (http://codereview.stackexchange.com/) – Torious

+0

@ Настоятельно. Я даже не заметил SE. –

+0

Ваш пример кода не соответствует вашему описанию. Если 'site_inclusion' НЕ является нулевым и не соответствует шаблону, ваш пример кода проверяет' site_exclusion' для соответствия. Это противоречит точке № 2, где вы говорите, что вы не заботитесь о 'site_exclusion', если' site_inclusion' не равно null. – jahroy

ответ

6
  1. Вам не нужно последний null тест.
  2. Я (лично) считаю, что это плохой стиль, чтобы сделать заявление if(test == true) flag = true. Вы можете просто сказать flag = test.

Моя рекомендация будет:

if(site_inclusion != null) 
{ 
    useTheSynthesizer = site_inclusion.matches(regexPattern); 
} 
else if(site_exclusion != null) 
{ 
    useTheSynthesizer = ! site_exclusion.matches(regexPattern); 
} 
else 
{ 
    useTheSynthesizer = true; 
} 

Вы также могли бы сделать это в Oneliner:

useTheSynthesizer = site_inclusion != null ? site_inclusion.matches(regexPattern) : (site_exclusion != null ? ! site_exclusion.matches(regexPattern) : true); 

Но я считаю, что своего рода неприятными для чтения.

(Обратите внимание, я сделал предположение, что useTheSynthesizer было иначе false. Это не явно в коде или объяснения, но я думаю, что это предположение было безопасно.)

+0

Спасибо, Эдвард, сегодня я узнал еще кое-что. Спасибо за ваш комментарий. – ferhan

+0

Это не кажется правильным. Если 'site_inclusion' не является нулевым, но не соответствует шаблону, тогда необходимо обработать' site_exclusion'. Этот ответ предполагает, что 'useTheSynthesizer' всегда должен возвращать false, когда' site_inclusion' не является нулевым и не соответствует. – jahroy

+0

Если у site_inclusion есть некоторые значения, то site_inclusion переопределит что-либо в site_exclusion, в основном я не буду беспокоиться о том, что имеет site_exclusion. Но если site_inclusion имеет значение null, а у site_exclusion есть что-то, тогда в этом случае я рассмотрю site_exclusion. – ferhan

0

Вы можете сделать так. В основном я извлекал все условия в виде небольших методов и делался как условие ИЛИ.

String site_inclusion = metadata.getSiteInclusion(); 
    String site_exclusion = metadata.getSiteExclusion(); 
     if(isInclusionAndExclusionNull(site_inclusion, site_exclusion) || isSiteExclusionMatches(site_exclusion, regexPattern) || isSiteInclusionMatches(site_inclusion, regexPattern)) { 
      useTheSynthesizer = true; 
     } 

private static boolean isInclusionAndExclusionNull(String site_inclusion, 
      String site_exclusion) { 
     return site_inclusion == null && site_exclusion == null; 
    }  
    private boolean isSiteExclusionMatches(String site_exclusion, 
       String regexPattern) { 
      return site_exclusion != null && !(site_exclusion.matches(regexPattern)); 
     } 

     private boolean isSiteInclusionMatches(String site_inclusion, 
       String regexPattern) { 
      return site_inclusion != null && site_inclusion.matches(regexPattern); 
     } 
2

Я хотел бы сделать это следующим образом:

boolean useTheSynthesizer; 

    if (siteInclusion == null && siteExclusion == null) { 
     useTheSynthesizer = true; 
    } 
    else if (siteInclusion == null) { 
     useTheSynthesizer = (! siteExclusion.matches(regexPattern)); 
    } 
    else { 
     useTheSynthesizer = siteInclusion.matches(regexPattern); 
    } 

Я также удалил подчеркивание из ваших имен переменных, так как они не соответствуют соглашениям Java Naming (и они отвратительны ИМО).

+0

Обратите внимание, что приведенное выше является упрощением кода примера OP. Это НЕ, однако, соответствует описанию требований (из точек маркера). Пример кода и описание проблемы противоречивы. – jahroy

0

У вас может быть 2 метода гибкости для обработки включений и исключений, как показано ниже.

0

Здравствуйте, я думаю, вы можете улучшить его, используя некоторые, такие как OR, и не только И или попробуйте что-нибудь похожее на swicht.

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

Например, вы можете написать этот код в функции под названием boolean TestingVariable (String X, String Y);

Например: булева TesteingVariable (String X, String Y) {

if(X != null && X.matches(regexPattern)) { 
     return true; 
    } else if(Y != null && !(Y.matches(regexPattern))) { 
     return = true; 
    } else if(X == null && Y == null) { 
     return = true; 
    } 
}; 

На этом пути вашего окончательный основной код модуля что-то вроде этого, и вы избегаете путаного кода в своем основном коде:

String site_inclusion = metadata.getSiteInclusion(); 
String site_exclusion = metadata.getSiteExclusion(); 

// fix for redundant data per site issue 
useTheSynthesizer = TesteingVariable (site_inclusion ,site_exclusion); 

Я думаю, вы должны ввести th e переменная regexPattern в функции.

Извините за мой английский Я надеюсь, что вы можете взять все, и это поможет вам.

Смежные вопросы