读后感

软件的设计是一个“险恶”的问题,所谓“险恶”就是只有通过了解决或解决部分才能被证明的问题,这是软件设计的一大挑战。同时,软件设计无法判断设计到何种程度才是“足够好”了。软件设计是一个有诸多限制,并且需要在这些限制中做出选择与平衡,所以没有好的设计或不好的设计,只有适合的设计。

       满足同一个需求,不同的人,会设计出完全不同的设计,所以,设计又具有不确定性。

      软件设计有一些理想的设计特征,例如:最小复杂度、易于维护、松散耦合、可扩展性、可重用性、可移植性、精简性、层次性以及使用标准技术等,但是几乎没有软件设计是同时满足上述理想的设计特征的。因为有些特性是相互抵触的,这也是设计的挑战所在。所以,好的设计是在这些相互竞争的目标中根据自身的环境、情况,做出一套最好的折中方案。

       同样,软件设计是分层次性的。软件设计从高到低,大概有如下几个层次:软件系统、分解为子系统或包、分解为类、分解成子程序、子程序内部设计。

       由于软件设计是不确定性的,因此,灵活熟练的运用一组有效的启发性(试探性)方法,便成了软件设计的核心工作。这些启发性的设计方法包括:

      1、找出现实世界中的对象

      此方法的要点在于辨识现实世界中的对象。该方法包括如下的一下设计步骤:

      辨识对象及其属性

      定义可对对象进行的操作

      确定每个对象可对其他对象进行的操作

      确定对象的哪些部分对其他对象可见

      定义每个对象的接口

      以上步骤并无特定的顺序来完成,他们经常反复的被执行。经过上述步骤之后,会得到一个高层次的、面向对象的系统组织结构,然后可以通过两种方式的迭代:在高层次上面进行迭代,以便更好的组织类的结构;或者在每个已经定义好的类上进行迭代,把每个类的设计细化。

     2、形成一致的抽象

     抽象是一种能让你在关注某一个概念的同时可以放心的忽略其中一些细节的能力——在不同的层次处理不同的细节。

    基类也是一种抽象,它能够让你集中精力关注一组派生类所具有的共同特性,并在基类的层次上忽略各个具体派生类的细节。一个好的接口也是一种抽象,它可以让你关注接口本身或不是类的内部工作方式。一个设计良好的子程序接口也是在较低的层次上提供了同样的好处,而设计良好的包和子系统接口则在较高的层次提供了同样的好处。

     优秀的程序员会在子程序接口的层次上、类接口的层次上以及包接口的层次上进行抽象,这样才能更快、更稳妥的进行开发。

      3、封装实现细节

     封装填补了抽象留下的空白。抽象是说:“可以让你在高层次的细节上来看待一个对象。”而封装是说:“除此之外,你不能看到对象的任何其他细节层次”。封装帮助你管理复杂度的方法是不让你看到那些复杂度。

     4、当继承能简化设计时就使用继承

     继承的好处在于它能很好的辅佐抽象的概念。

     编程语言能够支持在运行期才能确定所针对的对象的实际类型的操作,这种能力叫“多态”。

     继承是面向对象编程中最强大的工具之一。如果使用得当,它能带来极大的益处,然后如果使用过不当,它也会带来极大的弊端

     5、信息隐藏

     信息隐藏是结构化程序设计与面向对象程序设计的基础之一。结构化程序设计里面的“黑盒子”概念就是来源于信息隐藏。在面向对象程序设计中,它又引出了封装和模块化的概念,并与抽象的概念紧密相关。信息隐藏是软件开发领域一个开拓性的概念。

      当信息被隐藏后,每个类(或者包和子程序)都代表了对其他类的保密的设计或构建决策。在这里,类的职责就是将信息隐藏起来,并保护自己的隐私权。对系统的非重大改动可能会影响到某几个类中的子程序,但它们不应该波及到类接口的外面。

     在设计一个类的时候,一项关键的决策就是确定类的那些特性应该对外可见,而那些特性应该隐藏起来。类接口的设计和其他的设计一样,是一个迭代的过程,如果第一次没有得到合适的接口,就多试几次,直到设计稳定下来,如果设计仍然不稳定,需要另外寻找一种方法再试。

posted @ 2021-09-30 23:50  橙大力  阅读(57)  评论(0)    收藏  举报