首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何用动态语言维护函数返回值协议?

如何用动态语言维护函数返回值协议?
EN

Software Engineering用户
提问于 2015-03-15 18:17:39
回答 2查看 146关注 0票数 3

在Python、Javascript等动态编程语言中,函数很容易返回一个对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def make_vector2(a, b):
    return {"x": a, "y": b}

make_vector2返回的对象的“签名”充当到其他函数的协议或接口。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def norm(v):
    return math.sqrt(v["x"]**2 + v["y"]**2)

在程序演化过程中,返回对象的签名可能会发生更改。例如,我会将上面的向量定义更改为{"x0": a, "x1":b}

此协议更改可能使其相关功能失效(例如,上述示例中的norm )。

在静态编程语言中,我有编译器帮助我保持协议的一致性。在动态编程语言中,除非实际运行代码,否则我无法检测问题。

对这个问题有什么建议/好工具吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-03-15 18:59:18

喜欢动态语言的人一开始并不认为这是个问题。用于处理这一问题的基本工具只是很好的测试。是的,如果不运行代码,就无法检测到您所描述的问题,因此关键是通过一个好的测试套件运行代码,可能与编译时一样频繁。

当然,这样做也有缺点。如果代码没有经过测试,错误就不会被检测到,而编译器就会捕捉到它。但是你在那里失去的东西,在开发速度和使用松耦合的能力上都有所提高。

当然,在调用norm时,您的代码会抛出。因此,如果您运行至少一次使用norm的结果调用make_vector2的基本测试套件,您将捕获错误。如果您像编译C++或Java程序那样频繁地运行这些测试,那么它实际上并没有什么区别。不管怎样,窃听器都会被抓到。

答案的另一部分是尝试以一种契约更清晰的方式设计代码。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Vector:
    def __init__(self,x,y):
        self.x = x
        self.y = y

def make_vector2(a, b):
    return Vector(a,b)

def norm(v):
    return math.sqrt(v.x**2 + v.y**2)

当然,这仍然必须以与原始代码相同的方式进行测试,但这会以早期版本没有的方式记录协议。这意味着您可以执行help(make_vector2),并看到它返回带有xy属性的Vector对象。这就降低了错误发生的可能性。

一般来说,返回原始字典是最好的,当您有意保持松散耦合,因此可以处理更多的变体内容。

票数 3
EN

Software Engineering用户

发布于 2015-03-15 19:56:15

一种方法是使用软件合同系统,特别是支持功能合同和高级功能合同的系统。一般的想法是使用契约创建工具将一个函数包装成指定“我接受这些类型的值并返回这种值”的规则。它类似于类型系统,但动态检查除外。这种系统的最突出的实现可以在语言Racket中找到,尽管其他动态语言(包括JavaScript和Python )都有实现。

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

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

复制
相关文章
c语言stat函数返回值,stat函数
定义函数: int stat(const char *file_name, struct stat *buf);
全栈程序员站长
2022/09/24
2.7K0
Go 语言函数、参数和返回值详解
函数是一组语句,可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。
小万哥
2023/09/07
3750
Go 语言函数、参数和返回值详解
Go语言函数的参数和返回值
第一类对象(first-class object)指可在运行期创建,可用作函数参数或返回值,可存入变量的实体。最常见的用法就是匿名函数。
博文视点Broadview
2020/06/12
2.6K0
Go语言函数的参数和返回值
[日常] Go语言圣经-函数多返回值习题
Go语言圣经-函数多返回值 1.在Go中,一个函数可以返回多个值 2.许多标准库中的函数返回2个值,一个是期望得到的返回值,另一个是函数出错时的错误信息 3.如果一个函数将所有的返回值都显示的变量名,那么该函数的return语句可以省略操作数。这称之为bare return。
唯一Chat
2019/09/10
8430
[日常] Go语言圣经-函数多返回值习题
C语言的函数返回值是什么?
这两天又把C和CPP拉出来写程序了,大一学的吧?可能更早,现在对计算机的理解比以前深刻不少,现在再试图把一些疑惑的东西写一写。毕竟精通C语言,百利而无一害。
云深无际
2025/01/07
960
C语言的函数返回值是什么?
C语言 —— 愿文明如薪火般灿烂 - 函数递归
⼀个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1, ⾃然数n的阶乘写作n!
迷迭所归处
2025/03/07
740
C语言 —— 愿文明如薪火般灿烂 - 函数递归
C语言中函数return单一返回值
很多初学者在使用C语言写函数时,不清楚return返回值原理,在函数的一处return中返回多个值。注意!这个写法是完全错误的,一个return只能返回一个值 下面我讲用一些代码和实例解释 (环境:windows下的visual studio 2019)
黎鹤舞
2024/03/19
1670
C语言中函数return单一返回值
c语言中system函数怎么用_system函数的返回值
c语言中的system()函数主要用于发出一个DOS命令,该函数已经收录在标准c库中,可以直接调用。使用时包含头文件<stdlib.h>
全栈程序员站长
2022/09/29
2.4K0
c语言中system函数怎么用_system函数的返回值
【JavaScript】函数 ④ ( 函数返回值 | 函数返回值语法 return 关键字 | 函数默认返回值 undefined )
JavaScript 函数 可以 实现某种特定的功能 , 执行完毕后 , 可以返回一个 " 返回值 " ;
韩曙亮
2024/04/04
5210
【JavaScript】函数 ④ ( 函数返回值 | 函数返回值语法 return 关键字 | 函数默认返回值 undefined )
编程语言函数多返回值处理方式排名
一个函数一个返回值 , 这好像跟祖宗定下的规则似的,各个时代主流编程语言几乎都严格遵守着。然而, 在实际情况下, 程序员写代码经常会碰到一个函数会返回多个返回值这种需求, 比如说一个带分页功能的函数 ,需要要返回数据列表和总记录数两个值; 一个http请求函数需要返回状态码和响应内容两个值。这样的情况比比皆是。 面对这种需求,每一种语言都有自己的一套应对方法。 下面我们来对各主流语言实现方法的好坏来进行一下排名。 第一名:golang golang的函数天生就支持多返回值这个特性, 一个函数可以返回任意数量
用户1608022
2018/04/11
2K0
编程语言函数多返回值处理方式排名
stat()函数_stat函数返回值
在 linux 中,经常需要获取文件的属性,比如修改时间,文件大小等等。stat 函数将会帮助我们得到这些信息。
全栈程序员站长
2022/09/24
3.4K0
【Python】函数 ③ ( 函数返回值定义语法 | 函数返回多个返回值 | 代码示例 )
在 Python 函数中 , 通过 return 关键字 , 可以返回一个结果给调用者 , 这个返回结果就是 函数返回值 ;
韩曙亮
2023/10/11
7560
【Python】函数 ③ ( 函数返回值定义语法 | 函数返回多个返回值 | 代码示例 )
C语言动态内存分配函数
1.malloc() 2.free() 3.calloc() 4.realloc() 5.小结
Twcat_tree
2022/11/30
1.6K0
C语言动态内存分配函数
【C语言】动态内存函数介绍
返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
大耳朵土土垚
2024/03/13
800
【C语言】动态内存函数介绍
C语言/动态内存管理函数
在使用C语言编写程序时,使用动态内存是不可避免的,因此了解动态内存管理函数也是必要的。
用户10788736
2023/10/16
1700
C语言/动态内存管理函数
Linux Shell函数返回值
1) return 语句 shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回。 示例:
阳光岛主
2019/02/19
9.2K0
【C语言】calloc()函数详解(动态内存开辟函数)
我们先来看一下cplusplus.com - The C++ Resources Network网站上calloc()函数的基本信息:
修修修也
2024/04/01
3740
【C语言】calloc()函数详解(动态内存开辟函数)
【C语言】realloc()函数详解(动态内存开辟函数)
我们先来看一下cplusplus.com - The C++ Resources Network网站上realloc()函数的基本信息:
修修修也
2024/04/01
5260
【C语言】realloc()函数详解(动态内存开辟函数)
【C语言】malloc()函数详解(动态内存开辟函数)
我们先来看一下cplusplus.com - The C++ Resources Network网站上malloc()函数的基本信息:
修修修也
2024/04/01
1.7K0
【C语言】malloc()函数详解(动态内存开辟函数)
【C语言】free()函数详解(动态内存释放函数)
我们先来看一下cplusplus.com - The C++ Resources Network网站上free()函数的基本信息:
修修修也
2024/04/01
8910
【C语言】free()函数详解(动态内存释放函数)

相似问题

不受欢迎的语言开发中的问题(如维护)

130

动态类型语言(如)是否进行任何动态类型检查?

30

在哪种语言中,方法不返回值而函数返回值?

20

维护跨语言的方法签名?

20

如何减少动态语言(如python )中的错误,并提高代码质量

50
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文