面向过程的程序设计
概念:
核心是过程二字,过程指的是解决问题的步骤,即先干什么,再干什么... 面向过程的设计就好比精心设计好的一条流水线,是一种机械式的思维方式。
程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题。基本设计思路:
程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。
优点:
复杂的问题流程化,进而简单化。一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)
举个典型的面向过程的例子。
数据远程备份系统
- 本地数据打包
- 上传至云服务器
- 测试备份文件可用性
def cloud_upload(file):
print("\nconnecting cloud storage center...")
print("cloud storage connected.")
print("upload file...xxx..to cloud...", file)
print('close connection.....')
def data_backup(folder):
print("找到要备份的目录...", folder)
print("将备份文件打包,移至相应目录...")
return '/tmp/backup20181103.zip'
def data_backup_test():
print("\n从另外一台机器将备份文件从远程cloud center下载,看文件是否无损")
def main():
zip_file = data_backup("c:\\users\\alex\欧美100G高清无码")
cloud_upload(zip_file)
data_backup_test()
if __name__ == '__main__':
main()
缺点:
一套流水线或者流程就是用来解决一个问题,比如生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,与其相关的组件都需要修改,牵一发而动全身,扩展性极差。
比如我们修改了步骤二的函数cloud_upload的逻辑,那么依赖于步骤二结果才能正常执行的步骤三的函数data_backup_test相关的逻辑也需要修改,这就造成了连锁反应,而这一弊端会随着程序的增大而变得越发的糟糕,我们程序的维护难度将会越来越大。
import os
def data_backup(folder):
print("找到备份目录: %s" %folder)
print('正在备份......')
zip_file='/tmp/backup20181103.zip'
print('备份成功,备份文件为: %s' %zip_file)
return zip_file
def cloud_upload(file): #加上异常处理,在出现异常的情况下,没有link返回
try:
print("\nconnecting cloud storage center...")
print("cloud storage connected.")
print("upload file...%s...to cloud..." % file)
link = 'http://www.xxx.com/bak/%s' % os.path.basename(file)
return link
except Exception:
print('upload error')
finally:
print('close connection.....')
def data_backup_test(link): #加上对参数link的判断
if link:
print("\n下载文件: %s , 验证文件是否无损" %link)
else:
print('\n链接不存在')
def main():
#步骤一:本地数据打包
zip_file = data_backup("c:\\users\\alex\欧美100G高清无码")
#步骤二:上传至云服务器
link=cloud_upload(zip_file)
#步骤三:测试备份文件的可用性
data_backup_test(link)
if __name__ == '__main__':
main()
应用场景:
一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象的程序设计:
核心是对象二字,(要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。面向对象的程序设计好比如来设计西游记,如来要解决的问题是把经书传给东土大唐,如来想了想解决这个问题需要四个人:唐僧,沙和尚,猪八戒,孙悟空,每个人都有各自的特征和技能(这就是对象的概念,特征和技能分别对应对象的数据属性和方法属性),然而这并不好玩,于是如来又安排了一群妖魔鬼怪,为了防止师徒四人在取经路上被搞死,又安排了一群神仙保驾护航,这些都是对象。然后取经开始,师徒四人与妖魔鬼怪神仙交互着直到最后取得真经。如来根本不会管师徒四人按照什么流程去取),对象是特征与技能的结合体,基于面向对象设计程序就好比在创造一个世界,你就是这个世界的上帝,存在的皆为对象,不存在的也可以创造出来,与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界的模拟,是一种“上帝式”的思维方式。
优点:解决了程序的扩展性。
对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:
-
编程的复杂度远高于面向过程,不了解面向对象而立即上手基于它设计程序,极容易出现过度设计的问题。一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本就不适合用面向对象去设计,面向过程反而更加适合。
-
无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法准确地预测最终结果。于是我们经常看到对战类游戏,新增一个游戏人物,在对战的过程中极容易出现阴霸的技能,一刀砍死3个人,这种情况是无法准确预知的,只有对象之间交互才能准确地知道最终的结果。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。