您如何导航和重构以动态语言编写的代码?


14

我喜欢编写Python,Ruby或Javascript所需的模板很少。我喜欢简单的功能构造。我喜欢简洁的语法。

但是,在使用动态语言开发大型软件时,我确实很不擅长三件事:

  • 浏览代码
  • 识别我正在使用的对象的接口
  • 有效重构

我一直在尝试使用简单的编辑器(例如Vim)以及IDE(Eclipse + PyDev),但在两种情况下,我都觉得我必须对内存进行更多的投入和/或不断地“ grep”并仔细阅读代码以识别接口。当使用具有多个依赖项的大型代码库时,尤其如此。

至于重构,例如更改方法名称,它在很大程度上取决于我的单元测试的质量。而且,如果我尝试通过“切断”应用程序的其余部分来隔离我的单元测试,则不能保证存根的接口与存根的对象保持最新。

我确定有解决这些问题的方法。您如何在Python,Ruby或Javascript中高效地工作?


到目前为止,PyDev的重命名功能对我来说非常有用。

Answers:


3

浏览代码

获得比VIM更好的编辑器。

我使用Komodo Edit。

我觉得我必须为记忆付出更多

好。思维是好的。我发现“学习”最终导致“记忆”。

不断地“ grep”并通读代码以识别接口。

这是典型的。如果您不记得它们了,那么它们太复杂了,不是吗?是时候简化了。

简单很难创建。但是,当您难以记住时,这就是不良设计的征兆。

我用grep。这个对我有用。我的Komodo编辑有很多不错的搜索。Notepad ++也是如此

识别我正在使用的对象的接口

Doc Strings和help()函数起作用。我用它们。日常。

有效地重构...这在很大程度上取决于我的单元测试的质量。

那不是新闻。即使是静态语言,也总是如此。

用静态语言,我们经常会变得懒惰,假设只要可以编译,它确实很可能会工作。这显然是错误的,但是我们很懒。


我确定有解决这些问题的方法。

这些不是“问题”,不需要“解决方法”。


动态语言正是关于不知道您要操纵的对象的类型的。当您收到一个参数时,假定它定义了一个“ quack()”和“ feathers()”方法,但是您不知道文档在哪里(实际上,它们在多个实现中将有多个文档字符串)。

“不知道对象的类型”?真。当设计对象的客户时,我知道我设计的类型。

当我定义了由多个客户端使用的服务时,当我定义了quack()和的必需接口时,“精确”类型是不相关的feathers()

最后,在遇到细微问题的极少数情况下,我拥有Read-Execute-Print-Loop和其他工具来确定“精确”类型。那就是我每天实际使用的东西。

>>> x = some_mystery_factory( some, args )
>>> type(x)
>>> dir(x)

展开对象的类型似乎并不困难(至少在Python中是如此)。动态语言必须具有REPL,这使得查看正在发生的事情非常容易。

您也不知道预期的参数顺序。IDE似乎很难在那里提供帮助。

那没有多大意义。 help()作品。

而且我的IDE经常可以找到定义。并非总是如此-一些复杂的动态构造可以轻松隐藏基类。在这种情况下,我必须考虑一下对象的类以找到方法定义。当然,我正在编写代码,因此那里几乎没有(或没有)神秘之处。


6
我觉得我可能会说,被迫把更多的内存给你了思考能力...
妮可

@Renesis:如果接口有任何类型的模式或系统,记忆并不是邪恶的。
S.Lott

1
我同意@Renesis的记忆界面使我的想法脱离了真正的思考。我不在乎团队中的另一个编码器如何决定对参数进行排序。大型代码库使用具有不同命名标准的许多不同库的事实并不罕见,并且简化或统一这些组件通常是不可能或不切实际的。
Philippe Beaudoin

回复:Doc字符串,当您知道对象的类型时,它们就很好了,但通常却不知道,您必须查一下。
Philippe Beaudoin

1
grr ...没有比Vim更好的编辑器了:P
Anto


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.