【问题标题】:java configuration/parameter passing designjava配置/参数传递设计
【发布时间】:2011-08-29 12:32:48
【问题描述】:

我经常发现需要用可配置 功能来设计对象。

举例来说,假设我正在创建一个DateIterator。可配置的选项可能是是否迭代封闭区间 [start, end] 或开放区间 [start, end)


  • (1) 在我看来,不优雅的解决方案 - 仅限于一个 true/false 配置选项
new DateIterator(boolean openInterval);
  • (2) 类型安全的枚举方式——通常有点笨重
new DateIterator(Interval.OPEN_END);
  • (3) 非常规的尝试 - 不错但不太直接
new DateIterator().openEnd();
  • (4) 继承方式——经常过度设计
new OpenEndedDateIterator();

为此提供了一些我认为较差的替代方案,例如基于整数的配置new DateIterator(Interval.OPEN_END); 或基于属性的配置。

还有其他方法吗?您更喜欢哪种方法?

【问题讨论】:

    标签: java configuration parameter-passing


    【解决方案1】:

    我想说 Builder 模式在这里很有意义:

    DateIterator di = 
      DateIterator.builder()
                  .withStartDate(new Date())
                  .withOpenEnd()
                  .build();
    

    这样你的实际 DateIterator 可以是不可变的,而 DateIterator.builder() 返回的构建器会进行配置。

    【讨论】:

      【解决方案2】:

      虽然没有好的答案,而且很大程度上取决于口味,但我确实遵循以下经验法则,为例外情况留出很大空间以避免过度设计:

      1. 如果您拥有的唯一配置是一个“参数”,采用固定设置并改变行为(如您的示例中),请使用子类。虽然它可能是过度设计的,但如果你的类中的许多方法以“if (this.parameter == x) ... else if (this.parameter == y) .​​.”开头,它将使代码不可读。
      2. 如果您的参数不是一个固定的集合,而是一个字符串或数字,并且您需要它以使类正常工作,请将其放入构造函数中,如果不是强制性的,我喜欢解决方案编号 (3),非常规尝试: )
      3. 如果您在一个固定集合中有多个参数(如 START_OPEN_ENDED 和 STOP_OPEN_ENDED),创建子类可能意味着为每个排列创建一个子类。在这种情况下,请考虑封装。例如(我可能不会在这种特定情况下这样做,但这是一个很好的例子),创建一个单独的类 DateComparator,其子类用于开放式,并封装一个 DateComparator 用于开始和一个用于结束,只有一个日期迭代器。

      同样,这些是我使用的经验法则,绝不是强制性的,而且我经常发现自己没有逐字尊重它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-15
        • 2012-12-14
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        相关资源
        最近更新 更多