Lin's profileHappy life of WEI LinPhotosBlogLists Tools Help

Blog


    7/10/2008

    C# operation in visio drawing-control

    Experience:
    1. Page size default present in inch in visio's drawing-control.
    2. For compability of coding in different page size presenting mode, need convert logic point to inch or reversly. Microsoft.Office.Interop.Visio.Application.ConvertResult provide it.
    3. Get master object should use stencil document's Masters[] interface, don't use get_ItemU because sometimes failed. (Don't know why.)
    4. Page size can be modified with in sample code.
    this.current_page_.PageSheet.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowPage, (short)VisCellIndices.visPageWidth).Formula = "8"; // in inch
    this.current_page_.PageSheet.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowPage, (short)VisCellIndices.visPageHeight).Formula = "8"; // in inch
    5. Glue action can move shape automatically to the target shape.
    6. The source object's connection pointer can be found using visRowConnectionPts in shape's get_CellsSRC method's second parameter, but while it become a target object, its connection pointer just can be found using parameter visRowConnectionPts + 2. (Don't know why.)
    7. Sometimes, find the target object's connection pointer firstly just can through parameter visRowConnectionPts + 2. (Don't know why.)
    8. Glue with 2 2D shapes directly just can use static mode using connection pointer, but glue 2 2D shape with connector can use static or dynamic mode using connection pointer or section object. (Refer to sample code.)
    9. Master can be repeatly dropped on page to generates mutilple shapes.
     
    Problems:
    1. Layout is still a difficulty in coding with drawing-control.
    2. Principle of connection pointer in Shape is still a puzzle to me.
    A: Connection pointer of master can be defined with ShapeSheet, it's a window in office visio application, Accordingly the first connection pointer also can be defined, it can be referred in code using visRowConnectionPts, and the second referred using visRowConnectionPts + 1, and so on.
     
    1/22/2008

    对于软件设计的理解 - 记于儿子满两岁半

          其实自己也一直没有好好整理过思路,今天同一个朋友聊天说到这个问题,其实说来说去都是在说一个概念,终于有了点思路,觉得应该记录下来,算是一个开始的足迹吧。
          1、设计就是设计,和设计的大小无关,也和应用于的项目大小无关。
          2、设计的目的不是为了给应用的程序增加开销,增加程序的体积,而是为了提高编码的质量和复用性,当然能提高效率也体现了好设计的附加价值。
          3、每个公司每个人都有自己的设计风格,条条道路通罗马,最终的启到效果应该都是一样的。
          4、软件设计目前尚未形成体系,是个大空白,亟待知识和方法的整理归纳。
          5、软件设计知识不是为了统一设计方法,更不是为了禁锢思路,举个例子来说吧:
                    我喜欢开始时不断去做碗,不断做,到最后我知道这种碗最结实,也最受欢迎后,我再生产个模具出来;
                    从这个例子来说,软件设计知识是:并不是告诉你以后碗该怎么做或你就按这么做就行了,不是这样的,而是告诉你为什么这样做行,那样做不行,得说出个道理来。
          6、知识和方法是给大多数人学习的,对于聪明人来说不是不讲方法,而是这些方法他已经通过其他途径学会了。
          7、总而言之,软件设计知识是让你能够以一种科学的方法去设计软件,而不是告诉你应该设计成什么样,提高了设计的成功率而已。
    9/26/2007

    高效异步IO的设计开发(3)

          异步I/O中的Edge-Triggered和Level-Triggered是非常重要的概念;Edge-Triggered字面上理解就是指“边界触发”,说的是当状态变化的时候触发,以后如果状态一直没有变化或没有重新要求系统给出通知,将不再通知应用程序;Level-Triggered是指“状态触发”,说的是在某种状态下触发,如果一直在这种状态下就一直触发。两种触发方式各有用途,应根据不同的应用采用不同的触发方式。select一般默认采用的是Level-Triggered,而EPoll既可以采用Edge-Triggered,也可以采用Level-Triggered,默认是Level-Triggered,而MS的CPIO按这种定义来说应该属于Edge-Triggered。对于已经封装好的异步I/O架构来说,具体采用哪种方式其实无伤大雅,因为无论采用哪种方式,都需要在内部都实现正确了,并且让使用者不再关心这种具体的触发方式为好。
    void EPollReactor::NotifyMeWrite(SOCKET handle, SvcHandler *handler)
    {
       DIAMON_ASSERT(handle != INVALID_SOCKET);
       EPoll_Mod_Handle_Events(handle, EPOLLOUT/* | EPOLLET*/);
    }
    上述代码中,就是在每次写完数据后需要异步I/O框架再通知应用程序关于写完,其中EPoll_Mod_Handle_Events函数告诉系统给handle注册上EPOLLOUT消息,这样当handle完成写操作后,系统将通知框架写完消息,是否加上EPOLLET完全取决于框架同应用者之间的协议,其实本质上就是框架对外提供的接口和调用约定。在Diamon::ACE中,采用的是Level-Triggered方式。
    void IOCPReactor::NotifyMeWrite(SOCKET handle, SvcHandler *handler)
    {
       DIAMON_ASSERT(handle != INVALID_SOCKET);
       IOCPSvcHandler *iocphandler = (IOCPSvcHandler *)handler;
       iocphandler->event_ &= (~IOCP_EVENT_READ);
       iocphandler->event_ |= IOCP_EVENT_WRITE;
    }
    对比一下,CPIO中的NotifyMeWrite做的不是通知系统,而是告诉异步I/O框架自己接下来应该处理写事件了,而对系统的触发工作完全是交给WSAWrite...之类的函数来完成的。想想啊,每次调用WSAWrite...不正是对系统说,我给这个handle注册一下写事件啊,下次还通知我,你可以试试不调用WSAWrite...了,下次肯定收不到写通知了。
    8/14/2007

    高效异步IO的设计开发(2)

          说到select重复的维护句柄的开销,其实也是有解决方法的,好的解决方法效率会提高很多,但是重复工作还是要做的,比如当select返回结果是0,或者当能确定不需要增减IO句柄时,我们可以简单的把原先保存的FD_SET副本重新写入,这样可以减少重新生成FD_SET的开销,内存复制效率显然高于队列的一次次遍历,这是显而易见的。当然对于大并发量的IO操作来说,这种方法对于效率的提高也是很有限的,说到底即使采用异步IO效率也并不一定就高,还要取决于很多其它因素。其中很重要一点大家别忘记把侦听端口设置成异步的,虽然不设置的话程序运行后好像没有什么不正常,但光从表面上就可以看到CPU占用率明显偏高,当然还会有一些其它问题产生,这个问题比较复杂,这里不作描述了。并发操作的效率还取决于“连接-->断开->连接”的频度,频繁的“连接-->断开->连接”也会产生不小的开销,当然这些开销和之后要讲的真正实现业务操作需要的开销比起来其实要小得多,而且也是有很多方法可以规避的,对于采用不同的异步IO实现方法也是很不同的,效率差异会非常大。对我们来说,归根结底是根据不同的模型采用不同的方法来提高效率,作为一个异步IO的前端“发生器”应该尽可能避免在自己的工作上消耗过多的CPU资源,而是尽可能把CPU资源让给具体的业务实现者。 
    8/3/2007

    高效异步IO的设计开发

          高效异步IO,按我理解起来应该不光要达到程序运行时的高效,当然也要达到开发效率的高效,其中还包括很重要一点就是质量,对于很多从未做过异步IO的人来说,初次尝试异步IO肯定会碰到不少困难,因为不光是对编程能力的考验,也需要开发者对操作系统的IO操作有相当的了解,包括他的机制和部分原理。异步IO中也有高效低效之分,但主要还是要看具体的应用到底需要什么样机制。比如大家熟知的select就是个非常通用且跨平台的方法,由于select中需要把大量的时间花在维护IO句柄上,导致其效率大打折扣,一般来说,对于小并发的异步IO操作,比如普通的客户端或者是小并发量的服务器,它的效率可能也足够了。关于select的效率问题其实从各平台上对于FD_SETSIZE的定义就能看出一些来,在windows平台上,FD_SETSIZE是64,在Linux平台上是1024,也就是说,对于平台提供商来说也不指望他们提供的select能给你多大的并发吞吐能力,但由于select的简单和普及,其应用面还是很广,很多时候确实也不需要太多的并发量。其实说到高效异步IO的开发,我们也说了,不光是考虑到程序运行时的效率,还要考虑开发的效率和软件的质量,说到这里,其实select这么个简单的机制有时候用起来也不那么简单,而且还会出很多错误。
    9/30/2006

    关于程序库,写在国庆前夕

          有关程序库的名称其实是很多的,什么代码库、复用库、组件(库)、共享库、...,凡是你觉得合适的名字都可以用。从最早开始写程序漫无目的几乎是胡乱涂鸦,到后来形成一些意识觉得需要让代码能够重复使用,再到后来可以单独写程序库并可被很多项目使用,这是个循序渐进的过程,很多时候会觉得自己的知识不够用,有时候也会觉得自己的想法不切实际,实用轻盈的程序库其实更容易被接受和重复使用,但是过于轻盈的程序库功能可能会很不够用,繁重复杂的程序库使得学习成本增高,使得项目开发人员的技术要求提高,同时导致了繁重的构建过程,这又导致了项目不愿意使用程序库了。
          程序库工作的重要性在于2点:收集和组织。灵感是随时会产生的,每个人都会写出优秀的代码,如果单纯的靠冥思苦想的写程序库,那一方面你怎么会知道有那么多需求,另一方面你哪有那么多测试时间,如何保证程序库的质量呢,因此收集优秀有实用功能,能解决实际需求的代码是必须的。有了代码,如果无机的堆在一起,那对使用者不尊重啥的且不说,你又怎么能把这些代码堆得起来呢,所以对功能作认真的分析,将其进行归类,然后组织成一套程序库,从逻辑上讲,减少了程序库对外部的耦合,也增强了程序库的内聚,另外对使用者来说逻辑关系比较清晰,更便于使用和记忆。
          其实程序库的开发是一种知识积累的过程,也是一个生产的过程,缺少必要的规划要么让程序库显得繁赖拖沓,难以学习和使用,要么使程序库淡薄无力。在此我向大家推荐Diamon,目前支持C/C++语言,需要的话可以给我留言。
    9/1/2006

    分析还是设计,普遍性原则吗?

          好久没写关于这方面的文章了,今天看到设计模式的经典著作,觉得忽然又想起了什么,所以写出来同大家分享一下,其实这些想法在我心里很早就有了,一直没写下来。对于面向对象思想的应用,我个人更倾向于不但要重视设计,更要重视分析,这也正是我在同别人交流时总说“我把面向对象思想已经上升到了哲学的高度”的原因,关于为啥这么做,其实原因很简单:要深刻理解一件事物并不容易。可以这么说面向对象思想从哲学高度来说更像是一套观察、分析、描述事物的方法。
          通常我们接触到一个东西时,常常喜欢类比,比如看到Pocket-PC,我们会把它和手机电脑做比较,找出它们之间的异同点,这样做能够加速我们对这个东西的了解,这是一个很形象的方法,对很多人都很管用。这里面也反映出一点,我们更容易接受或理解同以前接触过的东西更加类似的东西。计算机程序对我们来说其实是非常抽象的,所以我们刚开始写程序时也常常会有在纸上描画简单设计的习惯,随着工作经验的增加,这种习惯会越来越强烈,而不同的是我们设计的技能提高了。既然我们对身边的东西比较熟悉了解,如果能应用已有的经验去认识新事物,显然会使我们加速熟悉和了解新事物的特征,当然有时候这也是会有负面效应的,比如过多的依赖经验,会使我们的思维趋于定势,缺乏创造能力(不过这不是我这里所要说的,呵呵)。如果我们把对事物的熟悉和了解的过程称为分析,那么显然分析过程中很多方法也是来自于类比,用直观熟悉的事物来类比或表达我们所要描述的分析的“对象”(这个对象不是面向对象的对象),不论对自己还是对别人都会更加容易理解,省去了很多解释这个到底是什么的麻烦,同时也更容易进一步类比去挖掘该事物更深层次的内容。
          分析是一切的开始,需要循序渐进,不断深入。如果说设计是对开发内容的自然语言的描述,那么分析就是对为什么会得到某种设计的一个详尽的解释。就像我们在开始做一件事情之前需要好好思考一下该怎么把这件事做好,我们总是力图去发现事物的本质,而且我们总是相信(实际上经验也是这么告诉我们的)深入分析会带来好的结果。其实一件看似简单的东西往往并不像我们表面上看到的那样,其内部构造也是非常复杂的,由于“视力”的局限性,我们通常只能看到暴露给我们的外表,如果要看到内在,必须把外表“剥去”,其实这个过程是长时间的。横看成林侧成峰,随着时间的推移和经验的增长,我们会发现原先看到的是假的,这时候我们至少得到了关于这件事物的两个理解,不要急于抛弃任何一种理解,通过对比,我们的理解才会更加深入。这个过程往往不是第一次就能得到的,我们也常常会为了这种理解的偏差付出代价,不过幸好这还是可以解决的(可以通过增加更宽泛的设计来解决,不过这里不讨论)。千万不要因为第一次分析可能会错误就拒绝分析,可以肯定地是分析带给我们的好处远比没有它所带来的更多。
          分析能够提高设计的质量。分析所处的地位在于发掘事物的本质,了解事物到底是什么,设计的地位在于描述用某种工具实现它的方法。可见设计其实是分析的结果产物。我们回忆一下会发现,有时候我们确实是直接做了设计,在没有分析的情况下完成工作的,我自己就有过这种经历,但是现在回忆起来,其实准确的说不是没有分析,而是没有把分析的结果书面化,其实我们常常是在脑海里进行分析的,这来自于我们以往的习惯,但是这种方法在软件项目上可能行不通。关于为啥要文档化,显然不是我们这里要讨论的,但我还是要简单的说一下:比如一个项目很大很复杂,你能担保所有的分析结果都在脑海里产生储存不会遗漏或遗忘吗,另外,项目的其他成员如何了解你的分析结果,你难道只能一遍一遍向小组的每个成员甚至小组外的市场测试人员重复你的理解吗。因此通常的结果是我们并不是没有分析,而是没有认识到我们经常做的事情其实就是分析,这里更重要的是提高分析的质量,效率和效果,好的(书面化)分析结果会很大程度提高设计的质量。如何提高分析的质量内容太多了,不是只字片语就能说清楚的,我也不具备这种能力,呵呵。
    4/19/2006

    The Top 18 Quotes from Web 2.0 - By Kareem Mayan

  • “创建一个成功的企业的最好办法就是帮助别人赚钱。”Topix.net的Rich Skrenta解释AOL的政策时说到
  • “我上许多的新闻网站,因为我不相信其中任何一个。”17岁的Sean这么解释他如何阅读在线新闻的。
  • “当你上了大学以后,Myspace就算不上什么了”高中毕业生18岁的Sasha说。
  • “在你发展的过程中建造,学习和犯错–你将会在做事情的过程中学到更多,而不是在你做这件事情之前。”37Signals的Jason Fried,他拥护迭代开发模式(iterative development)。
  • “在5到10年内,媒体的价值将存在于那些培养用户的公司,而不是那些控制内容的公司。”Kleiner Perkins的前任合伙人Vinod Khosla说。
  • “对我而言,透明度是一件具有竞争性的武器。”Sun微系统公司的CEO Jonathan Schwartz这么解释自己为什么写Blog。
  • “Ebay有1.5亿的用户,理想的来说,就是1.5亿个人学会了如何相信陌生人。”Ebay的创始人Pierre Omidyar认为商业能为积极的社会变革带来动力。
  • “我最喜欢Google,因为他们最干净。其他的网站则试图将你的注意力带走。去那些网站不会有任何收获。”18岁的Sasha这么解释为什么适应用户习惯比起强迫他们去适应你要来的聪明的多。
  • “我们的成功与我们的总裁们的‘好主意’一点关系没有。”Google创始人Sergey Brin更喜欢群体的智慧。
  • “我们96%的时间里不知道自己在做什么。”Flickr的创始人Stewart Butterfield认为剩下的4%足以让许多人非常快乐了。
  • “雇用律师起诉对于那些普通公司来说,比起自己创意要简单的多”前任FCC的主席Michael Powell解释为什么那些提供内容服务的公司起诉他们的顾客。
  • “我告诉我的工程师,不管你有多么聪明,在公司外有着更多比你聪明的人,所以我们需要提供给他们工具,让他们创新。”Omidyar也喜欢群体的智慧。
  • “传统上,人们认为越多越好。多的也许能行,但是它将会是痛苦、昂贵和冰冷的。看看那些一条路走到黑的人,无法与别人竞争。”Fried创造了几个新词。
  • 证明这个世界与原始的数码时代完全不同:假设你要买一个CD机,你要到哪去买?17岁的Sean困惑的说:“CD机是什么?”
  • “你给一个公司越多的钱,他们越不可能成功。”Khosla说。
  • “一般的消费者并不知道浏览器、互联网以及搜索框之间的区别。”Mozilla基金会的Mitchell Baker提供了这样的观点。
  • “我们认为任何来参加演唱会的人都是平等的,他们都参与到音乐的创作之中。”Grateful Dead乐队的Mickey Hart说道。
  • “我们成功第一的要素是运气。我们跟随着自己内心而选择了搜索,因为它既有用也有趣。”Brin这么解释如何创立Google。
  • 3/2/2006

    Microsoft Visual Studio 2005试用笔记(不断更新)

    我用的是Team Suite和Professional版的,另外两版没有用过,这里将不同的记录下来,供朋友们参考:
     
    1、第一次启动时会让你选择需要使用的界面及键盘等设置的风格,比如:类似于Visual Studio 6 - 2003、Test、Database、...,这是比较人性化的设置,我用惯了Visual Studio 2003了,当然喜欢保留原来的习惯了。
     
    2、增加了Refactor功能,但这项功能不适用于C++(我也只试了C#),虽然功能没有VS2003 + ReSharper那么丰富,也不如在Eclipse下可以通过增加插件增加C++的Refactor功能,但相比Microsoft的传统,这已经进步了不少了。
     
    3、增加代码风格的设置,但是同ReSharper相比,功能还是很少,当然对于C++就更少了,就好像故意保留C++作者的土得掉渣的风格一样。
     
    4、工具栏停靠功能的人性化,这是微软的又一项改进,从前停靠工具栏还是比较费劲的,有时候怎么也弄不好,现在当你用鼠标抓起工具栏需要重新停靠时,会显示导航图标,只需将鼠标放入导航图标既可完成停靠,这种方式可靠而方便,而且导航图标是浮动显示的,显得非常自然贴心。
     
    5、增加了类图设计功能,并且保持了类图和代码的一致,可以直观的通过图形来编码了,这个相信很多OO开发者都已经很熟悉了,不再多介绍。不过相比2003上诸多OO设计开发插件来说,好像Microsoft加入这个功能有些不乐意,不管怎么说总是一个大进步了。关于设计方面的事情如果有兴趣我们可以多多探讨。
     
    6、对以往工程的兼容性,这当然是使用过老本的Visual Studio开发过项目的最关心的问题了,可以说2005的兼容性完全没有问题,我之前用的是2003,解决方案和工程中的配置可以完整无损的转换过来。更具魅力的是2005会把之前的解决方案和工程文件作备份,防止由于各种原因又想使用老版本的问题。
     
    7、再说一下解决方案和项目文件的转换问题,如果你打定主意要用2005了,你可以不备份老的解决方案和项目文件,否则请你一定要备份一下,否则当你想转回2003时会发现已经无能为力了(当然也不是完全的,你可以重建解决方案和项目文件,这个工作项目越大越麻)。
     
    8、用VS2005编译VS2003或VS6的代码时,可能会出现warning C4996: 'xxxxxx' was declared deprecated的警告信息。这并不是错误,而是VS2005对您使用的老(标准)函数或者使用习惯的警告,原因可能是微软觉得某些老函数的使用或使用方法上不安全,同时编译器还会给出建议使用的函数或使用方法。这个错误不会导致编译失败,也不会影响目标代码的生成,但如果你不想看到这些警告可以在C/CPP文件中把此警告关闭,在源代码中加入#pragma warning(disable : 4996),当然你不愿意对每个文件都加入这句代码可以在:项目属性-->C/C++-->强制包含(Force Include)中关闭警告(这个方法我没试过)。
     
    9、VS2005中对语法的控制比VS2003要严格得多,VS2003较VS6来说较宽松,最常见的就是变量或函数类型缺失和隐式强制类型转换的问题,但是这类问题一般都比较好解决,只需进行简单的修改大部分的项目都能编译通过。从另一方面讲,严格良好的编码习惯是成功的开始,因此既然新的编译器已经给出了更加严格的控制,那么我们也有充分的理由让自己的习惯有所提升了。
     
    10、在VS2005的默认情况下,在你按下Build Solution(生成解决方案)时,已经编译通过的项目不会再重复出现,这个同VS2003相比好处在于减少了由此产生的视觉疲劳。
    6/24/2005

    面向对象设计之我见

          在面向对象设计方面我只是一只小小的菜鸟,因此没有什么勇气去谈看法或理解,更不能全释其理论和含义,本文中我只是从一个程序开发人员的角度来谈谈我眼中的面向对象设计。
          我首次接触面向对象概念之前其实已经旧闻大名,当时常听高手们所谓的眼中只有对象,多想What,少想How之类的,但是丝毫没有理解是怎么回事,但是当时确实有一些问题经常困扰自己,相信这些问题大家也会碰到,举三个例子吧:1、经常不能确定属性、方法、类的取名,随着程序的修改而经常修改;2、常常把属性或方法从一个类中转移到另一个类中,但是是否合理自己总说不清楚;3、程序写的越大思路越混乱,常常不知道该怎么继续下去。我是从C语言开始写程序的,现在啥语言都用,上述问题中的属性在C中并不存在,通常叫变量,方法叫函数,呵呵,先不管这么多了,现在这些概念在我脑子里更加“模糊”了。
          我是因为倍受这些困扰才开始学习面向对象设计的,因此在我眼里面向对象设计的学习更像是学习“把合适的代码写在合适的地方”,在高手们看来可能很奇怪,但是我的确就是这么开始的,需要说明的是引号中的那句话更代包我在面向对象的设计和编码方面的理解,这句话也是我现在同朋友们讨论问题时经常会用到的。
          看法一:当我无法确定类、属性、方法的取名时,我就觉得应该是类的抽取或对其对应的实体(为何存在的理解)存在问题。理由好像比较简单,如果我们能确定一个类是桌子,那么它就应该有X条腿,如果它是鸟,那么它就应该有翅膀一样,这些是无庸置疑的。哦,最早我就是通过这种方法确定规则的,但是随后又发现了问题,有时候我压根就搞不清楚它是不是一个桌子,其实这些问题通常不会存在,因为我们做设计的时候总是有一些依据,无论需求分析或概要设计是否清楚,那么通常总能够推断出一些想法/建议来,实在不能确定的,我宁愿暂时将之束之高阁,也绝不能随意决定它是什么,有百害而无一利。
          看法二:当两个类的定义都确定了,那么这两个类的关系也应该是确定的,问题只是实现这种关系的方法不同而已。这种不同并不是由设计工具或编程语言决定的,而是由做设计或编码的人(的想法/理解)决定的。有时候,一个方法该写在这个类还是那个类中并不重要,重要的是不要存在重复的代码,重复代码指不是指相同的方法名,而是指实现相同功能的代码重复出现。呵呵,太拗口了,举个例子吧,有一个用户类User,一个角色类Role,用户类中有一个方法可以让用户扮演一个角色ActAs(Role r),那么是否可以在Role中增加一个方法AddUser(User u),加不加都可以,不同的编程习惯和思维习惯的人考虑这类问题的方式不一样,关键是怎么来避免重复代码,如下:User.ActAs(Role r){ /*实现方式略*/ },Role.AddUser(User u){u.ActAs(this);},看起来很简单吧,这也是设计和编码不完全相同的理由之一,呵呵,其实类似的例子非常多,仔细读读自己的代码,看看会不会有类似的问题。其实造成这个问题的原因并不是程序写的好不好,即使代码重构也无法解决这些问题,我的理解写程序的人压根不清楚自己写的类到底是什么,为什么会有这些类,因此自然也就不知道这些类该做什么,会不会有其它类和它有类似的职责,导致重复代码的出现。
          看法三:这个理解其实是针对问题三的,当然造成问题三的原因还有其它问题,比如需求说明和需求分析的不明确或不完成等,但是从前两个理解中不难看出,我们在写程序时可能因为有太多的困扰(不知道在写什么、不知道以前有没有写过类似的东西)导致我们无法集中精力写完当前的类或方法。应该说我无法告诉大家如何解决这个问题,这里我只是谈一下自己的看法,当我们对一个项目中的程序感到迷惑或纳闷时,并不是因为这里面的属性、方法、类太多,而是因为我们无法理解这些属性、方法、类到底是什么,你能想象ActAs是一个为角色增加权限的方法吗,或者Role其实是用户类吗?这样混乱的名字(其实代表的是设计者或开发者的思路)不读细节代码是根本无法读懂的,刚才举的例子比较极端,实际情况下哪怕只差一个字母,也足以显示出设计者或开发者的思路是否清晰,混乱的思路怎么可能把设计/程序做大,这样最后导致的只有设计/编码的崩溃。
          以上是一个小小菜鸟发表的不知天高地厚的看法,各位高手觉得不合适的尽管批评,也非常欢迎大家通我讨论有关于面向对象分析设计或数据库设计方面的问题。

    关于面向对象设计的一些感悟

    《面向对象启示录》是一本好书,作者的功力很深厚,看这本书的时候有一种志同道合的感觉,作者把面向对象上升为一种哲学来看待,非常欣赏。我觉得作者想表达一种想法:“面向对象设计并不是靠对象来构建设计,而是通过这种方法得到较好的设计”。