代码之家  ›  专栏  ›  技术社区  ›  sixtyfootersdude

Java程序组织:如何摆脱这个庞大的case语句?

  •  3
  • sixtyfootersdude  · 技术社区  · 15 年前

    public class WordDescriptor {
    
        public static final String noun = "N";
        public static final String plural = "p";
        public static final String nounPhrase = "h";
        public static final String usuParticipleVerb = "V";
        public static final String transitiveVerb = "t";
        public static final String intransitiveVerb = "i";
        public static final String adjective = "A";
        public static final String adverb = "v";
        public static final String conjunction = "C";
        public static final String preposition = "P";
        public static final String interjection = "!";
        public static final String pronoun = "r";
        public static final String definiteArticle = "D";
        public static final String indefiniteArticle = "I";
        public static final String nominative = "o";
        public static final String defaultTag = "?";
    
        private String word; // where word is one of the constants defined above.  
    
        public String getWord(){
            return word;
        }
    
        public String setWord(){
            return word;
        }
    
        /** For debugging only.  
         * 
         * @param s
         * @return
         */
        protected static String getKind(String s){
            if(s.equals(noun)){
                return "noun";
            }else if(s.equals(plural)){
                return "plural";
            }else if(s.equals(nounPhrase)){
                return "nounPhrase";
            }else if(s.equals(usuParticipleVerb)){
                return "usuParticipleVerb";
            }else if(s.equals(transitiveVerb)){
                return "transitiveVerb";
            }else if(s.equals(intransitiveVerb)){
                return "intransitiveVerb";
            }else if(s.equals(adjective)){
                return "adjective";
            }else if(s.equals(adverb)){
                return "adverb";
            }else if(s.equals(conjunction)){
                return "conjunction";
            }else if(s.equals(preposition)){
                return "preposition";
            }else if(s.equals(interjection)){
                return "interjection";
            }else if(s.equals(pronoun)){
                return "pronoun";
            }else if(s.equals(definiteArticle)){
                return "definiteArticle";
            }else if(s.equals(indefiniteArticle)){
                return "indefiniteArticle";
            }else if(s.equals(nominative)){
                return "nominative";
            } else if(s.equals(defaultTag)){
                return "defaultTag";
            }else{
                return "other: "+s;
            }
        }
    
    }
    

    这几乎是我能想象到的最难看的代码。我知道我可以通过使用一个案例来让它更好一点,但是它仍然非常难看。我的问题是:

    我怎样才能使它美丽?我在考虑做:

      • 类名词,含子类:
        • 单数的
      • 类动词
      • 类副词


    编辑:如果我真的采取了第二种方法,我甚至不知道这些类会是什么样子。举个例子:

    public abstract class WordDescriptor {
    
       public String toString();
    
    }
    
    public class Noun extends WordDescriptor {
    
        public String toString(){
            return "Noun";
        }
    }
    
    public class Plural extends Noun{
        public String toString(){
            return "Plural";
        }
    }
    
    3 回复  |  直到 15 年前
        1
  •  6
  •   Barry Brown    15 年前

    您可以使用枚举类型执行某些操作。

    public enum SpeechPart
    {
        NOUN ("noun"),
        PLURAL ("plural"),
        NOUNPHRASE ("noun phrase"),
        ADVERB ("adverb"),
        ADJECTIVE ("adjective"),
        CONJUNCTION ("conjunction"),
        VERB ("verb");
    
        private String english;
    
        SpeechPart(String inEnglish)
        {
            this.english = inEnglish;
        }
    
        public String toString() { return english; }
    }
    

    SpeechPart dog = SpeechPart.NOUN;
    SpeechPart ran = SpeechPart.VERB;
    SpeechPart quickly = SpeechPart.ADVERB;
    

    然后你可以看到他们的词性:

    System.out.println(dog.toString());
    System.out.println(quickly);        // Implicit call to toString()
    

    Decorator Pattern

    另一个建议是列举修饰符:

    public enum SpeechModifier
    {
        SINGULAR,
        PLURAL,
        FIRST_PERSON,
        SECOND_PERSON,
        THIRD_PERSON,
        PRESENT,
        PAST,
        PERFECT,
        PROGRESSIVE;
    }
    

    public class Word
    {
        String word;
        SpeechPart part;
        EnumSet<SpeechModifier> modifiers;
    }
    

    现在你可以模拟一个完整的单词:

    Word w1 = new Word();
    w1.word = "bouncing";
    w1.part = SpeechPart.VERB;
    w1.modifiers = EnumSet<SpeechModifier>.of(SpeechModifier.PRESENT, SpeechModifier.PROGRESSIVE);
    

    然而,这个解决方案并不能阻止非感官的组合,比如第一人称名词过去。

        2
  •  12
  •   Gabe Timothy Khouri    15 年前

    我只需要创建一个从缩写到完整描述的字典或地图。那么 getKind 将在映射中查找其输入并返回结果,或者 other

        3
  •  2
  •   Chris Diver    15 年前

    你能用一本有代码的字典吗( s