University: after refactoring — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Назначение)
(Отмена правки 2204 участника Juliet (обсуждение))
 
Строка 2: Строка 2:
 
[[Категория:Коды]]
 
[[Категория:Коды]]
 
== Назначение ==
 
== Назначение ==
Использован в [[Основы программирования — второй семестр 08-09 | конспекте лекций по основам программирования]] в теме [[Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть#Наследование и выявление общего предка  | «наследование»]].
+
Использован в [[Основы программирования — второй семестр 08-09 | конспекте лекций по основам программирования]] в теме [[Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть#Вид доступа protected. Рефакторинг метода NextCourse  | «наследование»]].
  
 
== Текст модулей ==
 
== Текст модулей ==

Текущая версия на 19:10, 18 мая 2009

Назначение

Использован в конспекте лекций по основам программирования в теме «наследование».

Текст модулей

StudentUnit

unit StudentUnit;

interface
uses System;

const  
  /// Минимальный допустимый возраст студента
  MIN_AGE = 1;
  /// Максимальный допустимый возраст студента
  MAX_AGE = 120;
  
  /// Первый курс
  FIRST_COURSE = 1;

// -------------------------------------------- Student ------------------------------------------- 
const
  /// Максимальный курс для студентов младших курсов
  LAST_UNDERGRADUATE_COURSE = 4;

type
  /// Студент
  Student = class
  private
    /// Имя
    fName: string;
    /// Возраст
    fAge: integer;
    /// Курс
    fCourse: integer;
    /// Группа
    fGroup: integer;
  
  protected
    /// Переводит студента на следующий курс, если он меньше lastCourse
    procedure ProtectedNextCourse(lastCourse: integer);
  
  public
    /// Имя — только на чтение
    property Name: string read fName;
    /// Возраст — только на чтение
    property Age: integer read fAge;
    /// Курс — только на чтение
    property Course: integer read fCourse;
    /// Группа — только на чтение
    property Group: integer read fGroup;
    
    /// <summary>
    /// Создает нового студента
    /// </summary>
    /// <param name="Name">Имя (пустое недопустимо)</param>
    /// <param name="Age">Возраст (отрицательный или больший MAX_AGE недопустим)</param>
    /// <param name="Course">Курс (отрицательный или больший LAST_UNDERGRADUATE_COURSE недопустим)</param>
    /// <param name="Group">Группа (отрицательная недопустима)</param>
    constructor Create(Name: string; Age, Course, Group: integer);
    
    /// Устанавливает возраст студента равным Age,
    /// если он неотрицателен и не больше MAX_AGE
    procedure SetAge(Age: integer);
    /// Устанавливает номер группы равным Group,
    /// если он неотрицателен
    procedure SetGroup(Group: integer);
    
    /// Переводит студента на следующий курс, если он меньше LAST_UNDERGRADUATE_COURSE
    procedure NextCourse;
    
    /// Выводит данные по студенту
    procedure Print;
    /// Выводит данные по студенту с переходом на новую строку
    procedure Println;
  end;

  
implementation


// -------------------------------------------- Student ------------------------------------------- 

procedure Student.ProtectedNextCourse(lastCourse: integer);
begin
  if fCourse < lastCourse then
    fCourse += 1
  else
    raise new Exception(
    'Выход за границы диапазона допустимых курсов [' + 
    FIRST_COURSE.ToString + '..' + lastCourse.ToString + ']!');
end;
   
constructor Student.Create(Name: string; Age, Course, Group: integer);
begin
  if Name <> '' then
    fName := Name
  else
    raise new Exception(
    'Попытка присвоить студенту пустое имя!');
    
  SetAge(Age);
  
  if (Course >= FIRST_COURSE) and (Course <= LAST_UNDERGRADUATE_COURSE) then
    fCourse := Course
  else
    raise new Exception(
    'Выход за границы диапазона допустимых курсов [' + 
    FIRST_COURSE.ToString + '..' + LAST_UNDERGRADUATE_COURSE.ToString + ']!');
    
  SetGroup(Group);
end;

procedure Student.SetAge(Age: integer);
begin
  if (Age >= MIN_AGE) and (Age <= MAX_AGE) then
    fAge := Age
  else
    raise new Exception(
    'Выход за границы диапазона допустимого возраста [' + 
    MIN_AGE.ToString + '..' + MAX_AGE.ToString + ']!');
end;

procedure Student.SetGroup(Group: integer);
begin
  if (Group > 0) then
    fGroup := Group
  else
    raise new Exception(
    'Попытка присвоить группе отрицательный номер!');
end;

procedure Student.NextCourse;
begin
  ProtectedNextCourse(LAST_UNDERGRADUATE_COURSE);
end;

procedure Student.Print;
begin
  WriteFormat(
    'Имя: {0}  Возраст: {1}  Курс: {2}  Группа: {3}  ',
    fName, fAge, fCourse, fGroup);
end;

procedure Student.Println;
begin
  Print;
  writeln();
end;

end.

University

unit University;

interface
uses System, StudentUnit;
  
type
  /// Студент
  Student = Student;
  
  
// ------------------------------------------- DegreeType -----------------------------------------
type
  /// Академическая степень (Бакалавр, Специалист, Магистр)
  DegreeType = (Bachelor, Specialist, Magister);
  
/// Возвращает последний курс, соответствующий академической степени degree
function LastCourseByDegree(degree: DegreeType): integer; 
  
/// Возвращает строковое представление академической степени degree
function DegreeToString(degree: DegreeType): string;


// -------------------------------------------- Teacher -------------------------------------------
type
  SeniorStudent = class; // предописание класса
  
  /// Преподаватель
  Teacher = class
  private
    /// Имя
    fName: string;
  
  public
    /// Имя — только на чтение
    property Name: string read fName;
    
    /// <summary>
    /// Создает нового преподавателя
    /// </summary>
    /// <param name="Name">Имя (пустое недопустимо)</param>
    constructor Create(Name: string);
    
    /// Возвращает тему курсовой работы для студента MyStudent
    function SayCourseWorkTheme(MyStudent: SeniorStudent): string;
    
    /// Выводит данные по преподавателю
    procedure Print;
    /// Выводит данные по преподавателю с переходом на новую строку
    procedure Println;
  end;
  
  
// ----------------------------------------- SeniorStudent ---------------------------------------- 
  /// Студент старших курсов
  SeniorStudent = class (Student)
  private
    /// Научный руководитель
    fAdvisor: Teacher;
    /// Образовательная степень
    fDegree: DegreeType;

  public
    /// Научный руководитель — только на чтение
    property Advisor: Teacher read fAdvisor;
    /// Образовательная степень — только на чтение
    property Degree: DegreeType read fDegree;
    
    /// <summary>
    /// Создает нового студента старших курсов
    /// </summary>
    /// <param name="Name">Имя (пустое недопустимо)</param>
    /// <param name="Age">Возраст (отрицательный или больший MAX_AGE недопустим)</param>
    /// <param name="Course">Курс (отрицательный или больший MAX_COURSE недопустим)</param>
    /// <param name="Group">Группа (отрицательная недопустима)</param>
    /// <param name="Advisor">Научный руководитель</param>
    /// <param name="EduModel">Академическая степень (бакалавр, специалист, магистр)</param>
    constructor Create(Name: string; Age, Course, Group: integer; 
      Advisor: Teacher; Degree: DegreeType);
    
    /// Возвращает тему курсовой работы 
    function CourseWorkTheme: string;
    
    /// Переводит студента на следующий курс
    procedure NextCourse;
    
    /// Выводит данные по студенту старших курсов
    procedure Print;
    /// Выводит данные по студенту старших курсов с переходом на новую строку
    procedure Println;
  end;

implementation

// ------------------------------------------- DegreeType -----------------------------------------

function LastCourseByDegree(degree: DegreeType): integer; 
begin
  case degree of
    Bachelor:   result := 4;
    Specialist: result := 5;
    Magister:   result := 6;
  end;
end;

{Возвращает строковое представление академической степени}
function DegreeToString(degree: DegreeType): string;
begin
  case degree of
    Bachelor:   result := 'Бакалавр';
    Specialist: result := 'Специалист';
    Magister:   result := 'Магистр';
  end;
end;
  
  
// ----------------------------------------- SeniorStudent ----------------------------------------

constructor SeniorStudent.Create(Name: string; Age, Course, Group: integer; 
  Advisor: Teacher; Degree: DegreeType);
begin
  inherited Create(Name, Age, Course, Group);
  
  if Advisor <> nil then
    fAdvisor := Advisor
  else
    raise new Exception(
    'Параметр «Advisor» конструктора является нулевой ссылкой!');
    
  fDegree := Degree;
end;

function SeniorStudent.CourseWorkTheme: string;
begin
  Result := fAdvisor.SayCourseWorkTheme(self);
end;

procedure SeniorStudent.NextCourse;
begin
  var lastCourse := LastCourseByDegree(fDegree);
  ProtectedNextCourse(lastCourse);
end;

procedure SeniorStudent.Print;
begin
  inherited Print;
  write('Преподаватель: '); fAdvisor.Print;  
  writeFormat('Академическая степень: {0}', DegreeToString(fDegree));
end;

procedure SeniorStudent.Println;
begin
  Print;
  writeln();
end;


// -------------------------------------------- Teacher -------------------------------------------

constructor Teacher.Create(Name: string);
begin
  if Name <> '' then
    fName := Name
  else
    raise new Exception(
    'Попытка присвоить преподавателю пустое имя!');
end;

function Teacher.SayCourseWorkTheme(MyStudent: SeniorStudent): string;
begin
  result := 'Тема курсовой работы'; 
end;

procedure Teacher.Print;
begin
  WriteFormat(
    'Имя: {0}  ',
    fName);
end;

procedure Teacher.Println;
begin
  Print;
  writeln();
end;

end.