计算机专业研究生核心能力培养——如何更好的写代码
Posted 刘炫320
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机专业研究生核心能力培养——如何更好的写代码相关的知识,希望对你有一定的参考价值。
1. 前言
编程能力作为计算机专业研究生必备的技能,是需要熟练掌握的。我仍然记得我大学数据结构老师第一堂课就告诉我们,编程能力对于程序员来说,应该像喝水吃饭一样,不需要再经过大脑思考就能够熟练的使用的技能。更多的精力应该用于思考到底要写什么,写的意义是什么。那么该如何更好的写代码呢?
2. 面向对象编程
面向对象编程不是唯一的编程思想,例如早期的面向过程的编程和后期面向函数的编程都是可以理解的。面向对象编程更加符合我们现实世界的认知规律,可以说,是将“元宇宙”思想发挥的淋漓尽致的一种体现。
随便一个学习过面向对象编程思想的学生,都知道它包含三个方面:封装、继承、多态。这里我们不对其再进行详细讲述,因为在其他地方,这3个部分讲的非常多了。但是如何应用还是需要有以下3点需要注意的:
万物皆对象
任何能够被操作的数据,都应该是一个有结构的对象。我们的编程世界越复杂,能够被操作的数据则愈加复杂,就像我们这个世界一样。简单的东西如纯水等自然不需要过多的描述,但是如汽车这种物体,如果没有结构系统,那么直接操作汽车的每一个部件来让汽车飞驰在道路上,那是难上加难。
任何动作都有主语和宾语
也就是说,任何的函数,都应该由一个对象发出,并且具备一个明确的的意义和目的,并且会作用于自身的数据或者他人的数据。
任何事物都有归属
我们在操作任何事物时,都要知道这个事物有归属的,执行这个操作只能由2个主体来进行,一个是它自己,它自己可以主动对自己进行调整和操作,另一个就是它的归属对象,拥有它的对象也可以对它进行操作。就如同,苹果可以自己变红。当被我们拿到手上后,我们可以对其进行削皮一样。
尽管我们也允许使用一些临时变量,方便我们进行记录运行过程等。但是我们不推荐大量使用临时变量,因为临时变量就像是草稿纸一样,用完了很难再去查找和定位。
3. 代码命名规范
以Python为例,推荐的一种命名规范为:
模块名:lower_with_under
类名: CapWords
方法:lower_with_under
变量名:lower_with_under
4. 代码语义化
代码语义化要求尽可能的让代码可以从字面上理解是做什么事情,就像是在阅读英语一样,而注释是用来解释为什么要做这件事的。
例如:
# 代码1
d = 5
time.sleep(d)
# 代码2
delay_second = 5
time.sleep(delay_second)
上面这个简单的例子告诉我们,如果使用代码1,其实很难知道到底是要睡多久,单位是如何,这个睡眠时间是要干什么。而使用代码2就可以解决这些困惑。
5. 代码模块化
代码模块化除了刚开始讲的面向对象编程外,在真正实现时,要注意的是一个函数只做一件事,他需要满足3个条件:
- 一页屏幕就能看完函数内容
- 只看函数名就知道函数目的
- 不要过度拆分(可以多次复用的过程才拆分)
6. 代码注释
注释方法我在其他文章中也讲过了,这里简单的提一下:
然而注释不是越多越好,对于一目了然的代码,不需要增加注释。
对于复杂的操作,应该在开始操作前,写上若干行注释。
对于不是一目了然的代码,应该在行位增加注释
写注释,是写明代码的目的,而不是具体做法(阅读代码的人比你更懂python)
下面是1个例子:
7. 示例
下面,我们用**“自己不能从别人的钱包里拿钱”**来演示以下我们日常编程中可能会犯的错误。
在实际的操作中,我们很容易编写这样的程序.
I= Human()
zhang_san=Human()
I.borrow_money(zhang_san,100)
这样看起来好像没什么问题,而且写的不错,因为语义化了整个过程,读代码如同读英语一样,即我向张三借100块。但是,接下来的实现就太吓人了,我们看看borrow_money是如何实现的。
class Human:
def __init__(self):
self.money = 1000
def borrow_money(self, human, money_num):
human.money -= money_num
self.money += self.money
这样行不行?按照真正的实现来讲,确实可以实现,并且能到到真正的效果。但是这种方式忽略了刚才讲的,任何事物都有归属,别人的钱是我们可以操作的嘛?这样编写的过程岂不是如同自己从别人的钱包里拿钱出来了?就算别人同意,也应该由别人从自己的钱包里拿钱给你,而不是我们自己去拿。
class Human:
def __init__(self):
self.money = 1000
def borrow_money(self, human, money_num):
human.lend_money(money_num)
self.money += money_num
def lend_money(self, money_num):
self.money -= money_num
这时候会问了,这不是多此一举么?还多写了这么多代码。我这只是样例,如果稍微复杂一些,就知道哪些更合适了,例如我们这样规定,问别人借钱,如果别人有那么多,就自动满足你。如果别人的钱不够,就只能借到别人剩下的所有的钱。这时候,整个借钱的过程就自然了很多,更加贴近真实的情况。
class Human:
def __init__(self):
self.money = 1000
def borrow_money(self, human, money_num):
lend_num = human.lend_money(money_num)
self.money += lend_num
def lend_money(self, money_num):
# 1. 先看看自己的钱包
if self.money >= money_num:
lend_num = money_num
else:
lend_num = self.money
# 2. 然后借给他
self.money -= lend_num
return lend_num
面向对象的编程最大的好处是什么?可以无数据、无调试编程。因为一些规则、物体都是在我们假设的世界里运行的。这就大大方便了协同编程以及造轮子。
8. 小结
本文我们从面向对象编程,代码命名规范,代码语义化,代码模块化,代码注释五个方面讲解了如何更好的写代码,并用一个示例演示现实中该如何操作。当然以上都是简单的例子,介绍的是思想,具体执行过程要“具体问题具体分析”。
参考文献:
Python代码规范:
https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/#comments
https://www.jianshu.com/p/ff6fc6a2a0d8
https://blog.csdn.net/qq_33591055/article/details/99581791
知乎-聊聊编程原则
https://zhuanlan.zhihu.com/p/46830303
代码优化技巧
https://www.cnblogs.com/dkblog/archive/2013/06/14/3135872.html
https://blog.csdn.net/lemon_tree12138/article/details/50736887
以上是关于计算机专业研究生核心能力培养——如何更好的写代码的主要内容,如果未能解决你的问题,请参考以下文章