为什么我应该避免在 getter 和 setter 中包装字段?

All*_*uan 11 dart flutter

我正在构建一个 Flutter 应用程序。我有一个看起来像这样的课程:

class ToDo {
    String _title;
    bool _done;

    String get title => _title;
    void set title(String newTitle) { _title = newTitle; }

    bool get _done => _done
    void set done(bool done) { _done = done; }
}
Run Code Online (Sandbox Code Playgroud)

但是 Dart linter 抱怨我应该“为了安全起见,避免在 getter 和 setter 中包装字段”。然而,这对我来说没有多大意义。现在 getter 没有用,但是如果将来我需要在从外部访问变量之前进行某种处理怎么办?我所要做的就是更新吸气剂。但是,如果属性是公开的并且可以直接访问,那么如果某些业务规则发生变化,我将不得不更新整个代码库。

那么这个警告有什么意义呢?或者,换句话说,为什么创建“无用的吸气剂”是一种不好的做法?

jam*_*lin 17

但是,如果属性是公开的并且可以直接访问,那么如果某些业务规则发生变化,我将不得不更新整个代码库。

问问自己:如果您必须将公共成员更改为显式 getter 和 setter,您究竟需要在 Dart 代码库中更改哪些内容?

在大多数语言中,getter 和 setter 看起来像是对消费者的方法调用。如果您想用公共 getter 和 setter 替换公共数据成员,那将是一个破坏性的 API 更改,需要对使用它的所有内容进行更改。

Dart 不是这样的。getter和setter方法都没有像方法调用给消费者; 它们与直接成员访问没有区别。(拥有一个公共数据成员隐式声明了相应的 getter 和 setter 作为类接口的一部分。)将公共数据成员更改为公共 getter 和 setter 不需要对调用者进行任何更改,因此在私有成员周围提供简单的 getter 和 setter变量没有任何好处。

(您遇到的unnecessary_getters_setterslint的文档也对此进行了解释。)

顺便说一句,当您同时提供 gettersetter(这不是您的示例代码所做的)unnecessary_getters_setters时,才会发生 lint 。如果您只提供一个,那么它就不再等同于公共数据成员。