对于华丽的标题感到抱歉 - 如果我能想出一个简洁的标题,我就不用问这个问题了.
假设我有一个不可变的列表类型.它有一个操作Foo(x),它返回一个带有指定参数的新的不可变列表作为最后的额外元素.因此,要建立一个值为"Hello","immutable","world"的字符串列表,您可以编写:
var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");
Run Code Online (Sandbox Code Playgroud)
(这是C#代码,如果您觉得语言很重要,我最感兴趣的是C#建议.这不是一个基本的语言问题,但语言的习语可能很重要.)
重要的是现有的列表不会被改变Foo- 所以empty.Count仍然会返回0.
获得最终结果的另一种(更惯用的)方式是:
var list = new ImmutableList<string>().Foo("Hello")
.Foo("immutable")
.Foo("word");
Run Code Online (Sandbox Code Playgroud)
我的问题是:Foo最好的名字是什么?
编辑3:正如我稍后透露的那样,该类型的名称可能实际上并不存在ImmutableList<T>,这使得该位置清晰.想象一下,它是TestSuite并且它是不可变的,因为它所属的整个框架是不可变的......
(编辑完3)
到目前为止我提出的选项:
Add:常见于.NET,但意味着原始列表的变异Cons:我相信这是函数式语言中的正常名称,但对于没有这些语言经验的人来说毫无意义Plus:我最喜欢的,它并不意味着我的变异.显然,这也用在Haskell中,但期望略有不同(Haskell程序员可能希望它将两个列表一起添加而不是将一个值添加到另一个列表中).With:与其他一些不可变的约定一致,但它与IMO没有完全相同的"附加性".And:不是很具描述性.我用来选择的标准是:
如果我不够清楚,请询问更多细节......
编辑1:这里是我的喜欢推理Plus来Add.考虑以下两行代码:
list.Add(foo); …Run Code Online (Sandbox Code Playgroud) 创建无法在PHP中更改的对象是一个好主意吗?
例如,具有setter方法的日期对象,但它们将始终返回对象的新实例(具有修改日期).
这些对象是否会让使用该类的其他人感到困惑,因为在PHP中,您通常希望对象发生变化?
例
$obj = new Object(2);
$x = $obj->add(5); // 7
$y = $obj->add(2); // 4
Run Code Online (Sandbox Code Playgroud)