软件设计原则——复习感想

        又到了一学期一度了期末了,以前期末都是紧张的复习就过去了,一个假期回来就什么都忘记了。现在必须留下点东西才行啊,所以就有了这篇文章。

体系结构设计的原则:

抽象

分而治之

封装和信息隐蔽

模块化

高内聚和低耦合

关注点分离

策略和实现的分离

接口和实现的分离


       上面是原则,现在软件设计基本遵守上面的这些原则,虽然我觉得随着时间的推移,必然会有更效率,更完美的原则出现。但是上面这些原则的确给我们编写软件带来很大的好处。


       首先,一个软件并不只是实现一个功能就满足了,软件也不是做好了就不管了,我很认同一句话:软件=程序+文档。软件必须是一个可以正常运行的程序,和介绍这个程序组成的文档。并且他人可以通过这些文档来维护软件运行。所以软件运行是动态的。也就是随着时间的推移,软件可以增加功能,可以删除功能,可以修改功能。


       在过去的几十年,软件这个东西曾经经历过很长时间的探索。开发难度一再降低,一个又一个的开发方法被发明出来,编程也变成了越来越多人掌握的一项技能。从以前的面对过程的编程变成了现在的面向对象的编程,还有面向数据流的编程,都是为了软件更加易于开发。


       人们发现,用户的需求不断的在改变,开发出来的软件很快就会过时,如果没有开发文档,以前开发的软件的代码的功能会很快忘记,读代码毕竟是没有读自然语言那么顺手的。所以人们就学会了在开发过程中编写开发文档,用来记录这个程序的开发过程,函数的主要功能。


       然后,人们发现软件功能越来越多之后,很难管理,而且因为软件的功能会很容易乱,到时后期开发会很混乱,很难添加修改删除功能,于是就把软件分成一个又一个的小软件,这就是模块化。这样做还有一个好处,能使一个大问题分解成若干个小问题,解决完这个小问题,大问题就迎刃而解了。同时,随着软件的体积的增大,编写的代码越来越重复了,有一个发现是这样的:“一个软件百分之80的功能都集中在百分之20的代码上。”所以软件冗余变成了当时大家共同面对的问题。


       随后,为了解决这个问题,软件进入了一个新的时代:面对对象编程。这个方法的好处在于:把一个程序分解成N个对象,每个对象拥有不同的方法,然后通过调用它的方法来实现不同的功能。这样如果两个模块同时需要调用一个子功能的话,并不需要在另一个模块再写一次这个功能的实现函数,只需要通过调用对象的方法即可。这可以使一个程序减少大量的代码,更加易于管理,也更加简单清楚。同时由于面对对象的封装特性,也就是把一些核心的方法隐藏起来,不让别的类调用,这样,别的类就只能调用你public的方法,增加了安全性,这样就实现了信息的隐藏。


       在那时,人们发现一个函数如果太长会变得很难读懂其中的意思,同时,一个函数如果实现太多的功能也会使它变得很难维护,所以,人们就建议,一个软件尽量只实现一个功能,尽量单纯,这样就能分而治之,每个函数都只实现它的分内的功能,查错调试什么的就显得很简单了。一旦软件有错误,即可很快的定位到错误的功能,使维护变得更简单。所以千万不要觉得软件写太多函数太麻烦,只是为了以后的简单才写那么多函数的。


       再然后,软件变得越来越大了,人们发现单独的一个软件并不能实现人们需要的所有功能,需要多个软件进行配合才行。于是就有了接口这样的东西。接口是用来帮助人们通过另外一个软件来实现自己需要的功能的东西,比如现在的12306,通过支付宝所提供的API,能提供通过支付宝付款的功能,是不是方便了很多,而设计12306的那群大神,也不用费心思去做一个完整的支付系统,只需要通过支付宝的API将付款信息发送到支付宝的API中,通过支付宝的返回值判断支付成功或者失败即可,这样就省了12306大量的开发和维护时间。现在的微信编程也是这样,通过微信给的API接口进行编程。而且,当前绝大部分软件都是借用了别的软件的API进行编程的,这已经变成了一个极其通用的方法。


       但是,接口这个东西,一旦发布就不能轻易改动,因为别人使用你的接口,你随意改动这些接口,别人又要重新改动别人的软件,这样会增加大量不必要的修改时间。所以我们必须做到接口和实现进行分离,接口就是单纯的接口,别人使用这个接口的目的是就为了实现这个接口当初所约定好的功能,一旦出现BUG,只需要修改实现的函数即可,就像上面说的分而治之一样,接口就是单纯实现接口的功能,实现函数就单纯的实现这个功能。这也就是分而治之的一个特例。


       同时,人们发现随意将一个软件分成不同的模块也是不行的,软件会显得非常混乱,所以就需要遵循一些方法,将一些逻辑上相关联的功能分在一个模块,这样基本上一个模块与另一个模块就没有什么大的联系了,如果这个模块出现问题,就能很快定位到这个模块,而且对这个模块的修改并不能影响到别的模块。所以一个模块内聚性越高,而且多个模块的联系越少(耦合越少),软件的质量也就越高。


       当前软件虽然众多,但是大多遵循几种风格,比如编译器遵循管道-过滤器风格,网络应用遵循C/S或者B/S风格,专家系统遵循数据共享(黑板)风格,如果程序员设计一个软件总是要重新设计,是不是显得太麻烦了,是不是能用一些通用的框架来帮助程序员进行简化程序的编写呢。于是人们就把这些框架独立出来,然后提供API,让程序员不必重复的写一部分代码,只需要将重点关注于软件的功能的实现即可。这样,就体现了:关注点分离 这个原则。


       其实不管怎么样,原则都是为了程序员服务的。人们总结出这么多原则,都是为了帮助程序员做出更好的程序。


       以上只是我的一点小小的见解,还有很多错误的地方,希望大神来指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值