Java 使用模式重构

Java 使用模式重构,java,design-patterns,refactoring,Java,Design Patterns,Refactoring,我在模式和应用程序架构方面没有太多的实践。简言之,我必须找到对象所具有的某些属性。一些代码可以更好地描述任务: IAttribute { IAttribute analyze(IFunction func); } //up to 10 different attributes ArgumentsAttribute implements Attribute { Map<String, ArgType> args = new HashMap<>(); IAttr

我在模式和应用程序架构方面没有太多的实践。简言之,我必须找到对象所具有的某些属性。一些代码可以更好地描述任务:

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;
  }
}
IAttribute{
i属性分析(IFunction func);
}
//最多10种不同的属性
ArgumentsAttribute实现属性{
Map args=new HashMap();
IAttribute分析(IFunction func){
for(参数arg:func.getArgs()){
put(arg.getName(),arg.getType());
}
如果(!args.isEmpty())返回此值;
返回null;
}
}
ReturnAttribute实现属性{
IAttribute分析(IFunction func){
如果(func.hasReturn)返回此项;
返回null;
}
}
属性分析器{
列表分析属性(IFunction func){
列表属性=新的ArrayList();
添加(新的ArgumentAttribute());
add(newreturnAttribute());
...
for(IAttribute属性:属性){
属性=属性分析(func);
if(null==attr)attributes.remove(attr);
}
返回属性;
}
}
然而,这个实现似乎有点奇怪。我不喜欢属性是一种持有者,但它必须实现方法才能找到自己。在我看来,最佳实践是一个重载静态方法的机会,但显然这是不可能的。这样,我们就可以在不添加新抽象的情况下将holder从分析逻辑中分离出来(也许我不对)

IAttribute{
静态属性分析();
}
具体属性1{
int x=0;
静态属性分析(){
...
如果(x!=0)返回新的ConcreteAttribute1();
返回null;
}
}
具体属性2{
字符串s=“”;
静态属性分析(){
...
如果(!s.equals(“”)返回新的ConcreteAttribute2();
返回null;
}
}
属性分析器{
列表分析属性(){
列表属性=新的ArrayList();
attributes.add(ConcreteAttribute1.analyze());
add(ConcreteAttribute2.analyze());
...
for(IAttribute属性:属性){
if(null==attr)attributes.remove(attr);
}
返回属性;
}
}


此外,我必须过滤被破坏的属性。那么,有没有重构的方法可以让代码看起来更好呢?

如果您对每个具体属性都有一个独特的
analyze
函数,并且几乎没有重叠,那么您的初始代码示例可能不会那么糟糕。但是,我会将该方法的签名更改为
boolean analyze()


如果分析属性的方式有更多的重叠,那么你可以考虑一个方法<代码>布尔分析(IActudio)<代码> >在你的代码>属性分析器< /代码>类中(或者在一个专用的类中)。

每个代码,甚至<代码>具体属性1>代码>和<代码>具体属性2>代码>类是冗余的。您需要提到如何将属性应用于对象。另外,
AttributeAnalyzer
看起来不像是在为给定属性做任何真实的事情或评估任何对象?@NikhilVartak好吧,有些属性仅用作指标(即对象是否具有此类属性),其他属性可能包含多个贴图或列表。然后,对象及其属性列表将放置在地图中并保存到数据库中。最后,OtherAnalyzer使用对象及其属性,并为每个属性进行对象的转换(不更改其属性)。在我的特殊情况下,对象是一个函数,属性是一些属性(如参数的数量或返回值的类型),因此“AttributeAnalyzer”接受一个参数(函数)并遍历它。请添加示例输入和预期输出。您可以从上面删除不相关的代码。@NikhilVartak我对代码进行了更详细的说明,希望能有所帮助。@Fildor这是我的错误,已修复
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;
 }