动态语言是否不利于敏捷开发?


12

从我读到的内容来看,敏捷开发通常涉及到将重构或反向工程代码重构为图表。当然还有很多,但是如果我们考虑依赖这两种方法的实践,动态类型的语言是否处于不利地位?

看来静态类型的语言会使重构和逆向工程容易得多。

如果在动态类型语言中并非不可能,那么重构或(自动化)逆向工程难吗?现实世界中的项目说明了如何将动态类型的语言用于敏捷方法?


5
将工程代码反向转换为图表?您为什么要在敏捷中这样做?
CaffGeek

7
敏捷并不意味着“先编码,后编码”。

@CaffGeek:一些经常推荐的书籍建议在白板上绘制图表,然后进行编码,最后将工程师代码反向转换为图表,以供下次会议使用。
Gerenuk 2012年

1
我认为强类型应从此问题的标签和文本中删除。问题似乎在于静态与动态而不是强与弱。
Winston Ewert 2012年

@WinstonEwert-好的,我已经将标签更改为dynamic-typingstatic-typing
Carson63000

Answers:


11

理论上讲,动态语言在所有其他条件相同的情况下处于劣势,因为它们很少指定代码的工作方式(约束是什么),因此可以自动完成较少的重构,并且也无法自动检测出现的问题。

但是其他所有条件都不相等。最受欢迎的动态语言允许高度紧凑但易于理解的代码,这通常使它们的开发速度更快,并使逻辑(可能会在重构中更改)的视觉更容易发现。因此,尽管您可能会失去使用动态语言进行工作的相对优势,但您仍然可能会领先于他人,特别是如果您打算以任何方式手动进行重构。

另一方面,存在静态类型的语言,其本质上与动态语言具有相同的优势(即,紧凑且易于理解,其中大多数类型都是推断的,但在那很多):Haskell可能是主要的示例,但OCaML / F#,Scala,其他也属于这一类。不幸的是,由于与最流行的静态类型化语言相比,它们的使用率较低,因此它们没有那么广泛的工具集(例如,用于重构)。

因此,作为底线,我认为您将在大多数语言中充分利用敏捷方法。我不会说现在有明显的赢家,因为实践尚未赶上理论。


我认为此答案最能解决问题的关键点:)您能否详细说明安全重构和逆向工程对敏捷开发的重要性?我以为它起了非常重要的作用?也许这比我想象的要少,并且用于动态语言的工具就足够了。
Gerenuk 2012年

1
@Gerenuk-我没有足够的敏捷开发经验(尤其是在动态语言中),不能给出权威性的答案-重构方面是否被强调,保留不变等等?请记住,过程的其他常见方面(例如,测试驱动的开发)可以帮助您确定重构出现问题的位置,如果您在设计阶段投入更多精力,则可能不需要尽可能多地重构。我认为关键不是一种特定的技术,它是手头一整套,频繁且协作部署的工具。
Rex Kerr

14

自动重构是在Smalltalk(一种动态类型的语言)中发明的。因此,以动态类型的语言进行自动重构并非并非不可能。除打字纪律外,它的难易程度还更多地取决于其他因素。C ++和Java都是静态类型的,但是重构工具仅真正存在于Java中。具有内省性和简单语法的Smalltalk是重构工具的真正不错的选择。

在某些方面,动态类型实际上使重构更加容易。如果您有一个好的测试套件,则可以确保您的重构没有任何问题。动态类型的代码库通常较小。此外,重构往往会影响较少的代码。总体而言,手动重构动态代码库所涉及的工作少于静态代码库。


1
那逆向工程呢?在输入方面,Smalltalk是否与Python不同?推断Python中的所有类型并由此确定哪种方法真正相同,而不仅仅是名称相同,似乎是一个难题。
Gerenuk 2012年

2
Smalltalk是不是在Python太大的不同与问候打字。它然而,显著有关于不同的工具。可用于Smalltalk中的工具和IDE的方式比那些可用于Python,甚至C#,C ++和Java更好。Python的IDE不好的原因不是因为Python是动态类型的,而是因为Python的IDE不好。我们不要忘记,现在称为Eclipse的IDE曾经被称为Smalltalk的VisualAge。Smalltalk社区在构建IDE方面拥有40年的经验,并将其应用于Java。
约尔格W¯¯米塔格

@ Gerenuk,Smalltalk的输入与python没有什么不同。以其他方式,例如自省,Smalltalk确实提供了对重构更友好的功能集。python中的类型推断将需要工作,但已完成,请参阅PyPy项目。
Winston Ewert

1
@WinstonEwert“但是您可以手动进行重构,而动态语言实际上使这相当容易” –不,手动重构无法扩展。对于重构工具支持,一切都改变了,即使重构是不是100%自动(请参见下面的案例摘录- programmers.stackexchange.com/a/166594/4334
igouy

1
“动态编程实际上使重构更容易”中的几乎每一个点都是可疑的或不合逻辑的。动态编程并不意味着您拥有一个更全面的测试套件,而是一个更大的套件(因为有些东西需要进行测试,否则这些测试将被静态捕获)。您不提供任何支持“重构往往会影响较少的代码”(因为“无论如何项目都较小”,这在当前的动态语言中很可能是正确的)。除非您的意思是说您甚至不会让编译器来帮助您,否则“手动重构所涉及的工作”似乎是错误的!
雷克斯·克尔

8

重构是在动态语言中发明的。自动重构工具是用动态语言发明的。IDE是用动态语言发明的。以动态语言发明了几种敏捷方法。

我真的没看到任何问题。


“ Smalltalk在打字方面与Python并没有太大区别。但是,在工具方面却有很大不同。” -也许情况开始有所改变,请参阅jetbrains.com/pycharm/features/index.html
igouy 2012年

3

唯恐我们忘记了,一种称为“ 极端编程”(XP)的“敏捷”工作方式是在Smalltalk项目上创建的(Smalltalk当然可以算作“动态”语言)。

这是一个工业使用带有动态类型语言的重构工具的案例研究:

嘉吉公司开发了一个非常大的Smalltalk应用程序,以支持谷物升降机的运行以及相关的商品交易活动。Smalltalk客户端应用程序具有385个窗口和5,000多个类。此应用程序中约有2,000个类与早期(大约在1993年)的数据访问框架进行了交互。该框架动态执行对象属性到数据表列的映射。

分析表明,尽管动态查找消耗了客户端执行时间的40%,但这是不必要的。

开发了一个新的数据层接口,该接口要求业务类以显式编码的方法向列映射提供对象属性。测试表明,该接口的速度要快几个数量级。问题是如何更改数据层的2,100个业务类用户。

在开发和测试接口转换时,正在开发的大型应用程序无法冻结代码。我们必须在主要开发流的代码存储库的并行分支中构建和测试转换。对转换进行全面测试后,即可通过一次操作将其应用于主代码流。

在17,100个更改中,发现少于35个错误。所有错误均在三周内迅速得到解决。

如果手动进行更改,我们估计将花费8500小时,而制定转换规则则需要235小时。

通过使用重写规则,该任务在预期时间的3%中完成。这提高了36倍。

摘自“应用程序数据层的转换” Will Loew-Blosser OOPSLA 2002

另外,“无法进行更改的工具-具有转换大型Smalltalk程序的工具的经验”


1

您的原则思想对我来说是正确的

像C#这样的强类型语言是不断需要重构的代码库的良好候选者。基本上,市场上大多数重构工具(如Resharper,JustCode等)在静态类型的编程语言中都非常有效。

现实世界中的项目说明了如何将动态类型的语言用于敏捷方法?

对于实施敏捷/ Scrum方法论的开发团队来说,拥有一套精良的重构工具非常有帮助(甚至至关重要)。否则,即将进行的冲刺中所有突然的更改可能是修改或重新设计的噩梦。

因此,敏捷方法论无法为静态类型语言或动态语言提供任何优势。它提供了一种构建可靠应用程序的迭代方法。


4
动态语言早在C#出现之前以及记事本仍是功能最强大的Java IDE之前就已经具有自动重构工具。
约尔格W¯¯米塔格

4
我的经验完全不支持该答案。动态语言通常更快做的事情比更传统的静态类型的人(我已经得到了学习的Haskell或ML或类似的东西有时)。如果突然需要,它们的修改速度也快得多,这导致我的结论是,当您不太了解自己在做什么时,Common Lisp是最好的语言。此外,您认为重构从哪里开始?
David Thornley 2012年

1
您为什么这样想,例如javascript是一种动态语言,但是Re-sharper的功能与C#相同。其次,我没有说过“动态语言做事较慢”。
尤苏波夫

来自为您带来IntelliJ IDEA的人们-PyCharm-“重命名重构允许安全,即时地执行全局代码更改。文件内的本地更改是在原位执行的。重构在普通的Python和Django项目中起作用。使用Introduce Variable / “ Field / Constant和Inline Local”,用于改进方法中的代码结构,“提取方法”用于分解较长的方法,“提取超类”,“上推”,“下拉”和“移动”以移动方法和类。” jetbrains.com/pycharm/features/index.html
igouy 2012年

@igouy,我的回答是指Resharper和JustCode。因此,对于所引用的上下文来说是正确的。
Yusubov 2012年
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.