失血模型,充血模型

一、失血模型 

失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类。

简单来说,就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。 
Service(业务逻辑,事务封装) --> DAO ---> domain object

这种模型的优点: 
1、各层单向依赖,结构清楚,易于实现和维护 
2、设计简单易行,底层模型非常稳定 

这种模型的缺点: 
1、domain object的部分比较紧密依赖的持久化domain logic被分离到Service层,显得不够OO 
2、Service层过于厚重

从优缺点来看,简单稳定易维护是失血模型的最大优点,缺点显得不够面向对象,确实是不够面向对象,但是对于中小型项目,业务逻辑并不是很复杂,更多的需求在于稳定运行于可维护扩展,

显然利稍大玉弊,而且此模型结合ORM实现CodeFirst,可以实现快速开发,节省人力和成本,更是中小行项目所青睐的,那么何乐而不为呢。而且这种模型应该根据项目需要来进行调整和修改

不可生搬硬套。

例如我们搞的商城,为了减轻各环节服务器的压力,降低各业务之前的耦合,提高业务模块的复用性。简单的画了张图,这样实现项目需要和替换原有模块上都能方便的实现。

嗯,这里就不得不加一句,符合需求的设计才是最合理的。

 一、充血模型

 充血模型和贫血结构上差不多,不同的是它把大部分与自己相关领域的行为或者逻辑放到领域对象里面了,而业务层或者Service中只有少量的逻辑,简单日志,权限,事务等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。
   这种模型的优点: 
1、更加符合OO的原则 
2、Service层很薄,只充当Facade的角色,不和DAO打交道。 
这种模型的缺点: 
1、DAO和domain object形成了双向依赖,复杂的双向依赖会导致很多潜在的问题。 
2、如何划分Service层逻辑和domain层逻辑是非常含混的,在实际项目中,由于设计和开发人员的水平差异,可能导致整个结构的混乱无序。 
3、考虑到Service层的事务封装特性,Service层必须对所有的domain object的逻辑提供相应的事务封装方法,其结果就是Service完全重定义一遍所有的domain logic,非常烦琐,而且Service的事务化封装其意义就等于把OO的domain logic转换为过程的Service TransactionScript。该充血模型辛辛苦苦在domain层实现的OO在Service层又变成了过程式,对于Web层程序员的角度来看,和贫血模型没有什么区别了。

 

转载于:https://www.cnblogs.com/superCow/p/3811701.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 数据库构建: 首先需要读取文本文件内容,并将其转换为一个结构体数组。假设文本文件中的内容格式为: ``` 2021-03-22 08:00:00, Drug, Start 2021-03-22 08:10:00, Drug, End 2021-03-22 10:00:00, Bloodloss, Start 2021-03-22 10:30:00, Bloodloss, End 2021-03-22 13:00:00, Drug, Start 2021-03-22 13:30:00, Drug, End 2021-03-22 16:00:00, Bloodloss, Start 2021-03-22 16:30:00, Bloodloss, End ``` 则可以使用如下代码将其转换为一个结构体数组: ```matlab % 读取文本文件内容 fileID = fopen('20210322.txt','r'); formatSpec = '%s %s %s'; data = textscan(fileID, formatSpec, 'Delimiter', ', '); fclose(fileID); % 构建数据库 num_events = length(data{1}); for i = 1:num_events db(i).time = datetime(data{1}{i}, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); db(i).type = data{2}{i}; db(i).status = data{3}{i}; end ``` 这样就可以将原始数据转换为一个名为`db`的结构体数组,其中每个元素包含了一次失血或打药的开始结束时间和类型。 2. 数据截取: 根据构建好的数据库`db`,可以使用如下代码对原始数据进行截取: ```matlab % 读取原始数据 data = load('data.mat'); % 遍历数据库,截取数据 for i = 1:length(db) type = db(i).type; status = db(i).status; if strcmp(status, 'Start') start_time = db(i).time; else end_time = db(i).time; segment_name = [type, '_', status, '_segment']; segment_data = data.data(data.time >= start_time & data.time <= end_time, :); assignin('base', segment_name, segment_data); end end ``` 这段代码会将原始数据`data`按照数据库中的每一次失血或打药进行截取,并将截取到的数据保存在一个变量中。`assignin('base', segment_name, segment_data)`这一行代码会将截取到的数据保存在工作空间中,变量名为`segment_name`。例如,对于第一次打药,截取到的数据会被保存在变量`Drug_first_segment`中。 这样就可以实现自动截取数据,并将截取到的数据保存在工作空间中,方便后续的处理和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值