聚合只是將一些實體(Entity)與值對象(Value Object)聚集起來的對象樹嗎?? 有些途徑可能使我們設計出不正確的聚合模型, 如:可能為了對象組合上的方便而將聚合設計的很大;也可能設計的聚合過於貧瘠而喪失了保護真正不變條件(業務規則)的目的. "實現領域驅動設計"一書的作者,提供了幾個聚合設計原則...... 在一致性邊界之內建模真正的不變條件 這裡的不變條件指的是一個業務規則,該規則應該總是保持一致的.存在多種類型的一致性,事務一致性(高一致性),最終一致性等.在討論不變條件時,就…
創建過程中須考慮一些重要細節, 否則所創建的聚合將處於不正確的狀態, 使用適當的工廠方法可以確保這一點, 而客戶端只需輸入基本的參數(通常是值對象), 另外, 工廠能更好地表達出通用語言, 使團隊成員更容易溝通, 這是建構函式不能達到的. 聚合根中的工廠 工廠方法能幫助我們有效表達限界上下文中的通用語言,減清客戶端在創建新聚合實例時的負担,並確保所創建的實例處於正確的狀態. 但工廠會帶來性能上的影響,在創建聚合實例時,我們必須先從持久化存儲中取得參數的實例,雖然與工廠帶來的好處相比之下,這點性能…
前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚,并为你提供业务逻辑的唯一访问点.而聚合则是第二步,它将多个相关业务概念包装到单一的概念中,从而大幅简化系统设计,由于受传统数据建模思维影响,我在聚合方面吃过大亏,花了将近一年才真正用起来,为了你少走弯路,我会把一些要点总结出来供你参考. 什么是聚合? 聚合包装一组高度相关的对象,作为一个数据修改的单…
DDD分层架构之聚合 前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚,并为你提供业务逻辑的唯一访问点.而聚合则是第二步,它将多个相关业务概念包装到单一的概念中,从而大幅简化系统设计,由于受传统数据建模思维影响,我在聚合方面吃过大亏,花了将近一年才真正用起来,为了你少走弯路,我会把一些要点总结出来供你参考. 什么是聚合? 聚合包装一组高度相关的对象…
這一篇要討論如何使用Xamarin.Android 整合GCM以及Windows Azure來實作Android手機上的推播通知服務. 這篇文章比較著重概念的部分,在開始讀這篇之前,也可以先參考一下Xamarin網站上的文章原文來了解Android GCM的運作邏輯: Remote Notifications:An Overview of Remote Notifications in Xamarin.Android http://docs.xamarin.com/guides/cross-pl…
資料庫檢索效率時,一般首要優化途徑是從索引入手,然後根據需求再考慮更復雜的負載均衡.讀寫分離和分散式水平/垂直分庫/表等手段:索引通過資訊冗餘來提高檢索效率,其以空間換時間並會降低資料寫入的效率,因此對索引欄位的選擇非常重要. Neo4j可對指定Label的Node Create Index,當新增/更新符合條件的Node屬性時,Index會自動更新.Neo4j Index預設採用Lucene實現(可定製,如Spatial Index自定義實現的RTree索引),但預設新建的索引只支援精確匹配(…
第8章: 主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 1.软件需求:人们为了解决现实社会和生活中的各种问题而有求于软件 2.而作为软件团队,准确而全面地找到这些需求主要的步骤为: (1)获取和引导需 (3)验证需求 (2)分析和定义需求 (4)在软件产品的生命周期中管理需求 3.用户对软件的需求又分为:对产品功能性的需求:对产品开发过程的需求:非功能性需求:以及综合需求.所以软件团队和客户代表在需求…
第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对LSP的违反导致了OCP的违反: struct Point { double x, y;} public enum ShapeType { square, circle }; public class Shape { private ShapeType type; public Shape(Shape…
在第10章10.2.1小节中,首先分别对视图类和对话框类添加了一个名为m_nLineWidth的int型变量,再将用户在CSetting dlg对话框的edit控件中输入的线宽值记录在dlg.m_nLineWidth中,然后将dlg.m_nLineWidth赋给视图类的m_nLineWidth中,最后在CClientDC dc中用m_nLineWidth值对应的线宽画线. 跟着视频做的时候觉得很奇怪,为什么直接在视图类的成员函数中就写m_nLineWidth=dlg.m_nLineWidth了,…
第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出一个简单.低级的应用接口,这使得所有的输入输出都能以一种统一且一致的方式来执行: 打开文件: 内核返回一个小的非负整数,叫做描述符. Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0).标准输出(描述符为1).标准错误(描述符为2). 改变当前文件位置: 对于每个打开的文件,…