MATLAB R2008a. Классы. Часть1: Учебное пособие, страница 6

                % параметр, возвращаемый данной функцией.

                …    % specify syntax only (только предписывающий синтаксис),

                        % например, «results = step2()» – где step2

                % на момент обращения будет определяться вызывающим

                % кодом, где есть своя программа для step2.

end

Шаг 3:

   function transformResults()

                …    % actual implementation (действительное исполнение) –строки

                        %  рабочего кода.

end

Шаг 4:

   function out = checkOutputs()

                …    %  actual implementation (действительное исполнение) –

                        %  строки рабочего кода.

end

Еще раз отметим, что код базового класса при обращении к нему не копируется (не переписывается) и не модифицируется (модификации осуществляются производными формами), он просто наследуется (его непосредственно используют) всеми подклассами и объектами, которые вы выводите из базового класса. Это уменьшает объем (ограничивает избыточность) кода, который надо тестировать, и разделяет коды классов и других (внешних) частей программы.

DefiningConsistentInterfaces (Определение согласованных интерфейсов)

Использование класса как базиса для аналогичных (производных), но более специализированных подклассов и объектов является полезной техникой в объектно-ориентированном программировании. Поэтому, как было сказано ранее, базовый класс называют интерфейсным классом. Включение этого свойства базового класса в вашу программную разработку позволяет вам:

w  Определять общие требования цели;

w  Кодировать эти требования в вашей программе как интерфейсный класс.

Например, предположим, что вы создаете особый класс (класс ошибок) объектов для возврата информации об ошибках, которые появляются во время выполнения определенных блоков программы. Выявлять ошибки могут специальные функции (методы данного интерфейсного класса),  возвращающие информацию, которую вы хотите включить в отчет. Различие в информации об ошибках могут отобразить инстанции этого класса – подклассы и объекты ошибок.

Интерфейсный класс, из которого  выведены подклассы и объекты ошибок, специфицирует (трактует), что все его производные формы должны поддерживать, например, метод getReport (генерация отчета), но сам интерфейсный класс может не определять точно, как выполняется метод. Тогда производные из класса формы должны выполнить свою  версию метода getReport базового класса для обработки различных данных.

Иначе говоря, интерфейсный класс трактует, что все его подклассы и объекты ошибок способны отображать отчет об ошибках, общие черты которого определены в этом интерфейсном классе. В рассматриваемом плане, с учетом возможных модификаций производных форм, все программы, которые используют указанное свойство, могут быть гарантированно выполнены согласованным путем.

Любая производная форма, выведенная из интерфейсного класса и содержащая свой модифицированный метод (например, getReport), не имеет  какого-либо конфликта совпадающих наименований с исходным (базовым) классом, так как последний всегда знает, какой именно метод будет вызван.

ReducingComplexity (Уменьшение сложности)

Объекты снижают сложность работы с  моделью за счет уменьшения того, что вам надлежит знать для использования компонента или части системы. Это проявляется двумя путями:

w  Детали исполнения скрыты интерфейсами, которые определены классом и его объектами;

w  Правила взаимодействия объектов соблюдаются самими объектами и не являются заботой пользователей.

Для иллюстрации этих преимуществ рассмотрим исполнение структуры данных, называемой «двусвязный список», объекты (узлы) которого имеют по три свойства (Properties):

Для введения нового узла (с другим значением свойства Data) к списку,  например на место объекта n2, предварительно выполним следующие очевидные шаги:

1.  Отсоединим линию связи  n2.Prev узла n2 от узла n1;

2.  Отсоединим линию связи  n2.Next узла n2 от узла n3;

3.  Отсоединим линию связи  n3.Prev узла n3 от узла n2;

4.  Отсоединим линию связи  n1.Next узла n1 от узла n2.

Получим такую разомкнутую структуру узлов (свойства Data для упрощения не показаны):

Отсоединенные линии

 


Далее организуем связи с новым (new) узлом:

5.  Связь new(был n2).Prev к n1;

6.  Связь new(был n2).Next к n3;

7.  Связь n1.Next к new (был n2);

8.  Связь n3.Prev к new (был n2).

Теперь перенумеруем узлы. С учетом следующего (в данном случае четвертого) после n3 узла получим связную структуру:

Новый узел

 


Как видим, акт введения нового узла в существующую структуру двусвязного списка требует некоторое число шагов. Любой обычный код, создающий структуру, подобную этой, может исполнить такие операции. Однако определение узлов связного списка как объектов дает возможность все операции по добавлению, исключению и ранжированию (порядку) узлов инкапсулировать (включить) в объектные методы. Коды, которые исполняют эти операции, могут быть хорошо протестированы, выполнены оптимальным образом, всегда могут получить конкретные данные текущей версии класса и могут даже автоматически обновить старые версии, когда они загружаются из MAT-файлов (специальные файлы хранения информации).

Объекты подчиняются правилам взаимного общения посредством  методов. Поэтому, например, метод addNode (добавить узел) сам выполнит все шаги, приведенные выше и вовлекающие в работу несколько узлов. Это делает ненужной необходимость какого-либо принуждения со стороны того приложения, которое использует данные объекты. Это также означает меньшую вероятность генерации ошибок приложением при выполнении его собственных процессов с использованием рассмотренных объектов.