Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 耦合对象层次结构和操作_Design Patterns - Fatal编程技术网

Design patterns 耦合对象层次结构和操作

Design patterns 耦合对象层次结构和操作,design-patterns,Design Patterns,作为解析器库的一部分,我有以下对象层次结构: ParseEntry | | / \ / \ / \ NumericParseEntry StringParseEntry 解析条目 | | / \ / \ / \ NumericParseEntry StringParseEntry 等等, 这些对象基本上保存数据。

作为解析器库的一部分,我有以下对象层次结构:

ParseEntry | | / \ / \ / \ NumericParseEntry StringParseEntry 解析条目 | | / \ / \ / \ NumericParseEntry StringParseEntry 等等,

这些对象基本上保存数据。然后,我有一组操作,比如evaluate(评估值是否通过解析条目标准)、generateSQL(根据解析条目标准生成SQL条件)

由于单一责任原则,我不想将这些函数添加到特定的解析条目类中,而是希望维护为解析条目层次结构实现这些函数的独立层次结构。这允许我对多个解析条目重用特定的实现

我想知道如何将这些操作与对象耦合起来,以便在浏览执行某些操作的解析条目的解析表时,应该能够获得适当的操作对象

我可以考虑的一种粗略方法是使用一个工厂类来维护解析条目类型与其对应的evaluator/SQLgenerator之间的映射。另一种方法是将evaluator/sql生成器嵌入为parse条目的数据成员,并在getter中返回它们


如果您能在这方面提供任何帮助,我们将不胜感激。

普通数据对象不是非常面向对象的。我认为操作(evaluate/generateSQL)确实是
ParseEntry
对象的责任。如果要重用evaluator实现,仍然可以在
ParseEntry
中编写一个
evaluator
,并委托给它,例如:

public class NumericParseEntry extends ParseEntry {
  private Evaluator evaluator = ...;
  private SQLGenerator sqlGenerator = ...;

  public bool evaluate(Object value) {
    return evaluator.evaluate(this, value);
  }

  public String generateSQL() {
    return sqlGenerator.generateSQL(this);
  }
}
public class NumericParseEntry extends ParseEntry {
  // put common logic for numeric entries here
}

public class IntegerParseEntry extends NumericParseEntry {
  // put specialized code for handling integers
}

public class FloatParseEntry extends NumericParseEntry {
  // put specialized code for handling floating-point
}
单一责任原则说,类的更改应该只有一个原因——如果您的更改确实与特定的
ParseEntry
相关,那么更改类没有错


也可以考虑使用继承和取消单独的<代码>评估器< /代码> /<代码>生成器< /代码>类。例如:

public class NumericParseEntry extends ParseEntry {
  private Evaluator evaluator = ...;
  private SQLGenerator sqlGenerator = ...;

  public bool evaluate(Object value) {
    return evaluator.evaluate(this, value);
  }

  public String generateSQL() {
    return sqlGenerator.generateSQL(this);
  }
}
public class NumericParseEntry extends ParseEntry {
  // put common logic for numeric entries here
}

public class IntegerParseEntry extends NumericParseEntry {
  // put specialized code for handling integers
}

public class FloatParseEntry extends NumericParseEntry {
  // put specialized code for handling floating-point
}

普通数据对象不是非常面向对象的。我认为操作(evaluate/generateSQL)确实是
ParseEntry
对象的责任。如果要重用evaluator实现,仍然可以在
ParseEntry
中编写一个
evaluator
,并委托给它,例如:

public class NumericParseEntry extends ParseEntry {
  private Evaluator evaluator = ...;
  private SQLGenerator sqlGenerator = ...;

  public bool evaluate(Object value) {
    return evaluator.evaluate(this, value);
  }

  public String generateSQL() {
    return sqlGenerator.generateSQL(this);
  }
}
public class NumericParseEntry extends ParseEntry {
  // put common logic for numeric entries here
}

public class IntegerParseEntry extends NumericParseEntry {
  // put specialized code for handling integers
}

public class FloatParseEntry extends NumericParseEntry {
  // put specialized code for handling floating-point
}
单一责任原则说,类的更改应该只有一个原因——如果您的更改确实与特定的
ParseEntry
相关,那么更改类没有错


也可以考虑使用继承和取消单独的<代码>评估器< /代码> /<代码>生成器< /代码>类。例如:

public class NumericParseEntry extends ParseEntry {
  private Evaluator evaluator = ...;
  private SQLGenerator sqlGenerator = ...;

  public bool evaluate(Object value) {
    return evaluator.evaluate(this, value);
  }

  public String generateSQL() {
    return sqlGenerator.generateSQL(this);
  }
}
public class NumericParseEntry extends ParseEntry {
  // put common logic for numeric entries here
}

public class IntegerParseEntry extends NumericParseEntry {
  // put specialized code for handling integers
}

public class FloatParseEntry extends NumericParseEntry {
  // put specialized code for handling floating-point
}

我已成功地使用此模式实现了与您尝试执行的类似的操作。。。您将能够以优雅的方式创建依赖于类型或您选择的任何条件的代码,而无需修改“数据”层次结构。

我已成功地使用此模式实现了与您尝试执行的类似的操作。。。您将能够以优雅的方式创建依赖于类型或您选择的任何条件的代码,而无需修改“数据”层次结构。

这听起来很像。您将拥有
EvaluatorVisitor
SQLGenerationVisitor
,它们将在
ParseEntry
s上执行访问操作
ParseEntry
是包含
accept(Visitor)
操作的元素,
NumericParseEntry
StringParseEntry
将扩展该操作

因为您使用的是访客模式,所以单一责任原则是免费的。

我觉得这很像。您将拥有
EvaluatorVisitor
SQLGenerationVisitor
,它们将在
ParseEntry
s上执行访问操作
ParseEntry
是包含
accept(Visitor)
操作的元素,
NumericParseEntry
StringParseEntry
将扩展该操作


因为您使用的是访客模式,所以单一责任原则是免费的。

感谢您的投入。我也同意,从概念上讲,这些业务可以是访客。但是我在Java中实现它时遇到了一些问题,在解析条目接口中使用带有accept方法签名的泛型,以便在evaluator处理的解析条目之间进行强类型化。感谢您的输入。我也同意,从概念上讲,这些业务可以是访客。但是我在Java中实现它时遇到了一些问题,在解析条目接口中使用带有accept方法签名的泛型,以便在evaluator处理的解析条目之间进行强类型化。感谢您的输入。我同意这样的观点,即这些操作基本上应该在特定的解析条目类中实现。我喜欢您的想法,将评估代码移动到一个单独的层次结构中,并通过组合将它们包含在解析条目中。感谢您的输入。我同意这样的观点,即这些操作基本上应该在特定的解析条目类中实现。我喜欢您的想法,将评估代码移动到一个单独的层次结构中,并通过组合将它们包含在解析条目中。感谢您的输入。虽然我个人不倾向于使用框架来解决我的问题,但这是一个很好的参考资料,我是通过您了解到的,这可能会在将来有所帮助。再次感谢!谢谢你的意见。虽然我个人不倾向于使用框架来解决我的问题,但这是一个很好的参考资料,我是通过您了解到的,这可能会在将来有所帮助。再次感谢!