2017-04-11 60 views
0

我還沒有很多模式和應用程序體系結構的實踐。簡而言之,我必須找到某些對象特徵的屬性。一些代碼將更好地描述任務:用模式重構

IAttribute { 
    IAttribute analyze(IFunction func); 
} 

//up to 10 different attributes 
ArgumentsAttribute implements Attribute { 
    Map<String, ArgType> args = new HashMap<>(); 
    IAttribute analyze(IFunction func) { 
    for (Argument arg : func.getArgs()) { 
     args.put(arg.getName(), arg.getType()); 
    } 

    if (!args.isEmpty()) return this; 
    return null; 
    } 
} 

ReturnAttribute implements Attribute { 
    IAttribute analyze(IFunction func) { 
    if (func.hasReturn) return this; 
    return null; 
    } 
} 


AttributeAnalyzer { 
    List<Attributes> analyzeAttributes(IFunction func) { 


    List<IAttribute> attributes = new ArrayList<IAttribute>(); 
    attributes.add(new ArgumentAttribute()); 
    attributes.add(new ReturnAttribute()); 
    ... 

    for (IAttribute attr : attributes) { 
     attr = attr.analyze(func); 
     if (null == attr) attributes.remove(attr); 
    } 

    return attributes; 
    } 
} 

但是,這種實現似乎有點奇怪。我不喜歡Attribute屬於持有者的事實,但它必須實現方法來查找自己。在我看來,最佳實踐將是一個超載靜態方法的機會,但顯然這是不可能的。通過這種方式,我們可以將持有者從分析邏輯中分離出來,而不需要添加新的抽象(也許我是不對的)。

IAttribute { 
    static IAttribute analyze(); 
} 

ConcreteAttribute1 { 
    int x = 0; 
    static IAttribute analyze() { 
    ... 
    if (x != 0) return new ConcreteAttribute1(); 
    return null; 
    } 
} 

ConcreteAttribute2 { 
    String s = ""; 
    static IAttribute analyze() { 
    ... 
    if (!s.equals("")) return new ConcreteAttribute2(); 
    return null; 
    } 
} 


AttributeAnalyzer { 
    List<Attributes> analyzeAttributes() { 


    List<IAttribute> attributes = new ArrayList<IAttribute>(); 
    attributes.add(ConcreteAttribute1.analyze()); 
    attributes.add(ConcreteAttribute2.analyze()); 
    ... 

    for (IAttribute attr : attributes) { 
     if (null == attr) attributes.remove(attr); 
    } 

    return attributes; 
} 

}

另外,我有過濾寵壞屬性。那麼,是否有任何重構的方法可以讓這段代碼看起來更好?

+0

根據你的代碼,即使'ConcreteAttribute1'和'ConcreteAttribute2'類都是多餘的。您需要提及屬性如何應用於對象。另外'AttributeAnalyzer'看起來不像做任何真實的事情或評估給定屬性的任何對象? – niksofteng

+0

@NikhilVartak好吧,有些屬性只能作爲指標(即對象的特徵,例如屬性),其他屬性可能包含幾個映射或列表。比,其屬性的對象和列表被放置在地圖中並保存到數據庫中。最後,其他分析器將對象與其屬性相關聯,併爲每個屬性進行對象的轉換(不改變其屬性)。在我的特殊情況下,object是一個函數,屬性是一些屬性(例如參數的數量或返回值的類型),所以'AttributeAnalyzer'接受一個參數(函數)並通過它。 – NikitaRock

+0

請添加示例輸入和期望輸出。你可以從上面刪除不相關的代碼。 – niksofteng

回答

0

如果您對每個具體屬性有一個明顯的analyze函數,而且很少或沒有重疊,那麼您的初始代碼示例可能不會那麼糟糕。但是,我會將該方法的簽名更改爲boolean analyze()

如果在分析屬性的方式中存在更多重疊,則可以考慮AttributeAnalyzer類(或專用類)中的單個方法boolean analyze(IAttribute)