很多人都研究过petshop,我开始认识分层架构也是从研究这个petshop开始的。但是我发现很多人一谈三层架构就是

petshop那一套东西。实体类,DAL,BLL那一套东西。首先我不否认petshop这个架构整体的设计的合理性。但是这个合理性也是在一

定的项目环境下来说的。我觉得petshop这个架构只适合比较小的项目。系统的大部分需求只是对数据库的CRUD操作。而且业务逻辑

变化变化可能性很小的情况。

看过企业架构模式的应该知道。Petshop这个业务逻辑层采用的是表模块(table module),一个表对应一个类,负责这个表

相关的业务逻辑。数据访问层是表入口(table gateway),也是一个表对一个类,负责这个表的所有crud操作。还定义了实体类用

来保存数据库中取出的数据,用来在各层间传递。这种设计数据和行为分别放到了不同的类中。这个确实违背了oo的原则(数据和

数据相关的行为应该放到一起).业务逻辑层中业务逻辑操作类还都是静态方法。

从以上分析可以看出这个架构的一大隐患就是把自己弄的和oo保持了很远的距离。首先是行为和数据的分离。再者就是业务逻辑类

中的静态方法。这些都让oo的核心特性,继承和多态没办法应用。没了oo,设计模式中那些封装变化点的手法也就派不上用处了。

做企业应用的一定都有体会,变化那个快啊!唯一不变的就是变化。想给petshop想几个需求变化来说明这个架构不适合复杂业务逻

辑项目,还真是不容易。干脆就拿我现在面对的项目说事吧。这个是我们公司的网站。主要是卖我们公司的产品。基本的业务流程是

,用户填写一些和产品相关的信息。联系人,邮箱,地址等等。然后处理订单的流程如下。1.根据用户选择的产品做不同的验证(

因为不同产品的需要的验证的数据项和验证规则都不一样)。2.根据不同的产品计算价格3根据不同的产品调用库存系统接口.(主

要是传递的参数不一样)。4.根据不同产品的保存订单信息和产品信息。目前系统的设计基本这样的。设计使用事务脚本来处理这个流程的。基本上每个环节都对应一

个方法。Buy方法调用依次调用validate,produce,saveorder方法。然后每个方法会在内部用switch和if来判断是那个产品然后做出相应的处理。很难相信这种代

码能运行这么长的时间。由于我们公司产品线变化非常的频繁。所以基本上每添加新的产品都要修改所有以上方法。由于频繁的修

改导致了代码的严重可读性差。每个方法都愈来越长,if语句愈来愈诡异。有些下线的产品代码其实该清除的。 说了这么多我觉得

最大的缺陷是组织业务逻辑的方法不合适。我现在被安排维护这些代码。每改一个新需求,我都心里发虚啊。怕自己弄错了if块。

还好领导们也认为旧的系统维护效率太低了。要求重新设计系统。我觉得应该把业务逻辑使用领域模型来组织。每个行为

不一样的产品都应该有自己的类。然后对产品建立一个类体系。抽象出每个环节和具体某个产品相关的行为到一个类中。比如

ProductA应该有Validate,GetProduceParameter,等等,这几个方法。来实现验证自己,获取库存调用接口参数,和获取订单相关信

息的方法。这样buy方法就可以把这些行为委托给具体的产品类。自己就负责流程管理就行了。以后新产品来了,就对新产品建立个

新类。这样这个业务层也就对修改封闭对扩展开放了。这个没oo确实很难办。理想总是很美好的。几个项目主管和其他同事推崇的

架构方案居然是和petshop一样的架构。Petshop组织业务逻辑的方式虽说比事务脚本好了点。但是它的缺点也是很多啊。就我知道

的,这个架构对数据库表耦合的很紧。基本都是实体类和表一一对应,然后字段和属性也一致。网上很多生成实体类的方法也都是

根据数据库表的元数据信息自动生成的。虽说弄了三层但是那一层也没逃脱对数据库结构的依赖。对数据库结构的变动会导致所有

层的修改。另外 petshop的那个抽象工厂用的也有点多余把。Ado.net2.0已经实现了这个模式,我们在数据访问层直接用

DBConnection,DBCommond这些抽象类就行了。所以我觉得这个petshop纯粹是个演示架构和微软技术的一个花架子。具体到每个不同

的项目,都有自己的项目环境。生搬硬套petshop也是很stupid.说实在的我认为对于petshop那样的项目需求也根本费不上petshop

那样的架构。

我心目中一个复杂企业应用的架构

我也质疑下petshop的更多相关文章

  1. .NET 三层架构的简单规划

    今天心血来潮简单看了下petshop4.0的源代码,他就是用三层架构来实现的.现在简单的做下总结. 首先我们先看下petshop的三层架构. 1 WEB 表示层 2 Model 业务实体 3 BLL ...

  2. 2017-10-27模拟赛2-T1 选举(election.*)

    Description 题目描述 C国的总统选举委员会最近遇到了一些麻烦. 他们在统计各省对H先生的支持率(百分比)时,把支持率四舍五入到了整数.等他们公布结果后,该国媒体发现这些省份的支持率之和不等 ...

  3. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  4. 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...

  5. iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】

    投诉公司: 北京直信创邺数码科技有限公司  标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...

  6. web应用安全防御100技 好书再次阅读, 变的只是表象,被概念迷惑的时候还是静下心来回顾本质

    如何进行web应用安全防御,是每个web安全从业者都会被问到的问题,非常不好回答,容易过于肤浅或流于理论,要阐明清楚,答案就是一本书的长度.而本文要介绍一本能很好回答这个问题的优秀书籍——<we ...

  7. 分享下对JAVA程序员成长之路的总结<转>

    我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见.   首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...

  8. 你是否还在质疑EF的性能

    1. 写在前面的话 一直没有写博客的习惯,感觉太浪费时间,没有那么多精力,其实仔细一想,写博客是一种习惯,也是一种心境,同时也是对自己所掌握的知识结构的一个梳理过程,对自己知识体系的一个巩固,同时也是 ...

  9. 基于Node的PetShop,oauth2认证RESTful API

    前篇 - 基本认证,用户名密码 后篇 - OAuth2 认证 前文使用包passport实现了一个简单的用户名.密码认证.本文改用oauth2来实现更加安全的认证.全部代码在这里. OAUTH2 用户 ...

随机推荐

  1. 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

    给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...

  2. regular

    regular.py import re # . # 只能匹配一个字母,而不是2个或0个 # \ # 转义 # 'abc\\.com' r'abc\.com' # 字符集[] # 匹配他所包括的任意字 ...

  3. ARM之工作模式

    前言            以下内容是个人学习之后的感悟,转载请注明出处~ ARM工作模式 ARM工作模式根据功能不同,可分为7类: User Mode:用户模式.操作系统的Task一般以这种模式执行 ...

  4. 1.1-1.5 flume架构概述及安装使用

    一.flume架构概述 1.flume简介 Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据.它具有基于流数据流的简单灵活的架构.它具有可靠的可靠性机制和许多故障转移和 ...

  5. Number()、parseInt()、parseFloat()的区别:

    Number().parseInt().parseFloat()的区别: Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是 ...

  6. CodeForces Gym 100685I Innovative Business (贪心)

    题意:给定一条路的长和宽,然后给你瓷砖的长和宽,你只能横着或者竖着铺,也可以切成片,但是每条边只能对应一条边,问你最少要多少瓷砖. 析:先整块整块的放,然后再考虑剩下部分,剩下的再分成3部分,先横着, ...

  7. 【转】NET中管理数字证书(Digital Certificate)的一些类

    http://blog.csdn.net/bat800/article/details/2314510 http://blog.csdn.net/zjlovety/article/details/72 ...

  8. PorterDuffXfermode 图像混合技术在漫画APP中的应用

    此文已由作者游葳授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 写在开头 随着应用开发的深入,视觉同学在完成了页面的基本设计后,再也按耐不住心中的寂寞,开始对各种细节不满意, ...

  9. MySQL之避免插入重复数据

    INSERT ignore INTO `$table_name`($field_name) VALUES(),(),(),()"; //若重复数据可以添加,请在对应的数据表字段中添加数据库索 ...

  10. 【UVA - 10815】Andy's First Dictionary (set)

    Andy's First Dictionary Description 不提英文了 直接上中文大意吧 XY学长刚刚立下了再不过CET就直播xx的flag,为了不真的开启直播模式,XY学长决定好好学习英 ...