计算机专业研究生核心能力培养(2)——如何更好的写代码
1. 前言
作为计算机专业研究生的核心技能之一,编程能力必须深入掌握。我记得在大二的数据结构课程中,老师曾告诉我们:就像基本的生活技能一样,在程序员的职业生涯中也无需过多脑力投入就能熟练运用的技能。因此,在编写代码时应当更加注重逻辑框架的设计与构建。
2. 面向对象编程
基于对象的技术并非唯一的软件开发范式,在以往的发展历程中曾经存在过函数式的程序设计方法以及后来发展起来的过程式技术体系。相比之下,在当前的应用实践中基于对象的技术体系能够更加贴合人类认知世界的基本规律,在这种体系下我们可以说它是完美诠释了元宇宙理念的一种实践方式。
对于任何学习过面向对象编程的学生来说,该思想包含三个关键要素:封装、继承和多态。我们不再深入探讨这一部分,因为其他地方已经进行了详尽阐述。但具体应用时需注意以下几点:
万物皆为对象
任何可以被操作的数据都应当被视为一个具有结构的对象。随着我们编程世界的日益复杂化和数据类型不断丰富发展起来的新数据形态的出现,在数据处理能力方面也面临着更大的挑战。然而,在自然界中像纯净的水这样简单的事物,并不需要过多地进行描述和研究;相比之下,在工程学领域中的复杂物体如汽车,则需要一个完整的结构系统才能实现对各个组成部分的有效操作和控制。如果没有相应的结构系统支撑的话,则难以对汽车的每一个单独部分进行精确的操作和协调控制以实现其在道路上高速行驶的目的。
任何行为都有执行者与接受者。
具体来说,任何操作都应由一个对象执行,并包含明确的目标与用途,并作用于自身的数据或他人数据。
每个事物都有其归属
尽管我们也支持使用少量的临时变量以简化运算过程等操作。然而我们建议避免过度依赖临时变量以提高程序效率和可维护性。因为类似于草稿纸的特性使得难以追踪和定位这些临时变量一旦超出合理范围可能导致程序运行效率下降甚至出现逻辑错误。
3. 代码命名规范
以Python为例,推荐的一种命名规范为:
模块名:该模块名称
类名: 对应类名
方法:实现方法名称
变量名:目标变量名说明:该模块功能描述
4. 代码语义化
使代码能够直观地呈现其执行功能,并且类似于外文阅读的习惯,在这种情况下注释的作用便显现出来
# 代码1
d = 5
time.sleep(d)
# 代码2
delay_second = 5
time.sleep(delay_second)
通过这个简明的例子可以看出, 当我们采用代码1时, 实际上很难确定具体的睡眠时长及其单位. 这些睡眠时间的作用是什么?相比之下, 采用代码2则能够有效规避这些问题.
5. 代码模块化
代码模块化除了一些早期介绍的面向对象编程之外,在实际开发中需要注意的是每个函数专注于完成单一任务,并且必须满足以下三个条件:功能独立性、参数与返回值明确性以及可重用性。
- 函数内容轻而易举地被一页屏幕展示完毕
- 函数名称即刻揭示其核心功能
- 避免过度拆解(只有经过合理设计才能实现可复用性的过程才值得拆分)
6. 代码注释
注释方法我在其他文章中也讲过了,这里简单的提一下:

虽然注释并非越多越好,在易于理解的代码中无需添加过多
下面是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://zhuanlan.zhihu.com/p/46830303
代码优化技巧:
https://www.cnblogs.com/dkblog/archive/2013/06/14/3135872.html
博客文章:
