[英]Java Program Organization: How can I get rid of this massive case statement?
我正在創建一個將填寫給定語法的程序。 現在我正在模擬像這樣的“各種單詞”:
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語句來使它變得更好,但是仍然很難看。 這是我的問題:
我怎么能讓它美麗? 我在考慮制作:
但我不確定這是否也是一個好主意。 我怎么能更好呢?
編輯:如果我采取了第二種方法,我甚至不確定這些類會是什么樣子。 這是一個例子:
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";
}
}
我只想創建一個從縮寫到完整描述的字典或地圖。 然后getKind
將在映射中查找其輸入並返回結果,或者如果輸入未映射到任何內容則返回other
結果。
您可以使用枚舉類型執行某些操作。
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模式 ,該模式專門解決了動態向對象添加屬性的需要。
另一個建議是枚舉修飾符:
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。
您可以使用帶有代碼的字典(在您的情況下為s
)作為鍵,返回的字符串作為值嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.