java配置/参数传递设计

发布于 2024-12-01 22:30:27 字数 736 浏览 1 评论 0原文

我经常发现需要设计具有可配置功能的对象。

举例来说,假设我正在创建一个 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); 或基于属性的配置。

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

Often I find the need to engineer objects with configurable functionality.

To exemplify, assume I'm creating a DateIterator. The configurable option(s) might be whether to iterate the closed interval [start, end] or the open-end interval [start, end).


  • (1) The, in my opinion, ungraceful solution - limited to only one true/false configuration option
new DateIterator(boolean openInterval);
  • (2) The typesafe enum way - typically a bit bulky
new DateIterator(Interval.OPEN_END);
  • (3) The unconventional attempt - nice but not too straight forward
new DateIterator().openEnd();
  • (4) The inheritance approach - often over-engineering
new OpenEndedDateIterator();

To this comes a few alternatives which I consider inferior, like integer-based configuration new DateIterator(Interval.OPEN_END); or property based configuration.

Are there any other approaches? Which approach you do you prefer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

滥情哥ㄟ 2024-12-08 22:30:27

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

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

这样您的实际 DateIterator 可以是不可变的,而由 DateIterator.builder() 返回的构建器完成配置工作。

I'd say the Builder pattern makes sense here:

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

That way your actual DateIterator can be immutable, while the builder returned by DateIterator.builder() does the configuration work.

江南月 2024-12-08 22:30:27

虽然没有好的答案,而且这在很大程度上是一个品味问题,但我确实遵循以下经验法则,并留有很大的例外空间,以避免过度工程:

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

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

While there is no good answer, and it's largely a matter of taste, I do follow the following rule of thumb, with large space for exceptions to avoid over engineering :

  1. If the only configuration you have is one "parameter", taking a fixed set, and alters behavior (like in your example), go with subclasses. While it may be over-engineered, if many methods in your class start with an "if (this.parameter == x) ... else if (this.parameter == y) .. " it will make code unreadable.
  2. If your parameter is not a fixed set, but a string or number, and you NEED it for the class to work properly put it in the constructor, if it's not mandatory i like solution number (3), the unconventional attempt :)
  3. If you have more than one parameter in a fixed set (like START_OPEN_ENDED and STOP_OPEN_ENDED), creating subclasses may mean to create a subclass for each permutation. In that case consider encapsulation. For example (I would not do it in this specific case probably, but it's a good example), create a single class DateComparator, with a subclass for open ended, and encapsulate a DateComparator for the start and one for the end, having only one DateIterator.

Again, these are the rule of thumb I use, in no way mandatory, and often I find myself not respecting them verbatim.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文