每个人都想编写干净的代码。有整本关于它的书!
但是你现在不需要读一本书来编写更简洁的代码。每个编码员都可以学习一个“技巧”,以使他们的代码不那么混乱。
关键是:
每条线只做一件事
一条线,一项任务。
但不要为此而疯狂。
不要这样。
这里的主要思想是:短代码行比长代码需要更少的脑力来阅读。易于阅读的代码更易于推理。理论上,行数较短的程序更容易维护。
但是紧凑的代码可能很神秘。 (见过APL吗?)仅仅因为你可以分割一条线并不意味着你应该这样做。
在某些语言中,您可以将两个值分配给一行中的两个变量:
x, y = 2, 7
您可以将这两个任务放在各自的行上:
x = 2 y = 7
但是,来吧。你真的需要吗?如何判断一条线是否应该拆分?
这不仅仅是关于线长
Felienne Herman 在她的书The Programmer’s Brain一书中打开了一个不可否认的事实:“混乱是编程的一部分。”
这可能意味着该休息一下了。
Herman 的书(我强烈推荐)解释了大脑的三个记忆功能如何协同工作来理解代码:
- 长期记忆 (LTM):存储信息以供长期检索,例如关键字、句法以及常用的成语和模式。
- 短期记忆 (STM):存储用于短期检索(少于 30 秒!)的新信息,例如变量名称和特殊值。
- 工作记忆 (WM):处理来自 LTM 和 STM 的信息以得出结论并获得新知识。
STM 和 WM 都很小。两者一次只能存储大约 4 到 6 件东西!超载它们,你就有了混乱的秘诀。
你的大脑如何处理信息。
这给了我们一个判断一行代码是否太复杂的规则:
应简化包含 6 条以上信息的代码行。
我称之为“六法则”。
这是 Python 中的一个示例:
map(lambda x: x.split('=')[1], s.split('?')[1].split('&')[-3:])
你读起来有那么难吗?我也是。这是有充分理由的。
你必须知道什么是map
、 lambda
和.split()
。变量x
和s
,字符串'='
, '?'
, 和'&'
, 索引[1]
和切片[-3:]
都在 STM 和 WM 中占用空间。总共:十件事!你的大脑跟不上。
或者也许你的可以。
如果是这样,那么您已经获得了一些不错的经验。
您的大脑s.split('?')[1]
类的语法“分块”为“问号右侧的字符串部分”。您可以使用存储在 LTM 中的信息重构代码。但是您仍然一次只能处理几个块。
所以……我们可以确定一行代码何时过于复杂。现在呢?
想要更多这样的吗?
每周六发送一封电子邮件,其中包含一个可操作的提示。
总是少于你的 5 分钟。
现在订阅
如果代码令人困惑,请打破它
把它分成小块,就是这样!
我使用两种策略来分解代码。我称它们为 SIMPLE 和 MORF。
SIMPLE 策略添加代码行以减少认知负荷。
让我们将 SIMPLE 应用到我们之前看到的讨厌的单线。从map()
中删除第二个参数并将其放在自己的行中:
query_params = s.split('?')[1].split('&')[-3:] map(lambda x: x.split('=')[1], query_params)
它仍然可能难以阅读。第一行有七件事要跟踪:
-
query_params
-
s
-
.split()
-
'?'
-
[1]
-
'&'
-
[-3:]
但是每行要跟踪的内容都比以前少了。你的大脑可以更轻松地处理它们。
再次应用 SIMPLE 并将s.split('?')[1]
移动到新行:
url_query_string = s.split('?')[1] query_params = url_query_string.split('&')[-3:] map(lambda x: x.split('=')[1], query_params)
将其与原始的单线进行比较。哪一种更容易处理?
MORF 策略采用不同的方法并将代码分组为函数。
这是 MORF 应用于我们的单线的样子:
def query_params(url): return url.split('?')[1].split('&')[-3:] map(lambda x: x.split('=')[1], query_params(s))
你甚至可以结合 MORF 和 SIMPLE:
def query_params(url): query_string = url.split('?')[1] return query_string.slit('&')[-3:] map(lambda x: x.split('=')[1], query_params(s))
您无需了解代码即可感受效果。每一行都更容易让你的大脑处理。
还有红利哦!
一旦您知道您的 WM 和 STM 没有超载,您就会知道留下的任何混乱都是由于 LTM 中缺少信息造成的。
换句话说,SIMPLE 和 MORF 不仅可以帮助您编写更简洁的代码。它们可以帮助您确定可以通过实践改进的知识差距!
想更多地了解您在编码时的大脑是如何工作的?
查看 Felienne Herman的《程序员的大脑》 。
锻炼
看看我们最终使用 SIMPLE 的代码:
url_query_string = s.split('?')[1] query_params = url_query_string.split('&')[-3:] map(lambda x: x.split('=')[1], query_params)
一行还有六个以上的“想法”,应该按照六分法拆分:
- 哪条线?
- 什么是“想法”?
- 你会如何拆分它?
- 分开有很大的不同吗?