Код предусловия в методах 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 ясно видно, что метод проверяет свое собственное предварительное условие. Может кто-нибудь помочь?