лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 10
Текст из файла (страница 10)
В случае нисходящего метода вы начинаете созидательный процесс с программывысокого уровня и спускаетесь до подпрограмм низкого уровня. Восходящий метод работает в обратномнаправлении: вы начинаете с отдельных специальных подпрограмм, постепенно строите на их основе болеесложные конструкции и заканчиваете самым верхним уровнем программы. Специальный подход не имеетзаранее установленного метода, так сказать комбинация восходящего и нисходящего проектирования( частосводится к реализации базисной части программы, а потом к постепенному расширению еёфункциональности , сопровождается использованием «заглушек» в местах нереализованных частей)Поскольку С является структурированным языком программирования, то лучше всего он сочетается снисходящим методом проектирования.
Подход сверху вниз позволяет производить ясный, легко читаемыйпрограммный код, который в дальнейшем не вызовет трудностей и при сопровождении. К тому же данныйподход помогает прояснить и сделать понятной всю структуру программы в целом до кодирования функцийболее низкого уровня. Такой подход позволяет уменьшить потери времени, обусловленные неудачными илиошибочными начинаниями.RAD подход ( rapid проектирование ) – быстрое написание прототипа программы, для того чтобы заказчикмог оценить свой будущий проект на начальной стадии проектирования, и внести соответствующиеизменения в случае надобности.Модульная структура языка АДАБиблиотечный модуль в АДЕ это пакет, видна аналогия с Модулой – 2.Пакет - это средство, которое позволяет сгруппировать логически связанные вычислительные ресурсы ивыделить их в единый самостоятельный программный модуль.
Под вычислительными ресурсами в этомслучае подразумеваются данные (типы данных, переменные, константы...) и подпрограммы которыеманипулируют этими данными. Характерной особенностью данного подхода является разделение самогопакета на две части: спецификацию пакета и тело пакета. Причем, спецификацию имеет каждый пакет, а теломогут иметь не все пакеты.Спецификация определяет интерфейс к вычислительным ресурсам (сервисам) пакета доступным дляиспользования во внешней, по отношению к пакету, среде. Другими словами - спецификация показывает"что" доступно при использовании этого пакета.Тело является приватной частью пакета и скрывает в себе все детали реализации предоставляемых длявнешней среды ресурсов, то есть, тело хранит информацию о том "как" эти ресурсы устроены.Необходимо заметить, что разбиение пакета на спецификацию и тело не случайно, и имеет очень важноезначение. Это дает возможность по-разному взглянуть на пакет. Действительно, для использования ресурсовпакета достаточно знать только его спецификацию, в ней содержится вся необходимая информация о том какиспользовать ресурсы пакета.
Необходимость в теле пакета возникает только тогда, когда нужно узнать илиизменить реализацию чего-либо внутри самого пакета.Средства построения такой конструкции как пакет дают программисту мощный и удобный инструментабстракции данных, который позволяет объединить и выделить в логически законченное единое целоеданные и код который манипулирует этими данными. При этом, пакет позволяет программисту скрыть вседетали реализации сервисов за развитым функциональным интерфейсом.
В результате, структурноепредставление программного комплекса в виде набора взаимодействующих между собой компонентовоблегчает понимание работы комплекса в целом и, следовательно, позволяет облегчить его разработку исопровождение.Необходимо также заметить, что на этапе начального проектирования системы можно предоставлятькомпилятору только спецификации, обеспечивая детали реализации только самых необходимых элементов.Таким образом проверка корректности общей структуры проекта осуществляется на ранней стадии, когда непотрачено много усилий на разработку реализации отдельных элементов, которые позже придетсяпеределывать (что, к великому сожалению, в реальной жизни происходит достаточно часто).Общий вид:Package M is//определение(типов переменных констант заголовки процедур)End MPackage body M is//реализация процедур и функцийEnd MРассмотрим поподробнее отдельно спецификацию и реализациюСпецификация:package M istype A_String is array (Positive range <>) of Character;Pi: constant Float := 3.14;X: Integer;type A_Record isrecordLeft : Boolean;Right : Boolean;end record;-- примечательно, что дальше, для двух подпрограмм представлены только-- их спецификации, тела этих подпрограмм будут находиться в теле пакетаprocedure Insert(Item : in Integer; Success : out Boolean);function Is_Present(Item : in Integer) return Boolean;end M;Для подключения пакета используется оператор with: with <Имя пакета>.
В случаях,когда использование полной точечной нотации для доступа к ресурсам пакета обременительно, можноиспользовать инструкцию спецификатора использования контекста use. Это позволяет обращаться кресурсам которые предоставляет данный пакет без использования полной точечной нотации, так, как будтоони описаны непосредственно в этом же коде. Для обращения к функции из пакетаиспользуется оператор «.»: <имя пакета>.<имя функции>Пример:with M;procedure P isMy_Name : M.A_String;Radius : Float;Success : Boolean;beginRadius := 3.0 * M.Pi;M.Insert(4, Success);if M.Is_Present(34) then ....
. .end P;Реализация(тело пакета)Тело пакета содержит все детали реализации сервисов, указаных в спецификации пакета. Схематическимпримером тела пакета, для показанной выше спецификации, может служить:package body M istype List is array (1..10) of Integer;Storage_List : List;Upto: Integer;procedure Insert(ItemSuccessbegin. . .end Insert;: in: outInteger;Boolean) isfunction Is_Present(Item : in Integer) return Boolean isbegin. . .end Is_Present;-- действия по инициализации пакета-- это выполняется до запуска основной программы!for I in Storage_List'Range loopStorage_List(I) := 0;end loop;beginUpto := 0;end M;Все модули линейные в МОДУЛЕ - 2, но В аде могут вкладываться друг в друга, пример может быть не в тему(Головин ), но чтобы получше понять что такое вложенность рассмотрим вложенные процедуры в Паскале:procedure p1var x2, x3;procedure P2var x1endendРассказ про вложенные области видимости мы отбросим.Таким образом ещё раз повторяюсь в АДЕ пакеты могут быть вложены друг в друга.
В других лекцияхрассказывалось про существование в некоторых языках особого класса – базового абсолютно для всехклассов, то есть все классы как бы непроизвольно являются порожденными от него. В Аде аналогичнаяситуация с пакетами. в АДЕ есть пакетpacket STANDARTвсе другие пакеты вкладываются в СТАНДАРТПример вложенности в языке АДА:Standardpackage m1 ispackage m2 isend m2end m1package m3 ispackage m4 isend m4end m3Подробный рассказ об области видимости пакета оставим на лучшие времена в виду интуитивнойпонятности(область действия имени пакета начинается с объявления пакета, например, в конце Standartвидно m1, m3, m1.m2, m3.m4 точка обязательна). В виду вложенности пакетов, для вложенных пакетовсуществует также понятие вложенных областей действия. Здесь все аналогично с ситуаций вложенныхобластей видимости в С++.перегрузка функций, перегрузка операций:T operator + (T x, T y);перегрузка операций нам знакома с языка С++, важной особенностью перегрузки операций является, то чтоколичество операндов должно совпадать с количеством операндов у соответствующей операции, то есть для“+” – количество операндов всегда равно 2.в Аде:function "+" (x2 , x3:T) return T;В Аде возникает проблема перегруженных операторов и функций, которые описаны во внутренних пакетах,так как они не видны в внешних пакетах.
Вследствие этого ввели новый операторuse M;После применения этой конструкции все имена из спецификации пакета M становятся видимыми.Может возникнуть конфликт имен при описании одинаковых переменных в различных модулях. Приконфликте имен «виноваты оба», поэтому в точке начала перекрытия перекрываемые переменные содинаковым именем перестают быть видимыми.Переименование:Ада, Модула - 2 предоставляет программисту возможность осуществлять переименования. Следует заметить,что переименование иногда вызывает споры в организациях программирующих на Аде. Некоторым людямпереименование нравится, а другим - нет.
Существует несколько важных вещей, которые необходимо понять:Переименование не создает нового пространства для данных. Оно просто создает новое имя для ужеприсутствующей сущности.Не следует постоянно переименовывать одно и то же. Этим можно запутать всех, включая самогосебя.Переименование необходимо использовать для упрощения кода. Введение нового имени, в некоторыхслучаях, делает код более легко читаемым.•••Пример:withwithAda.Text_IO;Ada.Integer_Text_IO;procedure Gun_Aydin ispackage TIO renamespackage IIO renamesAda.Text_IO;Ada.Integer_Text_IO;with Graphics.Common_Display_Types;package CDT renames Graphics.Common_Display_Types;полезно при переименовании перекрывающихся имен в модулях.Лекция.
Лихогруд Н.Н.КлассыПринципиальное отличие класса от модуля заключается в том, что класс – это тип данных, а модуль нет. Но вомногих вещах они похожи.Тип Данных = Структура Данных + Множество Операций над этими даннымиВ C#, Java всё является классами или находится в классах в качестве статических челнов. Даже математическиефункции находятся в классе – System.Math. И для вызова функции cos(x) требуется написать Math.Cos(x);Наибольшее сходство между классом и модулем достигается если класс содержит только статические методыи поля.
При этом такой класс, как правило, реализуется в виде модуля.п1. Понятие членов классасинтаксис в C++.Java,C#:class Name{….Определение членов класса…..}В Си++ допускается вынесение определений, т.е. В Си++ можно члены класса лишь объявлять. В Java, C# всеопределения должны быть внутри классасинтаксис в Delphi:type T =class (наследование)обявление членов классаend;Члены класса:•••Члены-данныеЧлены-типвЧлены-функции(методы)Чем члены-функции отличаются от обычных функций?Такой функции при вызове всегда передаётся указатель «this»(в Delphi «self») на объект в памяти, от именикоторого вызывается функция.Java,C#,C++.DephpiT x;x = new T(«параметрыконструктора»);T x;T x(«параметрыконструктора»);T x = T(«параметрыконструктора»);x:TВ первой строчке определяетсяссылка на объект (выделяетсяпамять для хранения ссылки),место в динамической памятипод объект не отводится.
Вовторой непосредственноотводится место вдинамической памяти («куче»)для объекта и адресприсваивается ссылке наобъект.x – ссылка, её ещё надопроинициализировать.В этих определенияхвыделяется место не подссылку на объект, а под самобъект (не в динамическойпамяти).