现实世界中的封装到底是什么?[重复]

问题描述 投票:0回答:1

我很惭愧地问这个问题,但它已经困扰了我多年.我是一家大公司的高级开发员,从2013年开始。

我的工作是JAVA JEE(主要是后端)和Android开发(JAVA)。

我们有大量的 "Value Objects","DTOs "等等,每个对象都有私有属性和gettersetters。每个属性都会有一个gettersetter。

public class UserVo {

    private String name;
    private String email;
    private String password;

    public UserVo(String name, String email, String password) {
        this.name = name;
        this.email = email;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

当我问为什么不把它们公开,我被告知:"这是因为封装,像这样的值是安全的,不能直接修改。"是的,它们可以,你可以直接做myObject.setMyProperty(a value)。

那为什么呢,为什么我们要把getter和setter放在那些对象的每个属性上呢,为什么不使用公共属性呢?

我在多个大型项目中,这些东西无处不在.通常你从数据库中得到一个实体,然后你把它转换成一个 "VO",这个 "VO "和实体的对象完全一样,同样的属性,同样的getteretter。

或者有时人们想把数据移动到比列表或多个变量更可读的东西中,并创建自己的 "VO",并为每个变量提供一些私有属性和getterssetters。

如果有人用公共字段来制作它们,那么猎奇就开始了,每个人都在笑着说 "ooh you don't know about encapsulation?", "NEVER make public fields!", "Have you been to school?".坦率地说,每个人都这样做,但没有人知道为什么。

哦,我知道价值对象模式说它们是不可变的,但在现实生活中,它们不是,至少在我工作的7个项目中不是。

我所有项目的通用架构都是.NET。

.................
Dao and Managers -> they return entities
.................
Value objects that have the same structure than your entities (sometimes they name them DTOs)
.................
View controllers (JAVE JEE) / Activity or Fragments (Android)
.................

层隔离是另一个主题,这只是为了告诉你我们在哪里使用价值对象,然后在视图层使用VO (并根据用户的操作进行修改),然后再发回给管理人员,由他们建立实体并持久化。

对这个问题有什么想法吗?谢谢。

java design-patterns architecture encapsulation
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.