首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止对内部API的更改破坏其他项目?

如何防止对内部API的更改破坏其他项目?
EN

Software Engineering用户
提问于 2015-09-17 11:14:40
回答 5查看 1.8K关注 0票数 8

我们有20-30个独立模块/解决方案。每个项目大约有7-10个项目,有不同的类别、组件等。这些项目都是我们公司内部使用的。

我们的问题是,当我们对一个模块进行更改时,我们需要确保更新正在访问此代码的所有其他模块。这是很难知道,因为它是在不同的码基。

我们如何记录API的所有外部用途?或者以其他方式防止小的变化破坏其他模块?

EN

回答 5

Software Engineering用户

回答已采纳

发布于 2015-09-21 13:20:37

最简单的解决办法,IMO,是对每种产品进行相当数量的自动化测试。更新库时,将运行每个产品的测试套件。如果测试失败,那么您将知道哪些产品需要更新。

票数 14
EN

Software Engineering用户

发布于 2015-09-21 13:25:20

我建议不要试图记录这个文件(至少是手动的),就好像你要求人们更新它一样,它需要很高的准确性才能正常工作。但你永远无法达到这样的精确度,因为添加这样的文档.不好玩,也没人会这么做。

一些更好的选择:

  • 有一个脚本,根据搜索条件生成所有其他模块中所有方法调用的可用列表。简单,粗糙,但可能有效。
  • 某种版本系统,除了主要版本号之外,您不会破坏向后兼容性。因此,如果您将foo方法从2.1版本更改为2.2,那么所有引用Version2.x的代码都将继续工作。当您需要打破这种兼容性时,升级主版本号(在本例中是3.0),并向负责其他模块的所有项目所有者宣布这一点。根据您的发布过程的工作方式,这可能很简单--或者非常复杂--可以实现。
  • 有一个自动化测试或CI构建过程,您每次推送代码时,构建都会运行某种类型的测试。这将使您能够确定问题发生的地方。我的猜测是,你所描述的问题
  • 用于所有模块/存储库的某种自动文档系统

您还可以考虑缓慢地重构API,使其不那么脆弱,但如果您是个人,并且需要使用20+大型模块,那么这超出了您可以合理完成的任务范围。

票数 5
EN

Software Engineering用户

发布于 2015-09-21 14:09:32

首先,具有外部用途的API不应更改。

正如@BryanOakley所提到的,在这种情况下,使用自动化单元测试是非常重要的,并且可以挽救生命。除此之外,还有一些建议可能(或不,根据情况)对你有帮助。

  • 许多语言(如Java和C#)都提供Function/Method Overriding。像Python这样的语言向函数传递(无限数量的)参数和关键字参数: Java: public void (Char c) { System.out.println( c );} public void (char,int num) { System.out.println(c +“”+ num);} disp("A") disp("A",3) Python disp(c,*args):如果args: num = args0 print("%s %f“% (c,num))其他:print(%S”% c) disp("A") disp("A",3)
  • 许多语言提供了publicprivateprotected方法。您可以在public函数中处理函数调用,并在private/protected函数中执行任务。在python中,没有方法和函数的公共/私有定义,但是前面的下划线(_)告诉我们方法是私有的,不应该在外部使用。外部API调用是通过向外部世界开放的方法传递的,所有任务都是以所谓的本地函数完成的: def format_input(a,b,*args,**kwargs):#这个函数对任何人都是开放的。所以使用*args和**kwargs获取#所有可能的可用参数。不要更改此函数#定义,函数参数a= _evaluate_input(a) b =_evaluate_input(b) #c不是所有API都使用的,而且可能没有在所有外部#API文档中记录。所以切赫如果它是作为关键字参数发送的话。如果是,那么如果"c“在kwargs中的话:C =_evaluate_input(kwargs.get("c")) _check_extra_arguments(args) _check_extra_keyward_arguments(kwargs) def _evaluate_input(value):#这是一个私有方法,因此不应该从#外部世界调用。您可以更改此方法和参数结构#,以满足您的需要,而不关心外部世界,因为任何外部API都不应直接使用此函数。..。def _check_extra_arguments(值):#我们将检查是否传递了任何额外的参数并相应地处理它们.

正如我所说,外部应用程序(也)使用的API定义不应该经常更改。您可以寻找使外部函数更加灵活的方法,这样就可以在不破坏当前状态的情况下更改API的工作方式。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/297483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档