Должны ли предварительные методы быть публичными или частными? - PullRequest
1 голос
/ 13 июня 2019

Код предусловия в методах markStudent (...) и getUnitMark (...) использует другой метод класса: isEnrolled (...) и hasCompletedAssessments (...).

import java.util.ArrayList; 
import java.util.HashMap;
public class Unit {
    private String code;
    private String name;
    private HashMap<Integer, Student> enrolledStudents = new HashMap<Integer, Student>(); 
    private AssessmentScheme assessmentScheme = null;
    private HashMap<Assessment, HashMap<Student, Mark> > Marks

    public Unit(String newCode, String newName) { code = newCode;
             name = newName;
       }
    public void enrolStudent(Student newStudent) {
             enrolledStudents.put(newStudent.getPersonID(), newStudent);
       }
    public void unenrolStudent(Student student) {
             enrolledStudents.remove(student.getPersonID());
       }

    public boolean isEnrolled(Student student) {
            return enrolledStudents.containsKey(student.getPersonID()); }
    public ArrayList<Student> getEnrolledStudents() {
            ArrayList<Student> students = new ArrayList<Student (enrolledStudents.values());
            return students; }

    public boolean hasCompletedAssessments(Student student) { boolean hasCompleted = true;
            for (Assessment a : assessmentScheme.getAssessments()) {       hasCompleted &= Marks.get(a).containsKey(student);
} 
    return hasCompleted; }

    public void markStudent(Assessment assessment, Student student, int score, String comment) throws Exception {
        /* Start Preconditions */
        // Precondition: studentEnrolledInUnit
        if (! isEnrolled(student)) {
             } throw new Exception("Precondition violated: studentEnrolledInUnit");
        // Precondition: scoreInValidRange
        if ((score < 0 || (score > assessment.getWeight()) } 
            throw new Exception("Precondition violated: scoreInValidRange"); /* End Preconditions */
        Mark mark = new Mark(assessment, student, score, comment);
               Marks.get(assessment).put(student, mark);
}

Вопрос в том, должны ли методы, используемые в коде предусловия, такие как isEnrolled (...) и hasCompletedAssessments (...), быть открытыми или закрытыми?

Исходя из моего понимания дизайна по контракту, клиент должен проверить, соответствуют ли его аргументы предварительному условию. Это означает, что методы, используемые в коде предусловия, должны быть общедоступными, чтобы клиентские классы могли выполнять проверку. Однако в методе markStudent ясно видно, что метод проверяет свое собственное предварительное условие. Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 13 июня 2019

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

Для реализации метода вполне нормально также выполнять свою собственную проверку, вызывая открытый метод.

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