当前位置: 首页 > news >正文

厦门建行网站首页贵阳白云区城乡建设局网站

厦门建行网站首页,贵阳白云区城乡建设局网站,做网站的费用,网站有哪些定义 在领域驱动设计#xff08;Domain-Driven Design#xff0c;DDD#xff09;中#xff0c;“Domain Primitive”#xff08;领域原语#xff09;是指领域模型中的基本数据类型或值对象#xff0c;它们代表了业务领域中的最基本的、不可分割的数据元素。Domain Prim…定义 在领域驱动设计Domain-Driven DesignDDD中“Domain Primitive”领域原语是指领域模型中的基本数据类型或值对象它们代表了业务领域中的最基本的、不可分割的数据元素。Domain Primitive通常是不可变的它们的行为受到业务规则的约束并且通常不包含任何业务逻辑。 Domain Primitive可以是简单的数据类型如字符串、整数、布尔值等也可以是一些复杂的值对象如金额、日期、时间范围等。它们用于描述业务领域中的基本概念和属性例如订单号、产品价格、用户姓名等。通过使用Domain Primitive可以有效地表达业务需求并且保持领域模型的清晰和简洁。 在DDD中Domain Primitive与其他领域模型元素如实体、聚合、服务等一起组成了完整的领域模型。通过对领域原语的合理设计和使用可以构建出具有高内聚性和低耦合性的领域模型从而更好地满足业务需求并且易于维护和演化。 上面是比较官方的解释下面是我总结的DP的特性 DP隐式对象、隐式上下文、多对象封装 -- 无状态的业务值对象。 DP是一个传统意义上的Value Object拥有Immutable-不可变的特性。DP是一个完整的概念整体拥有精准定义。DP使用业务域中的原生语言。DP可以是业务域的最小组成部分、也可以构建复杂组合。 结合具体例子讲解下DP在实际业务中的应用。 应用 1.单个原子业务概念的封装。 一个新应用在全国通过 地推业务员 做推广需要做一个用户的注册系统在用户注册后能够通过用户电话号的区号对业务员发奖金。 在这里我们可以看到原来电话号仅仅是用户的一个参数属于隐形概念但实际上电话号的区号才是真正的业务逻辑而我们需要将电话号的概念显性化通过写一个Value Object来表示。 public class PhoneNumber {private final String number;public String getNumber() {return number;}public PhoneNumber(String number) {if (number null) {throw new ValidationException(number不能为空);} else if (isValid(number)) {throw new ValidationException(number格式错误);}this.number number;}public String getAreaCode() {for (int i 0; i number.length(); i) {String prefix number.substring(0, i);if (isAreaCode(prefix)) {return prefix;}}return null;}private static boolean isAreaCode(String prefix) {String[] areas new String[]{0571, 021, 010};return Arrays.asList(areas).contains(prefix);}public static boolean isValid(String number) {String pattern ^0?[1-9]{2,3}-?\\d{8}$;return number.matches(pattern); }} DP对象将业务数据和业务校验的逻辑封装内聚到PhoneNumber VO对象中它是业务模型的最小对象不可再分割同时精准表达业务的原生语义。 下面来看一个组合对象的例子。 2. 当我们做这个支付功能时实际上需要的一个入参是支付金额 支付货币。我们可以把这两个概念组合成为一个独立的完整概念Money。 Value //不可变类 public class Money {private BigDecimal amount;private Currency currency;public Money(BigDecimal amount, Currency currency) {this.amount amount;this.currency currency;} }Value public class Currency {private String code;private String name; } 其中Currency表示货币代码和名称。 3. 对隐藏业务行为的封装可以将转换汇率的功能封装到一个叫做 ExchangeRate 的 DP 里。 Value public class ExchangeRate {private BigDecimal rate;private Currency from;private Currency to;public ExchangeRate(BigDecimal rate, Currency from, Currency to) {this.rate rate;this.from from;this.to to;}public Money exchange(Money fromMoney) {notNull(fromMoney);isTrue(this.from.equals(fromMoney.getCurrency()));BigDecimal targetAmount fromMoney.getAmount().multiply(rate);return new Money(targetAmount, to);} } 下面在领域服务中使用DP对象  public class TransferServiceImplNew implements TransferService {private AccountRepository accountRepository;private AuditMessageProducer auditMessageProducer;private ExchangeRateService exchangeRateService;private AccountTransferService accountTransferService;Overridepublic ResultBoolean transfer(Long sourceUserId, String targetAccountNumber, BigDecimal targetAmount, String targetCurrency) {1.当前业务处理// 参数校验Money targetMoney new Money(targetAmount, new Currency(targetCurrency));// 读数据Account sourceAccount accountRepository.find(new UserId(sourceUserId));Account targetAccount accountRepository.find(new AccountNumber(targetAccountNumber));ExchangeRate exchangeRate exchangeRateService.getExchangeRate(sourceAccount.getCurrency(), targetMoney.getCurrency());// 业务逻辑accountTransferService.transfer(sourceAccount, targetAccount, targetMoney, exchangeRate);// 保存数据accountRepository.save(sourceAccount);accountRepository.save(targetAccount); 2.关联业务处理 -- 发送领域事件通知 // 发送审计消息AuditMessage message new AuditMessage(sourceAccount, targetAccount, targetMoney);auditMessageProducer.send(message);return Result.success(true);} } DDD的注意点 实体对象只能保存自己的状态不能关联其他实体对象只可以通过参数的方式依赖。 实体的不变性、数据的一致性 : 创建即一致\尽量避免public setter\通过聚合根保证主子实体的一致性。一个最容易导致不一致性的原因是实体暴露了public的setter方法特别是set单一参数会导致状态不一致的情况。【建议】在有些简单场景里有时候确实可以比较随意的设置一个值而不会导致不一致性也建议将方法名重新写为比较“行为化”的命名会增强其语意。比如setPosition(x, y)可以叫做moveTo(x, y)setAddress可以叫做assignAddress等。 不可以强依赖其他聚合根实体或领域服务:只保存外部实体的ID、针对于“无副作用”的外部依赖。 任何实体的行为只能直接影响到本实体和其子实体。 在自己的业务中强制验证能百分百保证使用这个业务时的正确性防止不熟悉的人或者时间久远导致遗漏。 Player.equip(Weapon, EquipmentService) {     EquipmentService.canEquip(this, Weapon); }  ✅ boolean canEquip EquipmentService.canEquip(Player, Weapon); if (canEquip) {     Player.equip(Weapon); // ❌这种方法不可行因为这个方法有不一致的可能性迪米特法则--内部封装、隐藏细节 } 在封装领域规则时可以通过策略管理对象 具体的策略对象完成策略的逻辑。
http://www.pierceye.com/news/38922/

相关文章:

  • 手机网站欢迎页面设计做mla网站
  • django做的电子商务网站阿里云有主体新增网站
  • 山西响应式网站平台非标自动化外包平台
  • phpcms 网站模板房地产行业网站
  • wordpress 获取父页面seo相关ppt
  • 收录文案网站网站难做吗
  • 广西建设职业技术学院图书馆网站传奇做网站
  • 购物展示网站开发的背景品牌策划公司应具备的能力
  • 做印刷厂网站网站建设的用户体验
  • 培训网站建设方案模板下载wordpress文章手机平铺
  • 百度北京公司地址全部seo管理工具
  • 山东省建设监理协会官方网站不收费推广网站有哪些
  • 关键词排名优化网站建设公司信融营销型网站建设
  • 东莞网站建设音乐盒昆明cms模板建站
  • 做文化建设的网站Wordpress 点击跟踪
  • 欢迎回来请牢记网站域名物联网是什么意思
  • 宣传网站建设方案模板下载手机如何制作一个网站
  • 西安网站优化体验手机网站建设渠道
  • 网站运营与推广计划书怎么做wordpress post_type
  • 网站建设需要的设备wordpress 增加菜单
  • 长春网站建设专业公司wordpress文件夹权限设置
  • 德州做网站多少钱wordpress版本怎么升级
  • 做么网站有黄手机可以搭建网站吗
  • 网站开发支付宝二维码支付上海的外贸网站建设公司
  • 什么网站可下载可做海报的图片php7.0 wordpress 设置
  • 网络销售型网站有哪些哪里可以鉴定钻石
  • 青岛红岛做网站温州新闻
  • 动漫网站建设方案项目书目录域名怎么绑定自己网站
  • 公司网站服务费计入什么科目自己做网站名电子章违法吗
  • 做关键字要改网站口碑好的网站建设公司