[从设计到架构]第三回:设计的分寸

《你必须知道的.NET》支持网站 | Anytao技术博客 

[从设计到架构]第三回:设计的分寸

发布日期:2008.3.19 作者:Anytao
© 2008 Anytao.com ,原创作品,转贴请注明作者和出处。


1 引言

话书两回[第一回:设计,应该多一点]和[第二回:对象的旅行---对象和人,两个世界,一样情怀],作者欲言又止,吊起胃口又玩起了捉迷藏。挑起设计与架构之话题,谁料半道杀出程咬金[《你必须知道的.NET》],招致[从设计到架构系列]的中道搁浅。不过,搁浅不代表停止,中道不意味绊倒,而是期待更多。以设计为话题来把玩,对任何人来说都有点沉甸甸的分量,所以限于作者的一点点花拳绣腿,只能说点到一切玄机的皮毛。而更多的期待,则是抛出问题和一点浅见,迎来无数的砖头,由更多的大牛敲打、点缀、重构,形成一个真正称得上设计的架构。

Anytao公告Zhuangbility
对设计来说,或许永远没有唯一的答案,你只能无限的接近最好。

2 回顾

时隔已久,有必要将本系列前面的内容做个简单的回顾。在[第一回:设计,应该多一点]里首次提出了对于设计的理解,提倡更多的人来了解技术世界中最具吸引力和持久力的元素,高举设计与架构的大旗来充当门面,小试牛刀;而在[第二回:对象的旅行---对象和人,两个世界,一样情怀]中,通过一个有趣的对比,将对象的体验和人生的品味凑到一起进行“非议”,可以说来了一次非正常的对象旅行。

小试之后,希望能够专注更多的专题,一切就从本文开始啦:-),那么首先应该关注的是:设计,究竟从何而来? 

3 设计从由何而来?
设计,从何而来?是需求。是重构。
设计原则是系统设计的灵魂,而设计模式是系统开发的模板,灵活自如的应用才是设计以不变应万变的准则。例如,假如实现一个用户注册的方法,你首先想到的可能是:

        //初次设计
        public void RegistryUser(string name, Int32 age)
        {
        }

在一定的需求条件下,这个方法已经能够经受系统的考验,安全而平稳的向数据库中不断插入新的用户信息。然而,当需求发生变化时,你可能不得不对此做出调整,而我们就将调整称为重构。但是重构远不是扩充,而是设计。例如,现在的注册项发生了变化,还需要同时注册性别、电话,没有设计的调整,就被实现为:

        //需求变更
        public void RegistryUser(string name, Int32 age, bool sex, Int32 phone)
        {
        }

通过重载方式,一定程度上解决了这一问题,然而这种不能称为重构的调整,至少存在以下的弊端:

  • 有新增的注册信息时,还要通过不断的重载RegistryUser方法来实现更多信息的扩展。
  • 方法RegistryUser的参数列表实在太长了,这不是优雅的代码实现。
  • 需要修改系统中相关的方法调用来适应新的重载方法。

僵化的调整失去了设计灵魂的灵活性,没有思考的程序只能使程序的扩展和维护变得不可收拾,其实对于上述问题,只需要进行简单的重构,就可轻松避免上述3个弊端,实现更加柔性的系统。例如,我们的重构如下:

    public class UserInfo
    {

       
public string Name { get; set; }
       
public Int32 Age { get; set; }
       
public bool Sex { get; set; }
    }

通过将用户信息封装为一个类,实现了更加简单的参数列表,同时其带来的好处还远不止避免了3个缺陷,而且能带来对用户信息的封装,实现更可靠的信息隐藏和暴露:

  • 可以通过字段和属性封装,实现对于成员的只读、可读可写权限的控制。.NET 3.0的自动属性为属性封装实现了更为优雅的语法游戏,这些特性让C#成为更具有吸引力的高级语言:
        //定义可读可写属性
        public string Mobile { get; set; }

       
//定义只读属性
        public string Password { get; private set; }
  • 实现一定的逻辑封装,例如对于电子邮件,可以检查其合法性:

        private string email;

       
public string Email
        {
           
get { return email; }
           
set
            {
               
//string emailReg = @"\w+([-+.']\w+)*@(?!163\.)((\w+([-.]\w+)*))\.\w+([-.]\w+)*";

               
string strReg = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";

               
if (Regex.IsMatch(value, strReg))
                {
                    email
= value;
                }
               
else
                {
                   
throw new InvalidCastException("No legal Email Address.");
                }

            }
        }

那么,设计是如何实现和建立的,答案就是面向对象。正如上述演化过程一样,我们应用了面向对象中的封装要素,完成了更加柔性的设计。在《你必须知道的.NET》的第1.3节“封装的秘密”中,就对封装展开了详细的探讨,基于实例的应用和对.NET实现本质的分析,能够更加开阔我们对于面向对象基本要素的理解。这些面向对象的思想和应用,来自于实践,来自于重构。

4 从此,重构
设计是如此重要,那么我们的基本设计能力与素质又从何下手来培养呢?
最好的办法,就是请个老师。从框架中了解,从系统中实现,从书文中汲取。在我认为,设计能力的提升绝非一朝一夕之功,这个行业中的设计大师,往往必须具备多年的修行方可称之为“架构师”。作为涉世未深的我们,该从何下手,下面仅仅是一点浅见之论:

在设计的广义概念里,几个必须的概念,是应该首先被了解和认知的,以排名不分先后的原则罗列,它们大概包括:
  • 面向对象(Object-Oriented),关于面向对象没有必要重复嚼舌了,《你必须知道的.NET》一书的第一章“OO大智慧”中对.NET的面向对象进行了有别于其他专著的介绍方式,除了以实例突出面向对象之思想大成,还以浓墨铺陈了.NET是如何在底层技术上来实现继承、多态和接口映射等机制,从而可以更加有效和深刻的把握面向对象的精髓。
  • 面向服务(Service Oriented),SO至少是个时髦的话题,WCF伴着.NET 3.5的发布,一个一统江湖的面向服务的基础架构横空出世。可以想象的是,未来的分布式系统架构将变得更加柔性和统一,简单而有效,我们也期望在本系列的随后部分进行探讨。
  • 架构(Architecture),我理解的架构就是应用系统构建所需的基础设施。应用程序是变化万千的,而基础架构是相对稳定。这正如我们基于.NET Framework来实现数以万计的.NET应用:Windows Form Application、Web Form Application、XML Web Service等等,都体现了架构和应用的关系。.NET Framework本身就是一个基础性架构,而经典的MFC也是一个基础性架构。对于架构的探索和实践,应该是每个意图提高设计能力的人的必经之路。选择一个或几个典型的架构进行梳理与实践,才能有效的了解软件世界的庞大体系是如何和谐统一的运作。从经典框架设计中,寻找灵感,锻炼体验,而本系列的未来章节将为大家带来基于Petshop三层架构的实践体验,通过真正的需求、设计、开发和测试,完成一次有意义的项目实践旅程,而在这个旅程中,作者和读者共同收获对于设计与架构,从概念到实践,从表面到思想的体验。
  • 设计原则(Design Principles),是面向对象设计程序开发的思想大成,了解面向对象,深入设计模式,则有必要深入设计原则之精髓。可以不了解全部的设计模式,但必须深入每一个设计原则。一个是内功,一个是招式,设计的第一项修炼就从内功开始。《你必须知道的.NET》第二章“OO大原则”对5大设计原则进行了一些以例说理式的实际探讨和分析,几个看似简单的设计原则:单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、Liskov替换原则等,5个原则贯彻了一个简单的思想“面向抽象,松散耦合”。
  • 设计模式(Design Pattern),23个设计模式,23个经典智慧,了解和掌握几个重要的设计模式,是修炼面向对象招式的必经之路。无论如何,做为设计者你应该在自己心中知道什么是Abstract Factory、Iterator、Singleton、Adapter、Decorator、Observer、Façade、Template、Command,早在一篇以推荐为性质的[必须知道的设计模式]中有过自己借鉴的历史记录。在博客园中,有着以设计模式为话题的光荣传统,作为学习者我强烈的推荐TerryLeeDesign Pattern系列和吕震宇设计模式系列。

《你必须知道的.NET》的第一部分,以“OO大智慧”和“OO大原则”两章的篇幅,来分别讲述关于面向对象的实现本质和思想理念,以面向对象技术在.NET中的应用为起点,熟悉和领略面向对象的智慧与原则,修炼深入.NET技术的基本功,为深入理解.NET的程序设计打好必备的基础。

从某种意义上来说,本系列正是通过一个典型简单项目的实践来梳理这些基本架构设计的基本概念,以例说理。在一个项目的实现过程中,逐渐的了解什么是对象、什么是对抽象编程、设计模式是如何应用在实际的系统架构、设计原则到底是什么秘密武器,而重要的是完成一个项目,对于更多人来说是认识一种软件开发的科学流程。这种体验,才是难能可贵的经验。一个在简历中轻描淡写的“10年软件设计经验”,并非是所有软件人都能修炼成的真功夫,这里没有任何虚情假意可言。

所以,从本文开始,从架构到设计系列将开始一段闯荡江湖的旅程,借助博客园的翅膀飞向天空,重要的是希望更多的朋友能在这里进行探讨和交流,以一个项目的运作为基础来探讨一个个设计与架构中的问题,以期收获更多的共识与争论。 

5 结论:其实每个人都是食神

我很喜欢看周星驰的电影,[食神]中的周星驰在大彻大悟之后说了句:其实每个人都是食神,引来他人不屑。不过,现实的情况却真是如此,每个人都是食神,或者说每个人都可以是食神。软件设计与架构,同样如此,不经一番寒彻骨,哪得梅花扑鼻香。

Anytao公告Zhuangbility
其实每个人都是食神,其实每个人都是设计师。关键在于掌勺的你,是否能让做饭的家伙油光锃亮。
其实,在设计的领域,你大可不必为看似高深的框架吓倒,也不必为没有经验而怯场。在每个人的代码生涯中,你随时可以是食神,就像上例中通过简单Extract Class重构方法,你就可以体验一次设计师化腐朽为神奇的力量。所以,设计无处不在,架构如影随形。而如何将三层架构、Abstract Factory、Extract Method、MVC、OCP这一竿子打不着的概念有机的、科学的、合理的体现在活生生的软件系统中,是一种功力和经验的体现。
作为学习者,我们还不具备在宏观上把握如何将上述模糊的概念进行统筹和消化,所以作为预备设计师,首先要做好的工作就是先逐个认识什么是:三层架构、Abstract Factory、Extract Method、MVC、OCP这些概念,有了基本功之后再看着唱本骑驴走远。
 
系列预告
在2008,我将集中全力对[从架构到设计]系列进行完善,从下一篇开始,我们将以实际的项目开发流程为主线,从需求开始介绍,到设计分析,再到实践操作,完成一次设计开发的全程之旅,其中重点的应用Petshop框架给我们的分层架构概念为核心,通过不断的设计和重构来完成一个系统的体验。
而在这个过程中,我们会逐一分享关于设计、面向对象、设计原则、设计模式等基本概念的探讨,从而能够有效的进行循序渐进的认识旅程。
限于作者能力有限,诸多不足之处还望朋友们尽情指正,对我来说伴着从设计到架构系列,我将继续分享自己在技术之路上的体验和快乐。
 

© 2008 Anytao.com 原创作品,转贴请注明作者和出处,留此信息。

本文以“现状”提供且没有任何担保,同时也没有授予任何权利。
This posting is provided "AS IS" with no warranties, and confers no rights.

posted @ 2008-03-19 00:51 Anytao 阅读(4975) 评论(39)  编辑 收藏 所属分类: F Design&PatternA DotNet

  回复  引用  查看    
#1楼 [楼主]2008-03-19 00:56 | Anytao      
提交文章摘要部分的Logo显示总是有问题,最后只好不显示图片,给首页显示造成暂时的问题,在此谢罪。改天请教杨正祎喽:-)
看来《CSS禅意花园》买对了。
  回复  引用  查看    
#2楼 2008-03-19 09:03 | jillzhang      
这个系列非常好,建议建一个系统架构的团队,我第一个报名,呵呵
  回复  引用  查看    
#3楼 2008-03-19 09:03 | Justin      
顶一下先!
嘿,你的blog页面也出了点问题:下面出水平滚动条了,是被闪存那个网址拉大的(目前英文不能自动换行)
  回复  引用  查看    
#4楼 2008-03-19 09:04 | jisen      
long time no see。极度关注......
  回复  引用  查看    
#5楼 2008-03-19 09:12 | Justin      
分析-What to do
设计-How to do
实现-Just do it,haha

推荐自己以前总结的那点东西:http://www.cnblogs.com/justinw/archive/2006/11/28/574573.html

其实最最根本的思想原则就是:找到变化,封装、隔离变化!
  回复  引用  查看    
#6楼 [楼主]2008-03-19 09:20 | Anytao      
@jillzhang
呵呵,可以考虑,要不我们一起行动一下,一个人势单力薄啊:-)
  回复  引用  查看    
#7楼 [楼主]2008-03-19 09:20 | Anytao      
@Justin
?我这里显示没问题,谢谢提醒,我再发个闪存好了
  回复  引用  查看    
#8楼 [楼主]2008-03-19 09:21 | Anytao      
@jisen
呵呵,Time is too long to wait, thanks for your care
  回复  引用  查看    
#9楼 [楼主]2008-03-19 09:23 | Anytao      
@Justin
言之有理,我也就是想闭门造车,将一点点不成熟的体会拿出来凉凉,希望收获更多的指点。你那篇很早就有拜读,位列我的“大牛资源”中:-)
  回复  引用  查看    
#10楼 2008-03-19 09:43 | Dflying Chen      
firefox下面界面很乱阿……
  回复  引用  查看    
#11楼 [楼主]2008-03-19 09:52 | Anytao      
@Dflying Chen
我看看怎么回事?昨天提交摘要就有问题;-)
  回复  引用  查看    
#12楼 2008-03-19 09:58 | Mainz      
不知道文章读者是针对开发人员的还是架构师的?看起来像设计模式一样的课程,对初学者很管用,但有时候项目中实际的要求是非常苛刻的。建议楼主具体讲讲设计中如何针对代码size,性能,灵活性扩展性,维护性,兼容性等进行设计?如何平衡这些因素?
  回复  引用  查看    
#13楼 2008-03-19 10:31 | 韩现龙      
架构告急,设计告急……
幸好有涛兄的文章以滋养之……
  回复  引用  查看    
#14楼 2008-03-19 10:38 | WhyCome[at]live.cn       
很好,很好
通俗易懂
  回复  引用  查看    
#15楼 2008-03-19 10:40 | Anders Cui      
代码乱了 :)

支持社区成立架构设计小组
  回复  引用    
#16楼 2008-03-19 10:57 | imxjb [未注册用户]
博主在写作和技术方面都是高手
  回复  引用  查看    
#17楼 2008-03-19 11:07 | Sam Lin      
继续关注……,很崇拜楼主的精神和学识。
建议通过实际的项目逐步地开展出来让我们这些入门者有所体会,有所提高
再次感谢楼主,强烈支持你
  回复  引用  查看    
#18楼 [楼主]2008-03-19 12:39 | Anytao      
@Dflying Chen
用FF看了看,果然很乱,很生气,有时间再改吧,昨天晚上提交折腾了一个小时:-),所以最近在看你的《CSS禅意花园》,恶补一下:-)
  回复  引用  查看    
#19楼 [楼主]2008-03-19 12:41 | Anytao      
@Mainz
呵呵,其实没有什么针对性,可能更切近初学者的层次吧。我本文也是涉世不深,很多方面仍是一个学习者,所以不敢写给架构师,只希望一点感觉能对朋友们的思路有所帮助即可。
同时我也更期望能够在这方面得到更多人的参与和指点,形成一个良性的发展
  回复  引用  查看    
#20楼 [楼主]2008-03-19 12:42 | Anytao      
@韩现龙
呵呵,有架构的设计才能称得上系统,我常常有感于此,而又无能为力。希望此处的一点沟通和牢骚能够和大家有更多的互动
  回复  引用  查看    
#21楼 [楼主]2008-03-19 12:42 | Anytao      
@WhyCome[at]live.cn
继续努力:-)
  回复  引用  查看    
#22楼 [楼主]2008-03-19 12:43 | Anytao      
@Anders Cui
那你可得参与进来,希望成为共同管理员,我和JillZhang再酝酿一下
  回复  引用  查看    
#23楼 [楼主]2008-03-19 12:43 | Anytao      
@imxjb
呵呵,都谈不上,只是一点兴趣
  回复  引用  查看    
#24楼 [楼主]2008-03-19 12:47 | Anytao      
@Sam Lin
谢谢你的关注。我本来的打算正是通过一个实际的开发项目为蓝本进行一系列的设计与架构探讨,只是不知道自己能力和精力是否跟得上,不过一定努力去做。我希望慢功出细活,所以可能进度上不是很及时,还望届时海涵:-)
  回复  引用  查看    
#25楼 2008-03-19 12:48 | 怪怪      
说实话, 我倒是很想拍砖 :P,不过感觉有点无能为力。

因为凡是诸如此类的文章, 都有若干假设、基础和共识: 比如面向对象是分解和组合的良好手段等等。其实我的砖头一出,就不会是冲着某一篇文章去, 而是冲着其假设和基础去的。

话题一搞大, 就不是一朝一夕能够弄清楚的; 尤其是在现在的形势还没有发展到置疑面向对象弊端的时候(完善和补充倒有一些),时机不成熟~

所以我还是改为支持一把吧, 至少在面向对象设计这个分领域内, 我们也需要添砖加瓦 :)。

只是PetShop作为例子,我有点不太以为然; 因为PetShop本身也没脱离为了表现而选择实现方式这样的巢臼,所以容易出现疑问。
  回复  引用  查看    
#26楼 [楼主]2008-03-19 13:01 | Anytao      
@怪怪
哈哈,所言甚是。正如文中开头起题所言,那这个话题拿出来说确实冒着风险,其实我也是想有更多不同的声音来让自己的思路和想法更加充实。所以,更希望有你的排砖,因为在公司之类的场合无法听到不同的声音,大家都是点着头充愣。
欢迎支持,更受惠于排砖。
不过,作为一个系列来打算,我也没有完全清晰的思路来运作未来,以Petshop作为示例,不代表整个系列,而是其中一个我认为还不错的插曲,拿来共享。正如怪怪所言,Petshop本身有很多设计中的诟病和不足,所以拿出来说的同时我也收到更多的思路和想法。
写帖子发文章,我自己认为就是看感觉。写《你必须知道的.NET》时,我就有深刻的体会,灵感来的时候就可以文思泉涌,灵感走的时候我宁愿掀起被子大睡一觉,这是常有的事儿。所以,思考和实施这个系列的时候,我也会是这种打算,只是希望能踏踏实实做点有意思的事情:-)
怪怪的高论,希望能经常出现在anytao.cnblogs.com的留言中:-)
  回复  引用    
#27楼 2008-03-19 13:46 | diulela [未注册用户]
一直在观注楼主的文章,总算又有动作了...绝对支持
  回复  引用  查看    
#28楼 2008-03-19 16:01 | 戏水      
@anytao

《你必须知道的.NET》 已经出版了吗?上市了吗? 如饥似渴的盼望早日看到书。高兴的是 得到了赠书,不过我会推荐其他同事去买 ^_*
  回复  引用  查看    
#29楼 2008-03-19 16:49 | Anders Cui      
@Anytao
我还没有能力做管理员
怪怪应该力邀的
  回复  引用  查看    
#30楼 2008-03-19 18:36 | 金色海洋(jyk)      
今天看到了一个软件,已经用了(不断更新)十多年了,现在已经很完善了,只是显示速度有点慢,大家猜猜是用什么语言写的?

Access 2000 (可能一开始是用 Access 98 来写的吧)。

Access 数据库作为基础,加了一些窗体,就成了一个软件。是用ODBC连接远程的 Access 数据库,这样就实现了多用户同时操作同一个Access 文件。也就是 c/s 结构。

还有统计图片的功能。(这个不知道使用什么来实现的,反正都是在同一个窗体里显示出来的)。


用“古老”的语言,用“原始”的方式,也可以作很强大的软件。


可能在这里说这些有点跑题了。

  回复  引用    
#31楼 2008-03-19 21:21 | saucer [未注册用户]
也有怪怪不拍砖的时候,:-)

上面有个笔误吧,
设计原则(Design Pattern)==》Design Principles

都说PetShop烂,但能否根据这个应用的需求(或者Sun原先的需求文档)写出你认为最符合设计原理的应用呢?

另外,现在到处看见重构(refactoring)一词,总觉得与原先的定义有一定差异了
  回复  引用  查看    
#32楼 [楼主]2008-03-20 09:07 | Anytao      
@diulela
诚惶诚恐,也是个尝试,谢谢关注:-)
  回复  引用  查看    
#33楼 [楼主]2008-03-20 09:08 | Anytao      
@戏水
月底上市,谢谢你的关注和支持,给我莫大的动力。
  回复  引用  查看    
#34楼 [楼主]2008-03-20 09:09 | Anytao      
@Anders Cui
赫赫,你肯定胜任啦,这件事还要好好考虑一下,我也希望有更多的牛人参与进来,先有个想法是好的,以后团队可以在北京有线上线下的活动:-)
  回复  引用  查看    
#35楼 [楼主]2008-03-20 09:12 | Anytao      
@金色海洋(jyk)
所言甚是,我们之前做的一个系统很大的软件,后台数据库也是Access。全国有近10万的用户,虽然有一些历史原因,不过你说明的意思也是很对的。
不过,架构和设计我认为更多的还是着眼于思想,并且依托于技术,二者相辅相成:-)
  回复  引用  查看    
#36楼 [楼主]2008-03-20 09:16 | Anytao      
@saucer
谢谢指正,我会及时修改。
关于Petshop及其架构方面,其实有很多值得思考和研究的方面,任何技术/架构都是有可取之道,也同时存在不足之处。我也会尝试对需求在设计上寻求更多的解决思路,届时再听到更多的建议和指正。
谢谢你的建议:-)
  回复  引用  查看    
#37楼 [楼主]2008-03-20 09:17 | Anytao      
@saucer
关于refactoring,其实我没有局限于某个特定的概念,而是用来表达对设计不断完善和修正的过程。概念上,可能不甚严谨:-)
  回复  引用    
#38楼 2008-03-21 22:37 | ifire [未注册用户]
写的不错,就是内容稍微少了点点,也浅了一点点。呵呵。期待后续文章。

  回复  引用  查看    
#39楼 [楼主]2008-03-23 17:57 | Anytao      
@ifire
呵呵,是个起点,在内容上有些欠量,以后尽量有更多:-)

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-30 01:13 编辑过
 
另存  打印