next up previous contents
Next: Catching Cheating via MOSS Up: Re-engineering CS&E's Instructional Processes Previous: Predictive Grade Feedback   Contents

The OKI Model

Here, in C++ notation, is the full OKI model:

class CourseManagementManager {
  // single instance class
  CanonicalCourse createCanonicalCourse(String title, String number, 
                  String description, Type courseType);
  CourseGroup     createCourseGroup(Type courseGroupType);
  GradeRecord     createGradeRecord(Agent studet, Id courseOfferingId, 
                  Type gradeType, Serializable grade);
  Term            createTerm(Type termType, ScheduleItemIterator schedule);
  void            deletCanonicalCourse(Id canonicalCourseId);
  void            deletCourseGroup(Id courseGroupId);
  void            deleteGradeRecord(Id gradeRecordId);
  void            deleteTerm(Id termId);
  CanonicalCourse           getCanonicalCourse();
  CanonicalCourseIterator   getCanonicalCourses();
  CanonicalCourseIterator   getCanonicalCourses(Type courseType);
  CourseGroup               getCourseGroup();
  CourseGroupIterator       getCourseGroups();
  CourseGroupIterator       getCourseGroups(Type courseGroupType);
  TypeIterator              getCourseGroupTypes();
  CourseOffering            getCourseOffering(Id courseOfferingId);
  CourseSection             getCourseSection(Id courseSectionId);
  TypeIterator              getCourseTypes();
  GradeRecordIterator       getGradeRecords(Agent student, Id courseOfferingId,
                            Type gradeType);
  TypeIterator    getGradeTypes();
  TypeIterator    getOfferingTypes();
  TypeIterator    getSectionTypes();
  TypeIterator    getStatusTypes();
  TypeIterator    getStudentTypes();
  Term            getTerm(Id termId);
  TermIterator    getTerms();
  TypeIterator    getTermTypes();
  // implied attributes
  set<CanonicalCourse>   canonicalCourses;
  set<CourseGroup>       courseGroups;
  set<Type>              courseGroupTypes;
  set<Type>              courseTypes;
  set<Type>              gradeTypes;
  set<Type>              offeringTypes;
  set<Type>              sectionTypes;
  set<Type>              statusTypes;
  set<Type>              studentTypes;
  set<Term>              terms;
  set<Type>              termTypes;
} theCourseManagementManager;

class CanonicalCourse {
  void            addEquivalentCourse(CanonicalCourse canonicalCourse);
  void                      addTopic(Strig topic);
  CanonicalCourse           createCanonicalCourse(String title, String number, 
                            String description, Type courseType);
  CourseOffering            createCourseOffering(String title, String number, 
                            String description, Term term, Type offeringType);
  void                      deleteCanonicalCourse(Id canonicalCourseId);
  void                      deleteCourseOffering(Id courseOfferingId);
  CanonicalCourseIterator   getCanonicalCourses();
  CanonicalCourseIterator   getCanonicalCourses(Type courseType);
  CanonicalOfferingIterator getCourseOfferings();
  CanonicalOfferingIterator getCourseOfferings(Type offeringType);
  Type                      getCourseType();
  float                     getCredits()
  String                    getDescription();
  CanonicalCourseIterator   getEquivalentCourses();
  Id                        getId();
  String                    getNumber();
  String                    getTitle();
  StringIterator            getTopics();
  void                      removeEquivalentCourse(Id canonicalCourseId);
  void                      removeTopic(String topic);
  void                      updateCredits(float credits);
  void                      updateDescription(String description);
  void                      updateNumber(String number);
  void                      updateTitle(String title);
  // implied attributes
  set<CanonicalCourse>      canonicalCourses;
  set<CourseOffering>       courseOfferings;
  set<CanonicalCourse>&     equivalentCourses; // could be a CourseGroup
  set<String>               topics;
  float                     credits
  String                    description;
  String                    number;
  String                    title;
  // also needed
  set<CanonicalCourse>      prerequisites; // or course gp.  Omitted by OKI  
};

class CourseOffering {
  CourseSection             createCourseSection(String title, String number, 
                            String description, Type sectionType);
  void                      deleteCourseSection(Id courseSectionId);
  Id                        getAssetId();
  CanonicalCourse           getCanonicalCourse();
  CourseOfferingIterator    getCourseSections();
  CourseOfferingIterator    getCourseSections(Type sectionType);
  Type                      getStatus();
  String                    getDescription();
  Type                      getGradingOptionType();
  Id                        getId();                        
  String                    getNumber();
  Type                      getOfferingType();
  Term                      getTerm();
  String                    getTitle();
  void                      updateAssetId(Id assetId);
  void                      updateStatus(Type courseStatusType);
  void                      updateDescription(string description);
  void                      updateGradeType(Type gradingOptionType);
  void                      updateNumber(String number);
  void                      updateTitle(String title);
  // implied attributes
  Id                        assetId;
  const CanonicalCourse     canonicalCourse; // shouldn't this be a set of eqvs
  set<CourseSection>        courseSections;
  Type                      status;
  String                    description;
  Type                      gradingOptionType;
  String                    number;
  const Term                term;
  String                    title;
};

class CourseSection {
  void                      addStudent(Agent student);
  Id                        getAssetId();
  String                    getDescription();
  Id                        getId();
  Serializable              getLocation();
  String                    getNumber();
  AgentIterator             getRoster();
  ScheduleItemIterator      getSchedule();
  Type                      getSectionType();
  String                    getTitle();
  CourseOfferingIterator    getCourseOfferings();
  void                      removeStudent(Id studentId);
  void                      updateAsset(Id assetId);
  void                      updateDescription(String description);
  void                      updateLocation(Serializable location);
  void                      updateNumber(String number);
  void                      updateSchedule(ScheduleItem[] scheduleItems);
  void                      updateTitle(String title);
  // implied attributes
  Type                      status;  // open, closed, etc.  Omitted by OKI.
  Id                        assetId; // rooms, labs, etc.  Should be set
  String                    description;
  Serializable              location;
  String                    number;
  set<Agent>                roster;
  set<ScheduleItem>         schedule;
  String                    title;
  set<CourseOffering>       courseOfferings;
  // also need
  enrollment limits etc.
};

class Term {
  Id                        getId();
  ScheduleItemIterator      getSchedule();
  Type                      getTermType();
  // implied attributes
  set<ScheduleItem>         schedule;
};

class GradeRecord {
  Agent           getAgent();
  Id              getCourseOffering();
  Serializable    getGrade();
  Id              getId();
  Type            getType();
  void            updateGrade(Serializable grade);
  // implied attributes
  const Agent&    agent;
  const CourseOffering&    courseOffering;
  Serializable    grade;
};

class CourseGroup {
  void            addCourseToGroup(Id canonicalCourseId);
  CanonicalCourseIterator   getCourses();
  Id              getId();
  Type            getType();
  void            removeCourseFromGroup(Id canonicalCourseId);
  // implied attributes
  set<CanonicalCourse>  courses;  // a set of references.
};


// Grading

class GradingManager {
  Assignment      createAssignment(String name, String description,
                  Id courseSectionId, Id gradableObjectId, Type gradeType, 
                  ScoringDefinition scoringDefinition, GradeScale gradeScale);
  GradeRecord     createGradeRecord(Id assignmentId, Agent agent, 
                  Serializable gradeValue, Type gradeRecordType);
  void            deleteAssignment(Id assignmentId);
  void            deleteGradeRecord(Id gradeRecordId);
  AssignmentIterator  getAssignments(Id courseSectionId, Id gradableObjectId);
  GradeRecordIterator getGradeRecords(Id courseSectionId, Id assignmentId,
                      Agent agent, Type grdeRecordType);
  TypeIterator    getGradeRecordTypes();
  TypeIterator    getGradeScales();
  TypeIterator    getGradeTypes();
  TypeIterator    getScoringDefinitions();
  // implied attributes
  set<Assignment>  assignments;
  set<GradeRecord> gradeRecords;
  set<Type>       gradeRecordTypes;
  set<Type>       gradeScales;
  set<Type>       gradeTypes;
  set<Type>       scoringDefinitions;
};

class Assignment {
  Id              getCourseSectionId();
  String          getDescription();
  String          getDisplayName();
  Id              getGradableObject();
  Type            getGradeScale();
  Type            getGradeType();
  Id              getId();
  Type            getScoringDefinition();
  void            updateDescription(String description);
  void            updateDisplayName(String displayName);
  // implied attributes
  const CourseSection&  courseSectionId;
  String          description;
  String          displayName;
  const GradableObject&  gradableObject;  // what's assigned to be graded
  const Type      gradeScale;
  const Type      gradeType;
  const Type      scoringDefinition;
};

class GradeRecord {
  Agent           getAgent();
  Id              getAssignmentId();
  Serializable    getGradeValue();
  Type            getGradeType();
  Agent           getModifiedBy();
  Calendar        getModifiedDate();
  void            updateGradeValue(Serializable gradeValue);
  // implied attributes
  const Agent&    agent;
  const Assignment&  assignmentId;
  Serializable    gradeValue;
  const Agent&    modifiedBy;
  const Calendar  modifiedDate;
  const Type      gradeType;
};


// Assessments

class AssessmentManager{
  Assessment      createAssessment(String name, String description, 
                  Type AssessmentType);
  AssessmentPublished         createAssementPublished(Assessment assessment);
  Evaluation      createEvaluation(AssessmentTaken assessmentTaken,
                  Type evaluationType, Agent agent);
  Evaluation      createEvaluation(ItemTaken itemTaken, Type evaluationType, 
                  Agent agent);
  Evaluation      createEvaluation(SectionTaken sectionTaken,
                  Type evaluationType, Agent agent);
  Item            createItem(String name, String description, Type itemType);
  Section         createSection(String name, String description, 
                  Type sectionType);
  void            deleteAssessment(Id assessmentId);
  void            deleteAssessmenPublished(Id assessmentPublishedId);
  void            deleteEvaluation(Id evaluationId);
  void            deleteItem(Id itemId);
  void            deleteSection(Id sectionId);
  Assessment      getAssessment(Id assessmentId);
  AssessmentPublished         getAssessmentPublished(Id assessmentPublishedId);
  AssessmentIterator          getAssessments();
  AssessmentIterator          getAssessments(Type assessmentType);
  AssessmentPublishedIterator getAssessmentsPublished();
  AssessmentTakenIterator     getAssessmentsTaken();
  TypeIterator    getAssessmentTypes();
  TypeIterator    getEvaluationTypes();
  Item            getItem(Id itemId);
  ItemIterator    getItems();
  ItemIterator    getItems(Type itemType);
  TypeIterator    getItemTypes();
  Section         getSection(Id sectionId);
  SectionIterator getSections();
  SectionIterator getSections(Type sectionType);
  TypeIterator    getSectionTypes();
  // implied attributes
  set<Assessment> assessments;
  set<AssessmentPublished> assessmentsPublished;
  set<AssessmentTaken>     assessmentsTaken;
  set<Evaluation> evaluations;
  set<Item>       items;
  set<Section>    sections;
  set<Type>       assessmentTypes;
  set<Type>       evaluationTypes;
  set<Type>       sectionTypes;
  set<Type>       itemTypes;
};

class Assessment {
  void            addSection(Section section);
  Type            getAssessmentType();
  Serializable    getData();
  String          getDescription();
  String          getDisplayName();
  Id              getId();
  SectionIterator getSections();
  String          getTopic();
  void            orderSections(Section[] sections);
  void            removeSection(Id sectionId);
  void            updateData(Serializable data);
  void            updateDescription(String description);
  void            updateDisplayName(String displayName);
  void            updateTopic(String topic);
  // implied attributes.  Must also order sections.
  set<Section>    section;
  Serializable    data;
  String          description;
  String          displayName;
  String          topic;
};

class AssessmentPublished {
  AssessmentTaken createAssessmentTaken(Agent agent);
  void            deleteAssessmentTaken(Id assessmentTakenId);
  Assessment      getAssessment();
  AssessmentTakenIterator getAssessmentsTaken();
  Id              getCourseSection();
  Serializable    getData();
  Calendar        getDate();
  String          getDescription();
  String          getDisplayName();
  Id              getGradingAssignment();
  Id              getId();
  void            updateCourseSection(Id id);
  void            updateData(Serializable data);
  void            updateDescriptiion(String description);
  void            updateDisplayName(String displayName);
  void            updateGradingAssignment(Id id);
  // implied attributes
  const Assessment      assessment;
  set<AssessmentTaken>  assessmentsTaken;
  CourseSection&  courseSection;
  Serializable    data;
  const Calendar  date;
  String          description;
  String          displayName;
  Id              gradingAssignment;
};

class AssessmentTaken {
  Evaluation      createEvaluation(Type evaluationType);
  SectionTaken    createSectionTaken(Section section);
  void            deleteSectionTaken(Id sectionTakenId);
  Agent           getAgent();
  AssessmentPublished  getAssessmentPublished();
  Serializable    getData();
  Calendar        getDate();
  EvaluationIterator   getEvaluations();
  EvaluationIterator   getEvaluations(Type evaluationType);
  SectionTakenIterator getSectionsTake();
  void            deleteEvaluation(Id evaluationId);
  void            updateData(Serializable data);
  // implied attributes.  
  set<Evaluation>            evaluations;  // summative from per-sections evals
  set<SectionTaken>          sectionsTaken;
  const AssessmentPublished& assessmentPublished;
  const Agent&               agent;  // student
  Serializable               data;
  const Calendar             date
};

class Evaluation {
  Serializable    getData();
  Id              getId();
  Agent           getModifiedBy();
  Calendar        getModifiedDate();
  Id              getObjectTaken();
  Type            getType();
  void            updateData(Serializable data);
  // implied attrubutes
  Serializable    data;
  const Agent&    modifiedBy;         // these should be expanded to lists
  const Calendar  modifiedDate;
  const ObjectTaken&    objectTaken;  // the item, section, or assessment
                                      // being evaluated
};                             

class Item {
  Serializable    getData();
  String          getDescription();
  String          getDisplayName();
  Id              getId();
  Type            getItemType();
  void            updateData(Serializable data);
  void            updateDescription(String description);
  void            updateDisplayName(String displayName);
  // implied attributes
  Serializable    data;               // answer, rubric, etc.
  String          description;
  String          displayName;
};

class ItemTaken {
  Evaluation      createEvaluation(Type evaluationType);
  void            deleteEvaluation(Id evaluationId);
  Serializable    getData();
  EvaluationIterator getEvaluations();
  EvaluationIterator getEvaluations(Type evauationType); 
  Item            getItem();
  SectionTaken    getSectionTaken();
  void            updateData(Serializable data);
  // implied attributes.  So, where does the student's work go?  Data?
  Serializable           data;
  set<Evaluation>        evaluations;
  const Item&            item;             // master copy of this item
  const SectionTaken&    sectionTaken;
};

class Section {
  void            addItem(Item item);
  void            addSection(Section section);  // subsections
  Serializable    getData();
  String          getDescription();
  String          getDisplayName();
  Id              getId();
  ItemIterator    getItems();
  SectionIterator getSections();                // subsections
  Type            getSectionType();
  void            orderItems(Item[] items);
  void            orderSections(Section[] sections);
  void            removeItem(Id itemId);
  void            removeSection(Id sectionId);
  void            updateData(Serializable data);
  void            updateDescription(String description);
  void            updateDisplayName(Striing displayName);
  // implied attributes  Also need ordering of items and subsections.
  set<Item>       items;            // questions/problems
  set<Section>    sections;         // subsections
  Serializable    data;             // whatever
  String          description;      
  String          displayName;
};

class SectionTaken {
  Evaluation      createEvaluation(Type evaluationType);
  void            deleteEvaluation(Id evaluationId);
  AssessmentTaken getAssessmentTaken();
  Serializable    getData();
  EvaluationIterator getEvaluations();
  EvaluationIterator getEvaluations(Type evaluationType);
  ItemIterator    getItemsTaken();
  Section         getSection();
  void            updateData(Serializable data);
  // implied attributes
  const Section&  section;       // master copy of this section
  set<Evaluation> evaluations;   // from evals of items & subsections taken
  Serializable    data;          // ?? grading formulae?
  set<ItemTaken>  itemsTaken;       
  set<SectionTaken> sectionsTaken;  // subsections taken
  const AssessmentTaken&  assessmentTaken;  // ? parent section or assessment
};



Tom Payne 2003-09-04