【发布时间】:2014-01-03 12:49:06
【问题描述】:
我正在深入研究面向对象的世界,并尝试应用 Clean Code 一书的作者认为应该如何构建丰富对象的原则。
但是,我现在遇到了一个有点哲学的问题,我不太确定如何处理对象的表示。
在 Clean Code 一书中,您可以读到丰富的对象应该只公开行为,而不应该公开其内部变量。该声明还有其他来源。
但是,如果您只公开行为,那么如果您无法获得内部变量的值,您如何在 GUI 中显示对象的表示?
例子:
public class Todo {
private final TodoID id;
private final String createdBy;
private final String currentOwner;
private final String description;
private final Status status;
private Todo(String createdBy, DateTime creationDate, String description, Status status, String todoName) {
this.id = new TodoID(creationDate, todoName);
this.createdBy = createdBy;
this.currentOwner = createdBy;
this.description = description;
this.status = status;
}
public void startWorking(String name){
if(Status.IN_PROGRESS > this.status){
// Set status to IN_PROGRESS
// Set current owner to name
} else {
throw new RuntimeException(this.currentOwner + " has already started working on this task or it might be finished already.");
}
public static TodoID create(TodoValues values) {
Todo todo = new Todo(values.createdBy,
values.creationDate,
values.description,
values.status,
values.todoName);
// Operations to save the Todo-instance in a database
return todo.id;
}
}
我的 Todo-aggregate root 上可能有一个方法,它返回所有新 Todo 的列表
public List<Todo> listAllNewTodos(){}。
列表中的所有 Todo 都有代表对象的 id。但是如果只允许一个对象暴露行为,我该如何表示 id 呢?
编辑:在发布这个问题后,我得到了一个启示。 Clean Code 一书还谈到了 OOP 中还有另一种类型的结构。不仅有行为的对象,还有数据结构。 在这种情况下,我可能应该将 Todo 类/实例视为对象,将 TodoID 实例视为公开其内部变量的数据结构。多亏了这一点,我可以在 GUI 中使用 TodoID 变量来表示 Todo。
【问题讨论】:
标签: java oop domain-driven-design aggregate behavior