Java 如何在动态语言中进行更改,并找到所有将被更改打破的地方?

Java 如何在动态语言中进行更改,并找到所有将被更改打破的地方?,java,python,ruby,Java,Python,Ruby,我习惯于用静态语言(如Java)编程,在Java中更改方法的签名将导致调用我更改的方法的每一行代码的编译错误。这使得修改大型项目更加容易,因为我可以进行更改,然后让编译器告诉我需要修复的所有位置 当使用动态语言(如Python或Ruby)处理大型项目时,如何更改代码,并且仍然确信不会因为忘记了某些场景而对生产中的运行时错误感到惊讶 我在Java中看到了相当多的NullPointerException和ArrayIndexOutofBoundsException,所以这并不是说这些事情在静态语言中

我习惯于用静态语言(如Java)编程,在Java中更改方法的签名将导致调用我更改的方法的每一行代码的编译错误。这使得修改大型项目更加容易,因为我可以进行更改,然后让编译器告诉我需要修复的所有位置

当使用动态语言(如Python或Ruby)处理大型项目时,如何更改代码,并且仍然确信不会因为忘记了某些场景而对生产中的运行时错误感到惊讶


我在Java中看到了相当多的NullPointerException和ArrayIndexOutofBoundsException,所以这并不是说这些事情在静态语言中从未发生过,我只是认为它们发生的次数要少得多。

以下是一些在Java中提供某种级别保护的想法:

  • 正如前面的评论中所述,您肯定应该提供足够的单元和集成测试,以防止重构过程中出现任何问题。测试在动态语言中比在静态类型语言中更为重要。您应该检查每个函数中的值是否正确传递和处理

  • 在进行更新之前,使用并搜索方法的用法。这不是充分的证据,但确实发现了大量的方法使用,以允许更容易的重构

  • 在编辑器或所选搜索程序中对方法名称进行全局查找

  • 对于类型不正确或值未设置的情况,在函数中提供异常处理

  • 小心地处理传递到函数中的arg和kwarg。如果收到意外输入,可能会提供错误或调试日志

  • 为函数提供未定义的参数

下面是一个为参数提供默认值的示例,以确保在函数中定义参数并将其初始化为None(类似于null),前提是该参数未随值传入:

def my_function(my_parameter=None): 
    # Do something with my_parameter

单元测试。这也是很好的,因为有很多原因——但对于动态语言来说是必要的。我总是在模块中编写代码,如果某个地方正在使用函数,而您想要更改函数,确保新函数的输出和旧函数的输出类型相同。如果某个函数被更改,并且该函数的名称保持不变,则不会导致任何问题