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;
}
}
另外,我有過濾寵壞屬性。那麼,是否有任何重構的方法可以讓這段代碼看起來更好?
根據你的代碼,即使'ConcreteAttribute1'和'ConcreteAttribute2'類都是多餘的。您需要提及屬性如何應用於對象。另外'AttributeAnalyzer'看起來不像做任何真實的事情或評估給定屬性的任何對象? – niksofteng
@NikhilVartak好吧,有些屬性只能作爲指標(即對象的特徵,例如屬性),其他屬性可能包含幾個映射或列表。比,其屬性的對象和列表被放置在地圖中並保存到數據庫中。最後,其他分析器將對象與其屬性相關聯,併爲每個屬性進行對象的轉換(不改變其屬性)。在我的特殊情況下,object是一個函數,屬性是一些屬性(例如參數的數量或返回值的類型),所以'AttributeAnalyzer'接受一個參數(函數)並通過它。 – NikitaRock
請添加示例輸入和期望輸出。你可以從上面刪除不相關的代碼。 – niksofteng