OOP 是否应该所有属性都有 getter 和 setter

Mar*_*ace 3 oop design-patterns

我一直为大多数类属性提供 getter 和 setter。

虽然我读过这很糟糕 - http://www.codeweavers.net/getters-and-setters-are-evil/

依赖注入和单元测试不需要大多数属性都有一个 setter 吗?

Shi*_*dim 5

应始终使用 getter 和 setter。getter 或 setter原因不是为内部属性提供公共接口,而是提供对属性读/写的控制。它们提供对类属性的抽象。

即使您的类属性是私有的,您也需要 getter 和 setter。这允许在分配或读取之前控制值。

想想你很久以前设计的一个类,你对每次阅读做一些常见的计算。

class A{
    private decimal x;
    public void do_stuff(){
        decimal a = this.x/70;
        // process with a
    }
    public void do_anoter_stuff(){
        decimal a = this.x/70;
        // process again a
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您要更改因子 (70)。你怎么做呢?在每个地方都改变它?最好这样设计。

class A{
    private decimal x;
    private get_x(){ return this.x/70; }
    public void do_stuff(){
        // process with get_x()
    }
    public void do_anoter_stuff(){
        // process again get_x()
    }
}
Run Code Online (Sandbox Code Playgroud)

事实上,盲目地为每个属性使用 getter 和 setter 是邪恶的。经验法则是。使用私有 getter 和 setter 将所有属性声明为私有。稍后更改 getter 和 setter 的可见性,仅在需要时允许从外部世界访问