加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java程序组织:如何摆脱这种大规模的案例陈述?

发布时间:2020-12-15 05:22:26 所属栏目:Java 来源:网络整理
导读:我正在创建一个将填写给定语法的程序.现在我正在模拟像这样的“各种单词”: public class WordDescriptor { public static final String noun = "N"; public static final String plural = "p"; public static final String nounPhrase = "h"; public stati
我正在创建一个将填写给定语法的程序.现在我正在模拟像这样的“各种单词”:

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

}

这几乎是我能想象到的最丑陋的代码.我知道我可以通过使用case语句来使它变得更好,但是仍然很难看.这是我的问题:

我怎么能让它美丽?我在考虑制作:

>类WordDescriptor,带有子类:

> class noun,带子类:

>单数
>复数

>类动词
>类副词

但我不确定这是否也是一个好主意.我怎么能更好呢?

编辑:如果我采取了第二种方法,我甚至不确定这些类会是什么样子.这是一个例子:

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

解决方法

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

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);

然而,该解决方案不能防止非感性组合,例如FIRST_PERSON NOUN PAST.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读