Ограничьте область действия метода одним другим классом только в oop
Это простой сценарий в офисе между сотрудником и его менеджером. В реальном мире менеджер может управлять многими сотрудниками, но для простоты рассмотрим ситуацию между одним сотрудником и его менеджером.
здесь и менеджер, и сотрудник имеют атрибут имени
- менеджер может только изменить свое имя
- работник может только изменить свое имя
только сотрудник имеет атрибут назначения
- обозначение может меняться только в яслях
Для приведенного выше сценария я создал эту диаграмму классов
реализовать вышеописанный сценарий, используя код 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;
}
}
Но
- Здесь я делаю
Employee.changeName()
метод приватный, чтобы менеджер не сменил имя сотрудника это правильный подход? changeDesignation()
метод находится вEmployee
класс может получить доступ как кEmployee
Класс это сам, а такжеManager
Класс это означает, что менеджер может изменить назначение сотрудника и сотрудник может также изменить его / ее назначение, я хочу предотвратить это и сделать так, чтобы менеджер был единственным, кто может изменить назначение сотрудника. Как реализовать это в коде?
2 ответа
Ну, есть некоторые вещи, которые следует учитывать в этом сценарии. Даже если это имеет смысл, если вы считаете себя сущностями реального мира, обычно ОО-практикой не рекомендуется позволять объекту изменять состояние другого объекта.
При этом, если вы не хотите, чтобы какой-либо другой класс изменял свойство одного класса, вы должны сделать это поле закрытым и вообще не предоставлять никакого установщика.
Что касается обозначения, вы не можете помешать объекту изменять его свойства, если только он не окончательный, но тогда менеджер не может его изменить.
Я полагаю, у вас может быть класс Обозначение, и сделать его так, чтобы его мог создать только менеджер. Но даже тогда сотрудник мог установить его на ноль.
Или вы могли бы иметь класс Обозначения, содержащий ссылку на одного или нескольких сотрудников, тогда только менеджер мог получить доступ к объектам обозначения.
Как я уже сказал, я думаю, что это один из тех моментов, когда ОО-моделирование не совсем соответствует реальному миру. Классы должны нести ответственность за свое собственное состояние и иметь собственный набор правил для любых изменений состояния. Любой другой класс должен иметь возможность только попросить или запросить изменение.
Надеюсь, поможет!
Ну, я не знаю домен или в каком контексте вы спрашиваете, но имя должно быть частью конструктора, а не параметром операции. Могут быть причины, по которым можно сменить имя. Но в реальном мире объект назван при создании и сохраняет это имя до самого конца. Личное changeName
просто кажется бессмысленным.
Для 2-й пули вам нужно добавить ограничение типа { can only be invoked by Manager instances }
,