University: after refactoring — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Juliet (обсуждение | вклад) (Новая: Категория:University) |
Juliet (обсуждение | вклад) (Отмена правки 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.