University: after refactoring — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Juliet (обсуждение | вклад) |
Juliet (обсуждение | вклад) (Отмена правки 2204 участника Juliet (обсуждение)) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 2: | Строка 2: | ||
[[Категория:Коды]] | [[Категория:Коды]] | ||
== Назначение == | == Назначение == | ||
− | Использован в [[Основы программирования — второй семестр 08-09 | конспекте лекций по основам программирования]] в теме [[Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть# | + | Использован в [[Основы программирования — второй семестр 08-09 | конспекте лекций по основам программирования]] в теме [[Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть#Вид доступа protected. Рефакторинг метода NextCourse | «наследование»]]. |
== Текст модулей == | == Текст модулей == | ||
Строка 41: | Строка 41: | ||
protected | protected | ||
/// Переводит студента на следующий курс, если он меньше lastCourse | /// Переводит студента на следующий курс, если он меньше lastCourse | ||
− | procedure | + | procedure ProtectedNextCourse(lastCourse: integer); |
public | public | ||
Строка 84: | Строка 84: | ||
// -------------------------------------------- Student ------------------------------------------- | // -------------------------------------------- Student ------------------------------------------- | ||
− | procedure Student. | + | procedure Student.ProtectedNextCourse(lastCourse: integer); |
begin | begin | ||
if fCourse < lastCourse then | if fCourse < lastCourse then | ||
Строка 135: | Строка 135: | ||
procedure Student.NextCourse; | procedure Student.NextCourse; | ||
begin | begin | ||
− | + | ProtectedNextCourse(LAST_UNDERGRADUATE_COURSE); | |
end; | end; | ||
Строка 295: | Строка 295: | ||
begin | begin | ||
var lastCourse := LastCourseByDegree(fDegree); | var lastCourse := LastCourseByDegree(fDegree); | ||
− | + | ProtectedNextCourse(lastCourse); | |
end; | end; | ||
Текущая версия на 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.