当前位置: 首页 > news >正文

python怎么写可读性好的面向过程的长篇代码?

 最近接受老代码,mmp的,说是重新运行运行起来,那还不如重写呢,因为有很多毛病,不能直接运行,pep8就不用妄想奢望了,还有包括语法错误问题和内存严重泄露的问题(运行几分钟后python.exe进程达到2GB直至把电脑卡死),而且很难看懂代码,修改也不方便。

 

1、笼统的说,大部分人都认为面向对象适合大项目,小项目使用面向过程好,那么这到底是为什么呢,不知道大家有没有思考和体会和实践对比过,还是对此完全没有任何心得体会只是跟风这麽认为?

 

2、python是很精简的,300行抵得上java500行。

当一个300行的面向过程的,写了十几个函数,一环套一环的return和传参,看得就会脑袋发烫了,除了自己能看懂别人是看不懂的,因为python很多人都没写参数的意义注释和类型注释(这两者缺一不可,java只需要有参数含义注释就行了,因为参数前缀已经是强制声明类型了,不需要再写类型注释),所以这种代码函数到底是干什么的,还需要跳转到调用它的地方去,频繁的跳转效率很低,尤其是完成长流程的项目,一环套一环的return和传参更是如此。

 

3、在单文件或者顶层运行文件时候,写一个完成一个完整任务流程的面向过程的300行的代码,应该使用下面这种思维方式,才能保证可读性好:

少return少传参,多写全局变量,因为 很多函数都操作相同的东西,操作这个东西后传递给下一个函数,再传给下下一个函数。如果写成全局变量就能很直观看到他们三个是操作同一个东西了,如果是写成传参,并不能直观感受到。一个300行的代码,如果一直这么return和传参,读者脑袋就会伤不起了,效率就会下降很多。因为你写的不需要被import作为基础组件,也不需要多实例,那应该尽量多用全局变量。最好是多用三方包 多用三方框架,少自己写得一坨一坨的,不然接盘侠是肯定 看不懂的,因为框架规定了你怎么写,有约定俗成的在什么文件写什么代码,接盘者不需要去看你写的思路,因为大家对框架或者三方包都有共识。

 

因为看到一个代码写了3个函数里面的传参分别叫city  item region,但其实是操作同一个东西,写作者既不写参数类型注释又不写参数意义注释,在不同函数中起的名字又各种各样,然后不能表达出参数是一个字典,city 和region意思明显是一个字符串类似 北京 上海什么的,却让它表达的是一个城市字典信息,他要表达的是{'name':'北京','id':123},但用这个名字真的是日了狗,想搞清楚它必须一步一步的从函数调用处去分析它,调用不同函数的地方间隔代码行数太长,上一秒搞清楚了下一秒就忘了。所以一定要把名字起好,然后多写全局变量,例如本例中把这个城市信息字典写成全局变量,。不同函数操作的结果不需要return,需要return的直接修改全局变量,这三个函数不需要那么多次重复传参,因为函数可以直接引用全局变量。因为操作全局变量就很容易直观的看到函数到底在操作什么,如果使用函数传参,根本就不知道他要操作什么东西,必须跑到调用函数的地方去看(如果使用面向对象那就是操作实例属性了和这种方式的操作全局变量的思维差不多,但能很好地克服了既不用全局变量,也不需要频繁传参和return)。

 

 3.1  关于多写全局变量 少return 少传参,说的是在单文件或者顶层运行文件时候,每个函数完成项目流程中的一个节点功能,是一环套一环的,这种模块也不需要被别的地方import。所以我并没有说一切函数都要按这么做,大部分作为被import的东西,都是完成一个很孤立的功能,比如怎么处理一个字符串,去掉它里面的什么字母,这个功能是孤立的,与其他流程并没有什么卵的关系,这种情况不适合少传参 少return,那肯定是需要把字符串传给函数,然后return消除了指定字符后的新字符串更合适了。

 

5、除了上面这个方式外,就是不要使用面向过程了,要学习面向对象和23种设计模式。

在学校学习嵌入式一期时候做过五子棋,是使用c语言面向过程做的,当时写了1300多行来完成这个项目,收尾时候老师说二期后学习c++后要用面向对象会更简单,但当时并没有把五子棋作为二期的任务,而是做音乐播放器移植到arm板。

 

关于面向过程和面向对象解决五子棋的流程:

 

例如五子棋,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,
2、黑子先走,
3、绘制画面,
4、判断输赢,
5、轮到白子,
6、绘制画面,
7、判断输赢,
8、返回步骤2,
9、输出最后结果。

   把上面每个步骤用分别的函数来实现,问题就解决了。
  
   而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:

1、黑白双方,这两方的行为是一模一样的,
2、棋盘系统,负责绘制画面,
3、规则系统,负责判定诸如犯规、输赢等。

   第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

   可 以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本, 因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

   功 能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤 之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用 顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。

 

看见,即使不使用多态和继承,使用面向对象的思维来写五子棋,优势也是很巨大的。

相关文章:

  • 第一节:.Net版基于WebSocket的聊天室样例
  • Leetcode 28 实现strStr()
  • 小程序开发之改变data中数组或对象的某一属性值
  • 跟鱼八学NDK开发 基于Cmake(三) 使用含有第三方动态库的自己编译好的.so
  • MVC-Model数据注解(三)-Remote验证的一个注意事项
  • Go语言编写的web管理平台生成框架
  • 如何对高管实施股权激励?
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • PhotoShop制作gif动态广告效果示例
  • 怎样轻松将SD卡照片数据恢复
  • [总结型] HADOOP HDFS BALANCER介绍及经验总结
  • 销售财务出身的创业者,占了95%,未来却可能被他打败
  • centos搭建FTP文件服务
  • Odoo 自定义Widgets 基础教程(章节1)
  • 改maven下创建的动态网站依赖的jre版本
  • 【翻译】babel对TC39装饰器草案的实现
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Codepen 每日精选(2018-3-25)
  • C语言笔记(第一章:C语言编程)
  • Fabric架构演变之路
  • java2019面试题北京
  • React-redux的原理以及使用
  • React的组件模式
  • Spring Cloud Feign的两种使用姿势
  • vue学习系列(二)vue-cli
  • 大型网站性能监测、分析与优化常见问题QA
  • 分布式事物理论与实践
  • 关于springcloud Gateway中的限流
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 记一次和乔布斯合作最难忘的经历
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理解在java “”i=i++;”所发生的事情
  • 爬虫模拟登陆 SegmentFault
  • 入口文件开始,分析Vue源码实现
  • 事件委托的小应用
  • 手写一个CommonJS打包工具(一)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 从如何停掉 Promise 链说起
  • ​ssh免密码登录设置及问题总结
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (12)Linux 常见的三种进程状态
  • (C语言)fgets与fputs函数详解
  • (LeetCode C++)盛最多水的容器
  • (多级缓存)多级缓存
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (五)MySQL的备份及恢复
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Core和.Net Standard直观理解
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET企业级应用架构设计系列之开场白
  • :O)修改linux硬件时间