【问题标题】:Limit the scope of a method to one other class only in oop仅在 oop 中将方法的范围限制为另一个类
【发布时间】:2019-03-20 13:52:32
【问题描述】:

这是员工和经理之间办公室的一个简单场景。 在现实世界中,经理可以管理许多员工,但为了简单起见 在这里考虑一位员工和他的经理之间的情况

在这里经理和员工都有姓名属性

  • 经理只能改名
  • 员工只能改名

只有员工有职称属性

  • 名称只能由经理更改

对于上述场景我创建了这个类图

使用java代码实现上述场景如下图 (请注意此代码为伪代码,也不包括编排代码,语法可能错误)

class Manager{
  private String name;
  private Employee employee;


    //assign name and create association link between employee 
    Manager(Employee employee,String managerName ){
        this.employee    = employee;
        this.name        = managerName;
    }

    //manager can change his name
    private void changeName(String managerName){
        this.name = managerName;
    }


    //only manager can change Employee designation
    private void changeEmpDesignation(String empDesignation){
        this.employee.changeDesignation(empDesignation);
    }

}

/* --------------------------- */


class Employee{
    private String name;
    private String designation;

    Employee(String name ,String designation ){
        this.designation = designation;
        this.name        = name;
    }

    //only Employee can change his name 
    private void changeName(String empName){
        this.name = empName;
    }

    //only manager can change Employee designation
    public void changeDesignation(String empDesignation){
        this.designation = empDesignation;
    }

}

但是

  1. 在这里我将Employee.changeName() 方法设为私有,以防止经理更改员工姓名,这是正确的方法吗?
  2. changeDesignation() 方法在 Employee 类中可以同时访问 Employee 类它自己和 Manager 类这意味着 经理可以更改员工的名称,员工也可以更改他/她的名称,我想防止这种情况发生并让经理是唯一能够更改员工名称的人。如何在代码中实现它?

【问题讨论】:

    标签: java oop uml encapsulation ooad


    【解决方案1】:

    嗯,在这种情况下需要考虑一些事情。即使您将其视为现实世界的实体很有意义,但让一个对象更改另一个对象的状态通常不是一个好的 OO 实践。

    话虽如此,如果您不希望任何其他类更改一个类的属性,您应该将该字段设为私有并且根本不提供任何设置器。

    至于指定,你不能真正阻止一个对象修改它的属性,除非它是最终的,但是经理也不能改变它。

    我想你可以有一个 Designation 类,并让它只有经理可以实例化它。但即便如此,员工也可以将其设置为 null。

    或者您可以让 Designation 类保存对一名或多名员工的引用,然后只有经理可以访问指定对象。

    正如我所说,我认为这是 OO 建模并不真正适合现实世界的时代之一。类应该对自己的状态负责,并为任何状态变化持有自己的一套规则。任何其他班级应该只能提出或要求更改。

    希望对你有帮助!

    【讨论】:

    • [让一个对象改变另一个对象的状态通常不是一个好的OO实践。]然后如何实现由经理更改员工指定
    • 如果您想让经理更改员工名称,您应该有一个公共设置器。但是任何其他类也可以改变它。
    • 如果我检查 setter 调用的对象,这是怎么回事?只有 Manager 的实例可以改变这一点。可以被所有实例调用,但只能更改 Manager 类型的实例。 @TomazFernandes
    • 一种方法是将 Manager 对象添加到 setter 签名中。然后它将是 setDesignation(String designation, Manager manager)。您不会真正在方法中使用 manager 对象,但它会充当 setter 的键
    【解决方案2】:

    好吧,我不知道您要问的域或上下文,但名称应该是构造函数的一部分,而不是操作的参数。 “可能”有原因可以更改名称。但在现实世界中,一个对象在创建时被命名并保持这个名称直到最后。私人changeName 似乎毫无意义。

    对于第二个项目符号,您需要添加一个约束,例如 { can only be invoked by Manager instances }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2011-05-09
      • 2012-10-18
      相关资源
      最近更新 更多