【问题标题】:I'm confused about how encapsulation should work我对封装应该如何工作感到困惑
【发布时间】:2018-12-29 09:14:51
【问题描述】:

你好。今天我想玩一些好的 OOP 设计概念,我尝试为电影商店编写一个应用程序,客户可以从电影商店购买电影。我有三个班。一个代表电影商店的类,一个代表客户的类和另一个代表电影的类。

现在我的问题是:让客户自己创建电影实例而不从电影商店购买它是否很好?我应该相信编写客户类的程序员吗?这个问题与封装有关吗?

【问题讨论】:

  • 请向我们展示您所做的,以便我们帮助您进行设计。另外,标注的时候要小心,这和java还没有任何关系。
  • 你做错了。客户和电影是状态,它们是您的类应该了解(封装)和谈论(消息传递)的内容,而不是您的类应该建模的内容。围绕解决方案系统职责设计您的课程,而不是问题域实体。
  • 你能再解释一下吗?

标签: java oop encapsulation software-design solid-principles


【解决方案1】:

封装意味着将数据成员声明为私有并通过 setter 和 getter 等公共方法访问它们。对于您的示例,在您的场景中,您希望拥有一个 Movie 类型的私有变量。您可以通过公共 get 方法访问 Movie,在该方法中您可以在访问 Movie 对象之前获得某种授权。 setter 方法也是如此。这称为封装。例如,看基本实现:

class MovieStore{

    private Movie currentPlaying;

    public Movie getCurrentPlayingMovie(){    //Get method
        if(authorizationMethod()){
            return currentPlaying;
        }
        //Authorization failed

        notifyAuthorizationFailed();
        return null;
    }

    public void setCurrentPlayingMovie(Movie m){    //Set method
        //Same like above
    }

}

如果您已将 Movie 对象声明为公开,则任何人都可以直接访问该电影对象,而您无法获得任何授权。在开发软件时,数据成员似乎不需要任何保护。但将来可能需要它,因此最好始终实现封装(通过将它们声明为私有并向该成员添加 setter 和 getter),以便您可以在需要时编辑方法。

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2015-01-13
    • 2023-04-08
    • 2019-08-31
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多