【发布时间】:2012-05-20 19:53:28
【问题描述】:
假设您有一个 Song 的域模型类。歌曲有一个速度属性(一个 int),它应该总是一个正数。这个需求应该是领域模型的一部分还是外部的(例如在 SongManager / 业务逻辑层类中)?
假设您选择这样实现它:
class Song {
private int tempo;
// ...
public void setTempo(int tempo) {
if (tempo > 0) {
this.tempo = tempo;
} else {
// what?
}
}
}
你能把上面的// what?替换成:
- 什么都没有。给定一个 Song 实例
s,s.setTempo(-10)根本不会修改对象的状态。 - 将速度设置为某个最小值,例如
1。 - 在
else子句中用选中throws InvalidTempoException和throw标记setTempo。这样,控制器或其他组件负责捕获无效的速度值并决定如何处理异常。 - 抛出一个运行时 InvalidTempoException。
- 将 tempo 属性提取到 Tempo 类中,其中封装了“必须大于 0”。
- 别的东西。
我问是因为我最近一直在探索常见的“分层架构”方法,尤其是领域层。
【问题讨论】:
-
虽然#3 的味道很明显(必须捕获或躲避每个
setTempo调用的检查异常),但有一种方法可以利用它,使躲避的异常基本上“冒泡”到一些验证层?
标签: oop dns domain-driven-design ooad