Я пытаюсь проверить инкапсуляцию, считается ли это, если я вызываю новый Obj для проверки? - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь проверить инкапсуляцию.

Я сделал два отдела объектов и сотрудника.

Департаменту передан экземпляр Employee, затем для проверки на инкапсуляцию я следую этим правилам

1. Отображение сведений о сотруднике

2. Отображение сведений об отделе

3. Измените значения в объекте Сотрудника

4. Снова отобразите сведения об отделе (Информация не должна меняться)

5. Снова отобразить сведения о сотруднике (здесь необходимо изменить информацию).

Это работает, но я неправильно понимаю идею инкапсуляции, создавая новый экземплярсотрудника1 ????

Или

Должен ли я устанавливать значения для истинной инкапсуляции

employee1.setName("Sam")

Это изменяет второй вызов display () имени отдела на Sam.

//Main
package question1;

public class Test {

    public static void main(String[] args) {
        //Creating a instance of both Employee and Department
        Employee employee1 = new Employee("2726354E", "Bob Ings", 30000 );
        Department mainDepartment = new Department("Main Floor", employee1);

        //Displaying both instances of Employee and Department
        employee1.display();    
        mainDepartment.display();

        System.out.println("");     


        //Changing values in constructor for the instance of Employee we made earlier on 
        employee1 = new Employee("626347B", "Sam O'Conor", 24000);

        mainDepartment.display();

        System.out.println("");     
        System.out.println("");

        employee1.display();

    }

}



//Employee Class
package question1;

public class Employee {
    private String ppsNum;
    private String name;
    private double salary;

    //Parameterized constructor 
    public Employee(String ppsNum, String name, double salary) {
        this.ppsNum = ppsNum;
        this.name = name;
        this.salary = salary;
    }

    //Displaying the instance of the object information in a anesthetically pleasing manner
    public void display() {
        System.out.println("Employee Information");
        seperationLine();
        System.out.println("Name: " + getName());
        seperationLine();
        System.out.println("PPS number: " + getPpsNum());
        seperationLine();
        System.out.println("Salary: " + getSalary() + "0");
        seperationLine();
        System.out.println("\n");


    }}

//Department Class
package question1;

public class Department {
    private String deptName;
    private Employee employee;
    private int officeNumber;

    //Constructor with all three parameters 
    public Department(String deptName, Employee employee, int officeNumber) {

        this.deptName = deptName;
        this.employee = employee;
        this.officeNumber = officeNumber;
    }

    //Constructor with the officeNumber set to 0
    public Department(String deptName, Employee employee) {

        this.deptName = deptName;
        this.employee = employee;
        this.officeNumber = 0;
    }

    //Displaying the instance of the object information in a anesthetically pleasing manner
    public void display() {
        System.out.println("Department");
        Employee.seperationLine();
        System.out.println("Department Name: " + getDeptName());
        Employee.seperationLine();
        System.out.println("Employee: " + employee.toString());
        Employee.seperationLine();
        System.out.println("Office Number: " + getOfficeNumber());

    }

}

1 Ответ

2 голосов
/ 18 октября 2019

Не существует такого понятия, как «тестирование» инкапсуляции.

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


Хорошая инкапсуляция означает, что вы выполняете два шага:

  1. Вся соответствующая информация должна храниться вместе. Пример:Сотрудник должен иметь только информацию о сотруднике, а отдел должен иметь только информацию об отделе. Сотрудник не должен хранить, на каком этаже находится конкретный отдел. Или даже не должен иметь метод с именем seperationLine () . (IMO, метод seperationLine () принадлежит другому классу Presentor)
  2. Только общедоступная информация должна быть общедоступной. Все остальные должны быть конфиденциальными или защищенными. Цель состоит не в том, чтобы быть скрытным, а в том, чтобы предотвратить потенциальные проблемы со стороны внешних действующих лиц, изменяющих информацию, которую они не должны изменять. Пример: Сотрудник не должен устанавливать этаж отдела.

Просто посмотрите на класс Employee и установите в приват все те поля и методы, которые, по вашему мнению, не должны быть доступны снаружи. Кроме того, для получения информации, необходимой Департаменту от Employee, создайте метод в классе Employee, который может вызывать Департамент. Таким образом, сотрудник не может быть изменен отделом, но он может получить доступ к необходимой информации.

...