Ограничьте область действия метода одним другим классом только в oop - PullRequest
0 голосов
/ 16 октября 2018

Это простой сценарий в офисе между сотрудником и его менеджером.В реальном мире менеджер может управлять многими сотрудниками, но для простоты рассмотрим ситуацию между одним сотрудником и его менеджером

здесь и менеджер, и сотрудник имеют атрибут имени

  • менеджер может изменить только свое имя
  • сотрудник может изменить только свое имя

только сотрудник имеет атрибут назначения

  • назначение можеттолько изменение с помощью менеджера

Для вышеупомянутого сценария я создал эту диаграмму классов

enter image description here

Реализация вышеуказанного сценария с использованием 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()метод private для предотвращения смены менеджера именем сотрудника - это правильный подход?
  2. changeDesignation() метод находится в Employee класс может получить доступ как к Employee класс сам, а также Manager класс это означает, что менеджерn Изменить назначение сотрудника и сотрудник также может изменить его / ее назначение. Я хочу предотвратить это, и только менеджер сможет изменить назначение сотрудника. Как реализовать это в коде?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Ну, я не знаю домен или в каком контексте вы спрашиваете, но имя должно быть частью конструктора, а не параметром операции.Могут быть причины, по которым можно сменить имя.Но в реальном мире объект назван при создании и сохраняет это имя до самого конца.Приватный changeName просто кажется бессмысленным.

Для 2-го пункта вам нужно добавить ограничение типа { can only be invoked by Manager instances }.

0 голосов
/ 16 октября 2018

Что ж, есть некоторые вещи, которые следует учитывать в этом сценарии.Даже если это имеет смысл, если вы считаете себя сущностями реального мира, обычно ОО-практикой не рекомендуется позволять объекту изменять состояние другого объекта.

При этом, если вам не нужны другиекласс, чтобы изменить свойство одного класса, вы должны сделать это поле закрытым и вообще не указывать установщик.

Что касается обозначения, вы не можете помешать объекту изменять его свойства, если только он не окончательный, но тогдаменеджер также не может его изменить.

Полагаю, у вас может быть класс Обозначения, и вы можете сделать его так, чтобы его мог создать только менеджер.Но даже в этом случае сотрудник может установить для него значение NULL.

Или вы можете сделать так, чтобы класс Designation содержал ссылку на одного или нескольких сотрудников, тогда только менеджер мог получить доступ к объектам назначения.

КакЯ сказал, я думаю, что это один из тех случаев, когда ОО-моделирование не совсем соответствует реальному миру.Классы должны нести ответственность за свое собственное состояние и иметь собственный набор правил для любых изменений состояния.Любой другой класс должен иметь возможность только запросить или запросить изменение.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...