.net - 不可变对象(immutable对象)的约定

当你设计不可变类时,你喜欢:

Layer.ColorCorrect ( layer )

layer.ColorCorrect ( )

对我而言,#1 似乎比#2 更直观,它看起来修改了引用的对象,因为它是一个实例方法,它还不如更改内部结构,对吧?

最佳答案

我更愿意使用实例方法,但选择名称以反射(reflect)它不会更改现有实例这一事实。例如:

layer.AfterColorCorrection()

layer.WithCorrectedColors()

使用静态方法很快就会变得乏味。此外,如果您向用户明确表示该类型是不可变的,他们应该会很快掌握这一点。每个人都被 String.Replace 绊倒了,实际上并没有替换目标中的任何东西——但他们不会一直犯同样的错误。 还有更好的名字你应该没问题。

我问了一个related question关于“添加”到不可变列表 - IMO 的最佳解决方案是使用“Plus”而不是“Add”;同样,这并不意味着原始值已更改。您可能会发现该问题的其他答案很有用。

https://stackoverflow.com/questions/706424/

相关文章:

email - Rails 3 检查电子邮件地址是否真实

php - 网页如何在下次登录时记住您?

perl - 如何将 Data::Dumper 输出转换回 Perl 数据结构?

sql - 如何在 SQL Server 2005 数据库中使用 T-SQL 用零填充 NVARCH

regex - 字符串末尾的正则表达式 _#

sql-server-2008 - 从 SQL 表中的一行中删除尾随 ":"字符

php - session.gc_maxlifetime 不适合我

php - 在创建 PHP 类实例时运行代码?

php - !is_null() 没有按预期工作

php - 寻找一个新的适用于 Windows 的轻量级 php 编辑器