Рассмотрев процедурные объекты Maple-языка, обеспечивающие достаточно высокий уровень модульности программирования в среде пакета, представим теперь новый тип (начиная с 6-го релиза) объектов Maple-языка, не только повышающих уровень модульности разрабатываемых в среде Maple программных средств, но и в определенной мере обеспечивающих объектно-ориентированную технологию программирования в его среде. Такими объектами являются программные модули, представление которых целесообразно предварить небольшим, но полезным экскурсом в недавнее прошлое программирования.
В настоящей главе рассматриваются модульные объекты Maple-языка, предполагая, что читатель в определенной мере имеет представление о работе в среде Maple в пределах, например, книг [9-14] либо подобных им изданий. Все используемые понятия и определения полностью соответствуют вышеупомянутой книге [13]. Акцент сделан на модульных объектах языка, определяющих возможность использования элементов объектноориентированного программирования в среде Maple-языка.
После 50-летнего периода прогресса в развитии инструментального ПО его возможности начали существенно отставать от возможностей аппаратных средств и эта разница увеличивается с каждым годом. Одной из причин такого состояния является то обстоятельство, что ПС создается последовательно строка за строкой, тогда как большинство современных ЭВМ разрабатывается и создается по интегральной технологии, на основе печатных плат и т.д., позволяя использовать уже хорошо апробированные решения большинства компонент ЭВМ. С появлением объектно-ориентированной технологии (ООТ) появилась возможность разработки ПС на основе готовых базовых программных конструкций и компонент [1-3]. Данный подход позволяет создавать ПС из существующих компонент значительно быстрее и дешевле, обеспечивая существенное повышение их надежности, гибкости и мобильности.
В ООТ пользователь имеет дело с тремя базовыми элементами: объектами, сообщениями и классами. Объекты представляют собой многократно используемые программные модули, содержащие связанные данные и процедуры. Структурно объекты состоят из двух частей: переменных и методов. Методы представляют собой наборы процедур и функций, определяющих алгоритм функционирования объекта. Подобно переменным в традиционных языках программирования объектные переменные могут содержать как простые данные (числа, массивы, текст и т.д.), так и сложной структуры информацию (графика, звуковые образы и т. д.). Более того, объектные переменные могут содержать другие объекты и т.д. Такие объекты называются сложными. Таким образом, объекты являются автономными модулями, содержащими всю необходимую для их выполнения информацию, что делает их идеальным блочным строительным материалом для создания сложных ПС различного назначения.
Для связи между объектами используются сообщения, состоящие из трех частей: идентификатора объекта-адресата, имени метода (процедуры), который должен выполняться в искомом объекте, а также любой дополнительной информации (фактические значения для формальных параметров), необходимой для настройки режима выполнения выбранного метода. Использование сообщений позволяет вводить четкую систему протоколов для взаимодействия объектов в системе, не акцентируя внимания на их внутренней организации. Данный подход не только защищает (скрывает) внутреннюю структуру объекта, но и позволяет легко изменять ее при условии, что новый объект будет воспринимать те же сообщения, что и предыдущий. Это позволяет весьма гибко изменять структурную организацию сложных многомодульных систем, не изменяя общего алгоритма их функционирования.
Во многих случаях сложная программная система нуждается в большом количестве однотипных объектов. В такой ситуации весьма неэффективно для каждого отдельного объекта содержать всю информацию о методах и переменных. С этой целью вводится понятие класса объектов. Классы напоминают собой своего рода шаблоны для однотипных объектов, содержащие информацию, необходимую для генерации однотипных объектов, включая определения их методов и типов объектных переменных. Отдельные объекты каждого класса содержат только ту часть информации, которая отличает один объект от другого объекта одного и того же класса, а именно - значения объектных переменных. В классе допускается определение иерархии подклассов. То, что подклассы всех высших в иерархии классов наследуют их свойства, делает подобные иерархические структуры мощным средством проектирования многомодульных ПС. Таким образом, классы являются действительно мощной составляющей ООТ, определяя шаблоны для объектов, использующихся многократно, и допуская однократное определение каждого метода и объектной переменной, даже при условии использования их в различных классах. Так как ООТ исповедует принцип максимального использования готовых объектов для создания новых ПС, то ООТ предполагает использование ряда новых подходов к проектированию программного обеспечения, как системного, так и прикладного.
Идеология объектно-ориентированного программирования (ООП) восходит к 60-м годам в связи с исследованиями по проблематике искусственного интеллекта. Понятие программных объектов впервые было введено в языке Simula-67, выросшем из Algol-60 и ориентированном на создание ПС, предназначенных для имитации принятия решений в условиях управляемого множества обстоятельств. Однако ООП-идеология не привлекала широкого внимания вплоть до создания в 1970 г. SmallTalk-языка, состоящего исключительно из объектно-ориентированных конструкций и представляющегося нам наиболее развитым языком ООП. Затем данная идеология была адаптирована разработчиками графических интерфейсов и интегрирована в SmallTalk-подобные языки. Позднее она была адаптирована и в гибридные языки, подобные С+, которые явились первой попыткой навести мосты между более процедурными и ООП-языками. При ООП-подходе понятия процедуры и данных, используемые в обычных системах программирования, заменяются понятиями объект и сообщение; объект – это пакет информации вместе с алгоритмом ее обработки, а сообщение – это спецификация условий одной из операций обработки объекта. В отличие от процедуры, которая описывает алгоритм обработки, сообщение только определяет, что хочет выполнить его отправитель, а получатель точно определяет, как это сделать.
Методология ООП, являясь дальнейшим естественным развитием традиционного программирования, предполагает большую степень структурированности (чем в структурном программировании), модульности и абстрактности (чем предыдущие попытки абстрагирования данных и сокрытия деталей) ПС. Новая методология определяется тремя функциональными характеристиками ООП, а именно:
● инкапсуляция: объединение записей с процедурами и функциями, что превращает их в новый тип данных – объекты. Объекты сохраняют структуру, значение и поведение структуры данных, допуская намного более завершенную абстракцию и модульность в программировании;
● наследование: определение объекта с последующим использованием его для построения иерархии порожденных объектов с наследованием доступа каждого из порожденных объектов к процедурам и данным своего предка;
● полиморфизм: присвоение единого имени процедуре, которая передается вверх и вниз по иерархии объектов, с выполнением этой процедуры способом, соответствующим каждому объекту в иерархии.
За более детальной информацией по ООП и средствам поддержки ООТ можно обратиться к книгам [1-3]. Здесь же мы рассмотрим элементы ООТ, поддерживаемые Maple в лице его программных модулей.
Начиная с 6-го релиза, пакет включает средства по обеспечению ряда базовых элементов объектно-ориентированного программирования, которые поддерживаются механизмом программных модулей языка (или в дальнейшем просто программных модулей – ПМ). Данные модули не следует ассоциировать с более широким понятием пакетных модулей, которые употреблялись на протяжении книг [8-12], рассматривающих пятый релиз пакета. Вместе с тем, можно считать, что программные модули при оформлении их в библиотечные структуры составляют подмножество всех пакетных модулей. Таким образом, если пакетные модули можно рассматривать как внешние по отношению к его ядру хранилища определений функциональных (модульных) средств, то механизм программных модулей, в первую очередь, ориентирован на обеспечение определенного уровня объектноориентированного программирования в среде Maple-языка пакета.
Если процедуры позволяют определять последовательность предложений Maple-языка, описывающих некоторый законченный алгоритм (той либо иной степени сложности), в виде единого объекта, к которому впоследствии можно обращаться с передачей ему фактических аргументов, не интересуясь собственно самой реализацией алгоритма, то механизм программных модулей обеспечивает более высокий уровень абстрагирования, позволяя "скрывать" от пользователя уже целые наборы тематически связанных процедур и данных. Относительно Maple-языка ПМ являются новым типом выражений подобно числам, уравнениям, отношениям и процедурам. Тестирование модульных объектов производится функциями typematch, type и процедурой whattype, как иллюстрирует следующий достаточно простой фрагмент: