【发布时间】:2020-03-10 08:49:57
【问题描述】:
查看我们的代码库,我看到很多情况,派生类型的字段使您期望它们在初始化后保持不变,理想情况下,一次全部初始化并且之后永远不会更改(如“值类型”)。
在实践中,已经建立了快速解决方案,因此字段是否更改甚至它包含的内容可能取决于代码路径,从而导致到处都有大量的 IF-ELSE 级联,使代码难以遵循并且易受更改影响。
这让我想知道:是否可以强制执行诸如字段不变性之类的约束?
【问题讨论】:
-
没有“变量一旦设置一次就不能改变值”的概念(即使对于组件也是如此),但是封装方法(带有 getter 的私有组件)是否适合您的需求?
-
@francescalus 并非如此,因为字段通常是数组。返回数组的副本效率低下,返回指针需要能够将该指针标记为“指向不可变事物”,并且据我所知,无法通过访问器函数以某种方式访问数组允许切片语法。
-
您需要对这些派生类型执行哪些操作?如果它们的数量相当少,您可以编写一个执行它们的例程库吗?
-
Protected 总是让我有点失望,我真的希望它应用于派生类型定义,这意味着该类型的所有变量只能由包含模块修改,而不仅仅是与使用相关的那种类型的变量——“全局”变量让我很紧张。而且我认为这将更接近 OP 想要的。
-
真正的主要问题是沟通。如果我有
IMMUTABLE TYPE之类的东西,那将清楚地与同事沟通,不要将可变字段添加到该类型(例如记录器状态信息),并为将来使用该类型读取代码的人提供明显的保证。
标签: fortran immutability