习惯FP思维的人应该如何阅读命令性代码?


14

我大约五个月前从大学毕业,并且已经在一家本地初创公司工作了四个月。在大学期间,我独自学习了Haskell,F#等。我们在大学里学过Java,但是我很快就接触了函数式编程,并且花了更多的时间在命令式编程上。结果,我的大脑开始思考功能性思维。我加入的公司使用Python,并且代码非常重要。我很难阅读命令式代码。我无法追踪突变。当“如果……否则……”嵌套的深度超过四个级别时,我将完全失去对代码中所发生情况的跟踪。另外,Python是一种动态语言,因此代码中没有类型。它' 自从我试图理解我们代码库的一部分(据称是“中等复杂”)以来已经有几个星期了,但是到目前为止,我在理解它方面还没有取得任何明显的进展。请向我提供一些实用的技巧,以帮助我理解该代码。提前致谢!

编辑:
也许我还应该提到代码中没有很多注释,而且名称也不是很直观。


1
您是否希望没有评论或不正确的评论?我敢肯定,在您提到的条件下,评论将无法正常使用。
拉里·科尔曼

除非代码中包含可归因于“自我注释”的极小的代码子集,否则我宁愿至少包含一些注释,这些注释可能至少包括许多有用的提示,以指导我度过难以理解的乱码!但这就是我!
John Tobler

2
甚至命令式程序员也倾向于至少在直观上限制其副作用,并编写小的方法。我认为您只是进入了一个不太理想的代码库。
莫里西奥·谢弗

Answers:


14

了解遗留代码很难。它几乎与功能性与程序性无关。

  1. 创建某种地图。Python包和模块的组件图。对于每个模块,您都需要创建类图。

  2. 使用Python解释器。您应该能够导入模块,创建对象并进行交互锻炼。这就是Python受欢迎的原因。您可以打印type(x)以查看变量(x)的实际类型。

  3. 如有疑问,请务必阅读单元测试代码。如果没有单元测试代码,那么除了学习新的代码库之外,您还会遇到很多迫在眉睫的问题。

  4. 把东西写下来。从附带文件开始。然后,当您认为自己知道所发生的情况时,请在函数,方法和类中添加文档字符串注释。尽早并经常添加这些内容。

  5. 将Sphinx与'autodoc'结合使用以收集您正在学习的内容。

最重要的部分是这个。很难把事情牢记在心。将内容保存在文档文件中比较容易。


6
+1。即使编写得很好,也很难理解任何遗留代码。
quant_dev

12

我很难阅读命令式代码。当“如果……否则……”嵌套的深度超过四个级别时,我将完全失去对代码中所发生情况的跟踪。

等等...任何人都无法通过如此深层的嵌套级别完全放松对代码的了解。或如Linus Torvalds所说:

如果您需要三个以上的缩进级别,则无论如何都要拧紧螺丝,并应该修复程序。

也许我还应该提到代码中没有很多注释,而且名称也不是很直观。

这听起来好像您的公司没有遵循通用的最佳做法。

如果我是你,我只会尝试根据纪律和力量来理解代码库。只是一次又一次地深入其中。大概什么都可以。现在,您觉得自己在水下,无法呼吸,但是继续检查代码库,很快您就会浮出水面。

恐怕您的问题缺少技术细节,无法为您提供有关如何理解代码库的良好建议,但是与几名经验丰富的同事一起讨论该代码从来没有错。让他们向您解释总体架构以及不同组件之间如何交互,以及他们制定的实施决策。

从功能语言到命令式/ OO语言的过渡很难给出一般性建议。当然,我可以提到一些花哨的短语,例如“您需要考虑对象的状态和行为”,但是这些并不能帮助您,我认为这是您必须经历的。


缩进问题可能更糟:当语言是列式代码(例如RPG)时,并且没有任何实际的缩进。一些工具试图解决这个问题……
Clockwork-Muse

2

如果(从描述的不良实践中得出的结论很大)有单元测试,那么您可以查看那些单元测试以查看如何测试代码。这样可以很好地了解代码的作用。

否则,我建议阅读更多通用的python代码以适应其编写方式。


2

您可以尝试将Python中的某些片段转换为伪Haskell或您喜欢的任何东西。这可以使您了解什么命令式构造可以松散地映射到什么功能构造。随着您获得更多的经验,当务之急的结构将开始变得更加本土化。

我从对OCaml和Haskell进行编程到对Java和Python进行编程,我的经验是,命令式编程不像动态类型那样飞跃,直到今天,这种感觉还是很陌生。


1

我建议您放置断点并开始使用Next命令(就像您在调试一样),这将帮助您了解流程(可能在分支上,更可能采用路径,在应该集中精力获取的路径上)代码的总体思路)。

(我与Eclipse以及PyDev作为Eclipse插件一起使用都取得了不错的效果)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.