Shinn
唯天下之至诚能胜天下之至伪;唯天下之至拙能胜天下之至巧.
posts - 19,comments - 125,trackbacks - 3

SRP的理念最早由Tom DeMarco提出,并作为内聚性的一个重要组成部分

每一个Object应该只能有一个职责,并且该Object提供的服务都应聚焦在职责上 

  *此处的Object不同于OO中类的实例,按照面向过程编程,一个function也可以称为一个Object

Bob大叔在面向对象领域重新诠释了该原则(下载Bob大叔的诠释).并归于他的面向对象设计的原则之一.

Bob大叔指出:

一个类无论如何不能有多余一个导致其变化的原因.

 Bob大叔的观点和Tom的观点有相当大的差异,Tom强调一个Object只能有一个职责,而Bob强调一个类只能有一个产生变化的原因。那Bob到底要表达什么呢,一个类是只能有一个功能(职责)?如果一个类真的只能有一个方法,那我们程序中的类不多了去了.带着疑问, 我们看一下Bob书《Agile Software Development: Principles, Patterns, and Practices.》中的原文

This principle was described in the work of Tom DeMarco1 and Meilir Page-Jones2. They
called it cohesion

 原来Bob大叔说的是单一职责是要高内聚,这就对了。那我们的类究竟该如何设计呢?综合起来,SRP原则包括两个方面

  1. 首先功能要高内聚(Tom观点)
  2. 容易引起变化的部分隔离出去(Bob观点)

 1.高内聚:在某种意义上高内聚意味者好的抽象,既尽可能多的忽略无关的细节.其目标是降低复杂度.具体说来就是:

类中所有对外接口(包括Method和Property)在支持一个中心目标上高度一致.

如果我们在BOM系统中需要一个Materil类,初始化后能获取名称,主要供应商,查找所有供应商等外部接口

   Materiel类的接口

  • Materiel(string materielId);
  • string MaterielId{Get;}
  • string Name{Get;}
  • Vendor MainVendor{Get;}
  • VendorCollection GetAllVendor();

Materiel类的对外接口都为一个为物料的抽象性服务,虽然Material内部实现有其它服务该类的其它属性,比如说BasicInfoDAL.Material,BasicInfoDAL.Vendor两个类.但对于Material类的客户(调用者)并不知道,也不需知道其内部实现.

2.隔离易变化点: 此处为Bob大叔的核心观点,也是大多数书上,网上关于SRP的观点.目标是便于重用减少修改成本,常见做法就是将类拆分.
  

违反SRR意味着把本不相关的的职责耦合在一起.从而导致易碎的"瓷器设计",让后来者甚至原作者在一段时间之后也

不敢轻易动该类,最后常见的情况就是为每个调用者拷贝一份代码,另外起一个名字。使设计腐化;

   违反该类的常见情景有:

  1. 过大的类;
  2. 万能类/大杂烩类;
  3. 业务逻辑与持久化处理不分
  4. 业务逻辑与GUI处理部分
  5. 特别要提一下的是新手程序员常犯的错误,万能超级页面

过大的类:常见代码臭味之一,产生原因是加给类做的事情太多.一搬情况下,按我个人平时的做法要是一个类公开的方法超过7个/或代码超过300行就可以检查是否可以改进了.

万能类/大杂烩类:什么都能干,什么都知道的类.大杂烩类在一些企业很常见,甚至有一个标准的名称 Common.cs,任何想的到的想不到的东东都往里面加.处理方法,建议大家在有建Common的时侯稍微动一下艺术细胞,想一个好类名.杜绝Common.cs

业务逻辑与持久化处理不分:常见情况是没有独立的DAL层,逻辑与SQL写在一个方法里.走一步代码,拼成一个SQL语句,查出数据核对下结果.不停的重复.程序慢了之外,维护还是个大问题

业务逻辑与GUI处理部分:常见情况是往类里面传控件,甚至类里面本身就有frm**的引用.非form类的方法里有*.Text="***";或int xxx=Convert.ToInt32(**.Text.Trim())类似代码;*.Enable=true类似代码.

万能超级页面: 这个名字享受加红的特殊待遇有两个;一是因为这个东东很常见,带过新人的兄弟肯定有过忘界面兴叹的郁闷.没带过的估计前不久自己还这么干.咱以前也干过,

   此种问题一旦出现,整个项目不带aspx的cs文件不会3个,除此之外全部是界面,所有的操作都在页面,甚至全部在***_Click(object sender,**EventArg e)中完成.此种超级页面称为万能页面. 碰到业务逻辑复杂一点的,代码行数会不断刷新记录.按照微软一份统计,大型团队人均年代码率3K行的标准,你会发现,一个万能超级页面就能轻松胜出一个工程师一年的产出,还能留个零数来年备用.

---------------------------------------------------------------------------------------------------

难得周末这么清闲,聊下最基本最简单的OO原则,文章构思,生成时间较短,必定很多不足与错误,欢迎指出, 另外做个小统计

你见过的最长代码文档有多长?

我自己见过最长的代码文档(*.aspx+*.aspx.cs) 有4k行,约等16人月产出

posted on 2008-11-22 14:16 Shinn 阅读(1585) 评论(11)  编辑 收藏 网摘

FeedBack:
2008-11-22 14:20 | BoyLee      
见过最长的一个.cs文件中大概也就一万六千多行吧
咱是外包苦力,没技术,纯体力,我最多一天900行JS+1500行后台CS.不过现在写的很少了.

  回复  引用  查看    
2008-11-22 14:49 | Jeffrey Zhao      
希望能够有足够说明问题的实例来看一下……
  回复  引用  查看    
2008-11-22 15:07 | Kevin-moon      
这是一个缺乏标准的原则
多少才是“单一”呢?!!!
我觉得根据你的团队和你的环境来定吧。适合的才是最好的

  回复  引用  查看    
2008-11-22 15:47 | Anders Cui      
我见过2000多行的方法,以及2000多行的存储过程
还口口声声说编码规范
方法名跟变量名起得再好有什么用呢?

  回复  引用  查看    
2008-11-22 16:03 | 潘安+宋玉      
我自己写过delphi一个界面6000行
  回复  引用  查看    
2008-11-22 16:08 | winter-cn未登录[未注册用户]
汗了 果然被传出来了

微软的dev平均一天写10行代码这秘密......

  回复  引用    
2008-11-22 17:09 | wheee[未注册用户]
前一段时间写了一个界面已经上4K行了,看到那代码我就发昏!
但是我没办法,设计部过来的东西不合理也是合理的!

  回复  引用    
2008-11-22 19:33 | 专用马甲[未注册用户]
有界面活的时候 那些绑定事件的确很恼火
于是mvc之, 清爽了不少

  回复  引用    
2008-11-23 10:01 | 金色海洋(jyk)      
我一天也写不了几行的代码,一般都是在写视图(数据库里的视图)。
  回复  引用  查看    
2008-11-23 10:42 | 空明流转的马甲[未注册用户]
有关于持久化和业务类型的问题,
对于很多功能如表单登记一类的活而言,
是完全可以把Business放在一起的,
这个时侯持久化其实就是你的Business。

其它的情况我都是页面一部分,
Business + 持久化一个部分,
一旦发现持久化部分过于复杂,再重构分离。
Commons也是,在开发的时候很多设计还没成型,
粗略的就想个名字本身是和Commons同样荒唐的行为。
做着做着,你发现了有很多部分可以重新组织的时候再来重组也来得及。

  回复  引用    
2009-05-20 00:05 | lptstr[未注册用户]
总结得很精彩。

还有在进行格式转换的地方也经常会违反SRP。

  回复  引用    
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1338907




相关文章:

相关链接: