В итоге:
коллективная разработка
каждый делает свою часть независимо от других
части программы легко «собрать» вместе
подзадача 1
подзадача 3
подзадача 2.1
подзадача 2.2
подзадача 2.3
задача
подзадача 2
Декомпозиция – это разбиение системы на подсистемы, каждая из которых может изучаться отдельно.
Алгоритмическая декомпозиция
> 100 000 строк???
Иллюстрация из книги Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.
А
Б
В
Г
Объектная
декомпозиция
Б
В
интерфейс
Нижний уровень:
определить, КАК работают объекты
интерфейс
интерфейс
уточнение следует…
Примеры:
«Подпрыгни!»
«Пли!»
Классы объектов: Дорога, Машина
метод
поля
Поле – это переменная, принадлежащая объекту.
Объявление (описание) класса:
Аналогия: чертёж детали.
от type
Ссылка – это переменная, в которую можно записать адрес объекта заданного типа.
road := TRoad.Create;
Конструктор – это метод класса, который вызывается для создания объектов этого класса.
?
описание класса
переменная-ссылка
вызов конструктора
значения полей
длина
ширина
Описание класса:
type TRoad = class
Length: real;
Width: integer;
end;
constructor Create(length0: real;
width0: integer);
Length := length0;
Width := width0;
TRoad.
метод класса TRoad
адрес объекта класса Дорога
road: TRoad;
Равномерное движение:
V – перемещение за 1 интервал.
длина дороги, по которой едет машина
Добавление конструктора:
адрес дороги
полоса
скорость
увеличение длины полной программы (с учетом описания классов)
замедление работы
борьба со сложностью
безопасность внутренних данных
возможность изменять «внутренности», не меняя интерфейс
Класс Перо (цвет и стиль линий):
type TPen = class
color: string;
end;
'FF00FF'
var pen: TPen;
...
pen := TPen.Create;
pen.color := '#%';
writeln(pen.color);
доступно всем!
от Field – «поле»
частный, закрытый
F
private
pen.color := 'FFFF00';
writeln(pen.color);
общедоступный
public
метод чтения
function getColor: string;
procedure setColor(newColor: string);
метод записи
Метод чтения:
функция без параметров
возвращает значение того же типа, что и поле
Метод записи:
процедура
принммает значение того же типа, что и поле
getColor
setColor
FColor
другой
объект
методы
поле
В случае ошибочного значения установить черный цвет:
Length(newColor) <> 6
pen.setColor('FF00'); { ошибка: черный }
pen.setColor('FFFF00'); { запись }
writeln(pen.getColor); { чтение }
Использование:
TPen
FColor
другой
объект
color
getColor
setColor
методы
поле
свойство
свойство
property
pen.сolor := 'FFFF00'; { запись }
writeln(pen.color); { чтение }
string
string
string
тип свойства
getColor
getColor
метод чтения
setColor
setColor
метод записи
реализация
интерфейс
IntToHex
X10 → X16 (строка)
6 знаков: '0000FF'
StrToInt
строка → число
шестнадцатеричное
property v: real read Fv;
свойство «только для чтения»
длина программы ↑
замедление работы
водоем
озеро
осёл
животное
цветок
ромашка
автомобиль
двигатель
автомобиль
грузовик
косточка
ягода
Сравните (плюсы, минусы):
type
TLogElement = class
In1, In2: boolean;
function res: boolean;
end;
вычислить результат при изменении входов
вычислить результат по известным входам
читать прямо из поля
свойство «только для чтения»
Абстрактный метод – это метод, который объявляется, но не реализуется в классе.
Виртуальный метод – это метод, который могут переопределять классы-наследники.
procedure calc; virtual; abstract;
protected
виртуальный
абстрактный
защищенный
Абстрактный класс – это класс, содержащий абстрактный метод («фрукт»).
property In2: boolean read FIn2 write setIn2;
procedure TNot.calc;
begin
FRes := not FIn1;
end;
procedure TAnd.calc;
begin
FRes := FIn1 and FIn2;
end;
calc;
какой метод вызывается?
вызвать процедуру = перейти по заданному адресу памяти
в классе TLogElement метод calc не реализован (нет кода, нет адреса)
каждый наследник имеет свой метод calc
| A | B | not(A&B)
------------------
| 0 | 0 | 1
| 0 | 1 | 1
| 1 | 0 | 1
| 1 | 1 | 0
interface
implementation
режим работы с объектами
unit log_elem ;
{$mode objfpc}
interface { доступно другим модулям }
...
implementation { скрыто от других модулей }
...
end.
log_elem
log_elem
метод для установки связи выхода с входом другого элемента
запомнить адрес и номер входа следующего элемента
если связь установлена…
передать новые данные
аналогично для setIn2…
elAnd.Link(elNot, 1);
объект elAnd САМ сообщает объекту elNot, что его выход изменился
установить связь
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть