sfl*_*che 12 deterministic idempotent
它们(幂等函数和确定性函数)只是在给定相同输入的情况下返回相同结果的函数吗?
或者是否有我失踪的区别?(如果有区别,请你帮我理解它是什么)
Dai*_*Dai 15
用更简单的术语来说:
幂等性并不意味着确定性(因为函数可以在第一次调用时改变状态而在后续调用中是幂等的),但是所有确定性函数本质上都是幂等的(因为在调用之间没有内部状态持续存在).
例如,在SQL中UCASE(val),或在C#/ .NET String.IndexOf中都是确定性的,因为输出仅取决于输入.请注意,在实例方法(例如IndexOf)中,实例对象(即隐藏this参数)计为输入,即使它是"隐藏"的:
"foo".IndexOf("o") == 1 // first cal
"foo".IndexOf("o") == 1 // second call
// the third call will also be == 1
Run Code Online (Sandbox Code Playgroud)
在SQL NOW()或C#/ .NET DateTime.UtcNow中,虽然输入保持不变,但输出仍然是相同的(注意.NET中的属性getter等同于除了隐式this参数之外不接受任何参数的方法):
DateTime.UtcNow == 2016-10-27 18:10:01 // first call
DateTime.UtcNow == 2016-10-27 18:10:02 // second call
Run Code Online (Sandbox Code Playgroud)
.NET中的一个很好的例子是Dispose()方法:请参见IDisposable.Dispose()实现是否是幂等的?
Dispose方法应该可以多次调用而不会抛出异常.
因此,如果父组件X进行初始调用,foo.Dispose()那么它将调用处理操作,X现在可以考虑foo处理.执行/控制然后传递到另一个组件Y,该组件也试图处理foo,在Y调用之后foo.Dispose()它也可以预期foo被处理(它是),即使X已经处理它.这意味着Y不需要检查是否foo已经处理,节省了开发人员的时间 - 并且还消除Dispose了第二次调用可能引发异常的错误,例如.
另一个(普通)的例子是在REST:对于HTTP1.1的RFC规定GET,HEAD,PUT,和DELETE是幂等的,但POST不是(https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)
方法也可以具有"幂等"的属性(除了错误或到期问题)N> 0个相同请求的副作用与单个请求相同.方法GET,HEAD,PUT和DELETE共享此属性.此外,方法OPTIONS和TRACE不应该有副作用,因此本质上是幂等的.
所以如果你使用DELETE那么:
Client->Server: DELETE /foo/bar
// `foo/bar` is now deleted
Server->Client: 200 OK
Client->Server DELETE /foo/bar
// foo/bar` is already deleted, so there's nothing to do, but inform the client that foo/bar doesn't exist
Server->Client: 404 Not Found
// the client asks again:
Client->Server: DELETE /foo/bar
// foo/bar` is already deleted, so there's nothing to do, but inform the client that foo/bar doesn't exist
Server->Client: 404 Not Found
Run Code Online (Sandbox Code Playgroud)
因此,您在上面的示例中看到DELETE幂等,因为服务器的状态在最后两个DELETE请求之间没有变化,但它不是确定性的,因为服务器返回200第一个请求但是404第二个请求.
确定性函数只是数学意义上的函数.给定相同的输入,您总是得到相同的输出.另一方面,幂等函数是满足同一性的函数
f(f(x)) = f(x)
Run Code Online (Sandbox Code Playgroud)
举个简单的例子.如果UCase()是一个将字符串转换为大写字符串的函数,那么显然UCase(Ucase(s)) = UCase(s).
幂等函数是所有函数的子集.
一个确定性的函数将返回相同的结果对于相同的输入,无论多少次,你叫它的。
的幂函数可能不会返回相同的结果(它会返回结果相同的形式,但该值可能有所不同,请参见http下面的例子)。它只保证它不会有副作用。换句话说,它不会改变任何东西。
例如,GET动词在 HTTP 协议中是幂等的。如果您调用“~/employees/1”,它将以特定格式返回 ID 为 1 的员工的信息。它不应该改变任何东西,而只是简单地返回员工信息。如果您调用它 10 次、100 次左右,返回的格式将始终相同。然而,它绝不是确定性的。也许如果你第二次调用它,员工信息已经改变,或者员工甚至不存在了。但绝不应该有副作用或以不同的格式返回结果。
我的看法
Idempotent 是一个奇怪的词,但知道它的起源会很有帮助,idem 的意思是相同的,有力的意思是力量。换句话说,这意味着拥有相同的力量,这显然并不意味着没有副作用,所以不确定它来自哪里。一个经典的例子计算机科学中只有两件难事,缓存失效和命名事情。为什么他们不能只使用只读?哦等等,他们想听起来更聪明,也许?也许像圈复杂度?
| 归档时间: |
|
| 查看次数: |
2833 次 |
| 最近记录: |