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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
 
(Отмена правки 2204 участника Juliet (обсуждение))
 
(не показано 5 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
[[Категория:University]]
 
[[Категория:University]]
 +
[[Категория:Коды]]
 +
== Назначение ==
 +
Использован в [[Основы программирования — второй семестр 08-09 | конспекте лекций по основам программирования]] в теме [[Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть#Вид доступа protected. Рефакторинг метода NextCourse  | «наследование»]].
 +
 +
== Текст модулей ==
 +
=== StudentUnit ===
 +
<source lang="Delphi">
 +
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.
 +
</source>
 +
 +
=== University ===
 +
<source lang="Delphi">
 +
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.
 +
</source>

Текущая версия на 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.