2016-04-22 8 views
0

Ich habe meine CommandFormatValidator Klasse, die überprüft, ob die eingegebene Zeichenfolge in eines der vordefinierten Muster passt. Mit einer Zeit wurde die Klasse immer wieder neue Muster der Umsetzung, was zu der folgenden Form der Klasse geführt hat:Clean code, wie man eine Klasse verbessert

import java.util.StringTokenizer; 
import java.util.regex.Pattern; 

public class CommandFormatValidator { 

    private Pattern adlPatternAll = Pattern 
      .compile("^ACTV/(READ|ADD|DEL|RPL)/ADL.*"); 

    private Pattern adlPatternAddDefault = Pattern 
      .compile("^ACTV/ADD/ADL/(DFLTTY((/([A-Z0-9]{7})){1,5})|DFLMIN(/[0-9]{1,4}))"); 

    private Pattern adlPatternDeleteTtymailGeneral = Pattern 
      .compile("^ACTV/(DEL|READ)/ADL/TTYMAIL(/[A-Z0-9]{7})?"); 

//around 20 more pattern declarations... 

public void validate(Object payload){ 

     String command = (String)payload; 

     if (adlPatternAll.matcher(command).matches()) { 
      if (!adlPatternAddDefault.matcher(command).matches()) { 
       if (!adlPatternAddCityTty.matcher(command).matches()) { 
        if (!adlPatternAddCityFltTty.matcher(command).matches()) { 
         if (!adlPatternAdd.matcher(command).matches()) { 
          if (!adlPatternDelDefault.matcher(command).matches()) { 
           if (!adlPatternDel.matcher(command).matches()) { 
            if (!adlPatternDelCityFltTty.matcher(command).matches()) { 
             if (!adlPatternRpl.matcher(command).matches()) { 
              if (!adlPatternRead.matcher(command).matches()) { 
               if (!adlPatternReadCityFlt.matcher(command).matches()) { 
                if(!adlPatternAddTtymail.matcher(command).matches()) { 
                 if(!adlPatternDeleteTtymailGeneral.matcher(command).matches()) { 
                  if (!adlPatternDeleteTtymail.matcher(command).matches()) { 
                   throw new ServiceException(CommandErrors.INVALID_FORMAT); 
                  } 
                 } 
                } 
               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Im Moment würde Ich mag diese Klasse aufzuräumen. Hat jemand eine Idee, wie ich das erreichen könnte? Ich wäre besonders dankbar für jedes Designmuster, das ich für meinen Fall anwenden könnte.

+7

Warum verwenden Sie nicht '' && statt if-Bedingungen verschachtelt? – Gendarme

+1

Wenn jede Ihrer 'Pattern' -Instanzen für eine bestimmte Art von Mustern steht, dann erstellen Sie aus der 'Pattern'-Klasse ein eigenes Muster und definieren Sie das Verhalten für jedes Ihrer Muster, indem Sie abstrakte Methoden, wie z Streichhölzer. Dann müssen Sie nur alle Ihre Musterinstanzen in ein Array oder eine Liste einfügen und versuchen, das Muster abzugleichen und das Verhalten in der übereinstimmenden Zeichenfolge aufzurufen. –

+0

@KeqiangLi Subclass 'Pattern'?!? Huch. Nun, das kannst du sowieso nicht. Es ist "endgültig". – Andreas

Antwort

4

Sie könnten sie alle in einem Array auflisten und das Array iterieren.

BTW: Sie benötigen den ^ Anker nicht, wenn Sie matches() verwenden.

Sie wissen nicht, ob Sie die ! auf dem ersten Test verpasst, aber hier ist es ohne:

public class CommandFormatValidator { 

    private Pattern adlPatternAll = Pattern 
      .compile("^ACTV/(READ|ADD|DEL|RPL)/ADL.*"); 

    private Pattern adlPatternAddDefault = Pattern 
      .compile("^ACTV/ADD/ADL/(DFLTTY((/([A-Z0-9]{7})){1,5})|DFLMIN(/[0-9]{1,4}))"); 

    private Pattern adlPatternDeleteTtymailGeneral = Pattern 
      .compile("^ACTV/(DEL|READ)/ADL/TTYMAIL(/[A-Z0-9]{7})?"); 

    //around 20 more pattern declarations... 

    private Pattern[] adlAll = { adlPatternAddDefault 
           , adlPatternDeleteTtymailGeneral 
           //more 
           }; 

    public void validate(Object payload){ 
     String command = (String)payload; 
     if (! adlPatternAll.matcher(command).matches()) 
      return; 
     for (Pattern p : adlAll) 
      if (p.matcher(command).matches()) 
       return; 
     throw new ServiceException(CommandErrors.INVALID_FORMAT); 
    } 
} 
Verwandte Themen