DanBerghJohnsson_ThePowerOfValuePowerUseOfValueObjectsInDomainDr...
### 使用值对象的力量:在领域驱动设计中的应用 #### 标题解读 - **标题**:“Dan Bergh Johnsson _ The Power Of Value - Power Use Of Value Objects In Domain Driven Design” - 这个标题表明演讲的主题是关于如何在领域驱动设计(Domain-Driven Design,简称 DDD)中有效利用值对象(Value Objects)。演讲者 Dan Bergh Johnsson 将重点放在了值对象在构建复杂业务逻辑时的价值和力量上。 #### 描述解析 - **描述**:“InfoQ 的《值的力量 - 在领域驱动设计中有效利用值对象》演讲 PPT。” - 描述进一步解释了演讲的具体内容,即通过 InfoQ 平台分享的 PPT,介绍了如何在 DDD 架构中有效地使用值对象来增强软件系统的业务价值。 #### 知识点详述 ### 值对象的基础概念 - **定义**:值对象是领域驱动设计中的一个核心概念,它不具有唯一标识符,而是以其属性的值来确定其等价性。例如,在现实世界中,“颜色”或“邮政编码”可以被建模为值对象。 - **重要性**:值对象在表达复杂的业务规则时非常有用,它们能够帮助开发人员更清晰地表达领域逻辑,并减少代码中的冗余。 ### 示例分析 #### 示例 1:客户表单处理 ```java public class CustForm extends ActionForm { private String phone; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } ``` - **解释**:这个示例展示了一个简单的客户端表单类 `CustForm`,其中包含了一个电话号码字段 `phone`。这里没有将 `phone` 设计为值对象,而只是作为一个普通的字符串字段处理。 #### 示例 2:添加客户动作 ```java public class AddCustAction extends Action { private CustomerService custServ = null; @Override public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { CustForm form = (CustForm) actionForm; try { String phone = form.getPhone(); custServ.addCust(0, phone, "foo"); return actionMapping.findForward("success"); } catch (ValidationException e) { return actionMapping.findForward("invaliddata"); } } } ``` - **解释**:在这个示例中,我们看到 `AddCustAction` 类用于处理添加客户的请求。它通过调用 `CustomerService` 接口的 `addCust` 方法来完成此操作。这里的电话号码仍然被视为一个简单的字符串,而不是一个值对象,这意味着在验证和存储电话号码时可能存在潜在的问题。 #### 示例 3:客户服务接口与实现 ```java public interface CustomerService { void addCust(int i, String phone, String s) throws ValidationException; } public class CustomerServiceImpl implements CustomerService { public void addCust(int i, String phone, String s) throws ValidationException { PreparedStatement dbStmt = "INSERT INTO ..."; if (!justNumbers(phone)) throw new ValidationException(); try { dbStmt.setInt(1, i); dbStmt.setString(3, phone); dbStmt.setString(4, s); dbStmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); } } private static boolean justNumbers(String s) { return s.matches("[0-9]*"); } } ``` - **解释**:这个示例展示了 `CustomerService` 接口及其实现 `CustomerServiceImpl`。在实现类中,电话号码通过 `justNumbers` 方法进行验证,确保只包含数字。尽管这种方法可以满足基本的需求,但将电话号码作为值对象可以更好地管理验证规则和提高代码的可维护性。 #### 示例 4:在线交易处理 ```plaintext void onlineTransaction(StoreId store, BigDecimal amount) { Currency storeCurrency = storeService.getCurrency(store); if (storeCurrency.equals(cardCurrency)) { debt = debt.add(amount); } else if (cardCurrency.equals(ExchangeService.REF_CURR) && (!storeCurrency.equals(ExchangeService.REF_CURR))) { QuoteDTO storeQuote = exchange.findCurrentRate(storeCurrency); debt = debt.add(amount.multiply(storeQuote.rate)).add(ExchangeService.FEE); } else if (!cardCurrency.equals(ExchangeService.REF_CURR) && (storeCurrency.equals(ExchangeService.REF_CURR))) { QuoteDTO cardQuote = exchange.findCurrentRate(cardCurrency); debt = debt.add(amount.divide(cardQuote.rate)).add(ExchangeService.FEE); } else { // 更多条件处理... } } ``` - **解释**:此示例展示了在线交易过程中货币转换的逻辑。在这个场景中,使用了 `Currency` 和 `QuoteDTO` 等值对象来表示货币类型和汇率信息。通过这些值对象,我们可以更加清晰地表达业务逻辑,并且可以更容易地处理复杂的汇率计算问题。 ### 总结 - 在领域驱动设计中,值对象的正确使用可以极大地提升代码的可读性和可维护性。通过对上述示例的分析可以看出,将电话号码、货币类型和汇率等信息建模为值对象能够帮助开发者更好地组织代码并减少出错的可能性。同时,值对象的设计还可以帮助团队更准确地理解业务领域的概念,从而构建出更符合实际需求的应用系统。
剩余70页未读,继续阅读
- 粉丝: 1
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java及Web技术的医药管理系统设计源码
- 基于Objective-C的cordova-plugin-wechat插件开发源码研究
- 基于Python语言的SocialNetworkBackend社交数据分析系统后端设计源码
- 基于Python的pytracking-master目标跟踪dimp方法设计源码
- 基于PHP、JavaScript、CSS的zibll主题美化插件设计源码
- 毕业设计之mimo系统中中最大比合并和空时编码的性能研究
- 本程序对基于matlab对NOMA系统中经典多用户功率分配算法进行了研究
- Phone-1.zip
- 07-2022240679-学生信息管理-骆泳舟.zip
- lvdai20241115