豆类,方法,访问和变化?处理它们的推荐做法是什么(即在ColdFusion中)?

时间:2009-07-10 11:22:13

标签: oop data-structures

我是编程新手(现在已经6周了)。我现在正在阅读很多书籍,网站和博客,而且我每天都在学习新东西。

现在我正在使用coldfusion(工作)。我已经阅读了很多关于网络的oop和cf相关文章,我计划接下来进入mxunit,然后再看看一些框架。

有一件事困扰我,我无法找到满意的答案。 Bean有时被描述为DataTransferObjects,它们从一个或多个源保存数据。

处理此数据的推荐做法是什么?

我应该使用一个单独的Object来读取数据,改变它并将其写回bean,这样bean只是一个数据存储(可以通过getter访问),或者我应该实现这些方法来操作数据在豆里。

我看到两个选项 1. bean只是存储,其他对象必须对其数据做一些事情 2. bean是存储和逻辑,其他对象告诉它对其数据执行某些操作。

第二种选择在我看来更多地遵循封装,而第一种选择似乎是使用bean的方式。

我确信这两个选项都适合某些人需要,并且建议在特定的上下文中使用,但一般情况下建议什么,特别是当有人对更大的应用程序图片了解不够并且是初学者时?

例:
我创建了一个bean,它使用项目ID,名称和1d数组从数据库中保存Item。每个数组元素都是一个结构,用于保存用户的id,名称和项目数量。通过getter我输出一个表格中的数据,我也可以在其中更改每个用户的金额或检查用户是否从该项目中删除。

我在哪里设置逻辑来处理应用程序用户输入?
我是否根据用户输入告诉bean更改其数组? 或者我创建一个更改数组的对象并将新数组写入bean?

(所有数据库访问(CreateReadUpdateDelete)都是通过将bean作为参数的DataAccessObject来处理的.DAO还包含一个从数据库中读取多条记录的网关方法。我使用这种方法获取一个项目表,我可以点击创建bean及其数据。)

2 个答案:

答案 0 :(得分:1)

您正在观察"anemic domain model"之类的内容。是的,这很常见,不,这不是好的OO设计。通常,逻辑应该与它所操作的数据一致。

但是,还有separation of concerns的问题 - 您不希望将所有内容都填入域模型中。例如,数据库访问通常被认为是技术上独立的层,而不是域模型本身应该做的事情 - 看起来你已经把它分开了。究竟应该和不应该成为领域模型的一部分取决于具体案例 - 良好的设计不能真正用绝对规则来表达。

另一个问题是通过网络传输的模型,例如:在应用服务器和Web前端之间。您希望这些仅包含数据本身以减少badnwidth使用和延迟。但这并不意味着它们不能包含逻辑,因为方法不是序列化对象的一部分。派生字段和缓存是 - 但它们通常可以某种方式标记为瞬态,以便它们不会被转移。

答案 1 :(得分:1)

你的bean应该包含你的数据和逻辑。

数据传输对象用于通过网络传输对象,例如从ColdFusion传输到浏览器中的Flex应用程序。 DTO仅包含对象数据的相关字段。

在可能的情况下,您应该尽量减少将bean的内部实现(例如用户结构数组)暴露给其他对象。要更改数组,您应该直接在bean上调用mutator函数,例如yourBean.addUser(user)将用户结构附加到内部数组。

无需为组合的Gateway对象创建单独的DAO以进行数据访问。只需将所有数据库访问方法(CRUD加表查询)放入单个Gateway对象中即可。