Введение

Объектно-ориентированный фреймворк приложений для классической Mac OS. MacApp — это объектно-ориентированный фреймворк приложений для устаревшей классической Mac OS от Apple Computer. Выпущенный в 1985 году, он перешел с Object Pascal на C++ в версии 3.0, выпущенной в 1991 году, которая обеспечивала поддержку большей части новой функциональности System 7. MacApp использовался для разработки ряда крупных приложений, включая Adobe Photoshop. Однако после демонстрации версии на Всемирной конференции разработчиков (WWDC) в июне 2001 года, вся разработка была прекращена в октябре того же года.

Версии Паскаля

MacApp был прямым потомком Lisa Toolkit, первой попытки Apple создать объектно-ориентированную структуру приложений, возглавляемой Ларри Теслером. В инженерную команду Toolkit входили Ларри Розенштейн, Скотт Уоллес и Кен Дойл. Toolkit был написан на специализированном языке, известном как Clascal, который добавлял объектно-ориентированные возможности к языку Pascal. Первоначально разработка для Mac осуществлялась с использованием кросс-компилятора в Lisa Workshop. Поскольку продажи Mac фактически прекратили продажи Lisa, началась работа над созданием новой платформы разработки для Mac. Lisa Programmer's Workshop в 1985 году стала Macintosh Programmer's Workshop, или MPW. В рамках этого процесса Clascal был обновлен до Object Pascal, а Lisa Toolkit содержал проектные материалы для того, что впоследствии стало MacApp. Когда в 1992 году Apple объявила о прекращении поддержки MPW Pascal, эта версия не была обновлена, даже с учетом поддержки System 7, и разработчикам Pascal пришлось самостоятельно портировать MacApp 2.0 на PowerPC.

Версии C++

К этому моменту, к концу 1980-х годов, рынок переходил к C++, а бета-версия компилятора Apple C++ появилась в 1989 году, примерно во время выпуска MacApp 2.0. Этот шаг вызвал долгие и ожесточенные дебаты между сторонниками Object Pascal и C++ в Usenet и других форумах. Тем не менее, версия 3.0 смогла завоевать определенную популярность после выхода в 1991 году, несмотря на то, что пакет разработчика MPW устаревал. Затем Apple сократила всю группу разработчиков, оставив MacApp и MPW недоукомплектованными. Одной из причин этого сокращения была затянувшаяся история попыток Apple представить "следующую великую платформу" для разработки, почти всегда в виде кросс-платформенной системы. Их первой попыткой была Bedrock – библиотека классов, созданная в партнерстве с Symantec, работавшая на Mac и Windows, которая постепенно пришла в упадок, поскольку обе стороны в конечном итоге отказались от сотрудничества друг с другом. Одной из причин их проблем стало создание OpenDoc, который сам по себе был разработан как кросс-платформенная система, напрямую конкурировавшая с Bedrock. Предпринимались некоторые попытки представить Bedrock как платформу OpenDoc, но они ни к чему не привели. Пока эти разработки происходили, MPW и MacApp в основном игнорировались. Было важнее направить ресурсы разработчиков на эти новые проекты, чтобы ускорить их выход на рынок. Но когда Bedrock потерпел неудачу, а OpenDoc был встречен без особого энтузиазма, Mac остался с инструментами, которым было уже почти десять лет, и которые не могли конкурировать с новыми продуктами сторонних разработчиков. В начале 1990-х годов конкурирующие фреймворки превратились в реальных конкурентов MacApp. Сначала TCL от Symantec приобрела сторонников, но затем PowerPlant от Metrowerks в целом захватил весь рынок.

Продолжительная смерть

Основные разработчики MacApp продолжали работу над системой в режиме низкой активности на протяжении 1990-х годов. Когда все "официальные" кроссплатформенные проекты Apple были закрыты, в конце 1996 года команда объявила о создании кроссплатформенной версии MacApp. Вскоре после этого Apple приобрела NeXT и объявила, что OpenStep станет основной платформой разработки Apple, получившей название Cocoa. Cocoa уже была кроссплатформенной, к тому времени она была портирована примерно на шесть платформ и значительно превосходила MacApp по своим возможностям. Это вызвало резкое недовольство среди существующих программистов для Mac, которые протестовали против того, что их программы отправлялись "на скамейку запасных", фактически были заброшены. На WWDC'98 Стив Джобс объявил, что негативные отзывы о переходе на Cocoa учитываются и решаются с помощью системы Carbon. Carbon позволял существующим программам для Mac работать на новой операционной системе после некоторой адаптации. Metrowerks объявила о переносе своего фреймворка PowerPlant на Carbon, но Apple не сделала аналогичного заявления относительно MacApp. В течение этого периода сохранялось ядро лояльных пользователей MacApp, которые всё больше разочаровывались в политике Apple. К концу 1990-х годов, с появлением Cocoa, это разочарование переросло в полное неприятие продукта. Ситуация была настолько критической, что группа пользователей MacApp организовала собственную встречу на WWDC'98 под вымышленным названием, чтобы избежать отказа со стороны сотрудников Apple в предоставлении помещения. Эта постоянная поддержка была замечена в Apple, и в конце 1999 года "новой" команде MacApp, состоящей из разработчиков, которые работали над проектом всё это время, было поручено выпустить новую версию. В неё вошли новые Apple Class Suites (ACS) – более тонкий слой C++-обёрток для многих новых функций Mac OS, заимствованных из OpenStep, и поддержка сборки в Project Builder. MacApp 3.0 Release XV был выпущен 28 августа 2001 года, что вызвало радость у многих пользователей. Однако в октябре продукт был окончательно закрыт, на этот раз навсегда, и официальная поддержка существующих версий MacApp прекращена. Carbon-совместимый PowerPlant X был выпущен только в 2004 году, а сегодня Cocoa практически универсален для программирования как для MacOS, так и для iOS.

MacApp сегодня

MacApp поддерживается преданной группой разработчиков, которые продолжают поддерживать и совершенствовать фреймворк с тех пор, как Apple прекратила его поддержку в 2001 году. MacApp был обновлен для полной поддержки Carbon Events, Universal Binaries, Unicode Text, элементов управления MLTE и DataBrowser, FSRefs, разбора XML, пользовательских элементов управления, составных окон, выдвижных окон, окон HIView и пользовательских окон. MacApp также предоставляет классы-обертки C++ для HIObject и HIView. Версия Pascal, основанная преимущественно на MacApp 2, была портирована на Mac OS X и Xcode и поддерживает длинные имена файлов в Unicode, а также потоковую обработку документов с автоматической сменой порядка байтов. MacApp совместим с IDE Xcode. Фактически, на WWDC 2005, вскоре после объявления Apple о переходе на процессоры Intel, одному разработчику потребовалось всего 48 часов, чтобы обновить MacApp и примеры приложений MacApp для поддержки Universal Binaries.

Описание

Это описание основано на MacApp 3.0, который имел более продвинутую базовую модель, чем более ранняя версия 2.0, и значительно отличался от неё. Сама Mac OS имеет очень простую систему обработки событий. Структура событий, передаваемая от операционной системы приложению, содержит только тип события, например, "нажатие клавиши" или "щелчок мышью", а также сведения о его местоположении и нажатых клавишах-модификаторах. Приложение должно расшифровать эту простую информацию, чтобы определить действие, которое выполнил пользователь, например, выбор команды меню. Расшифровка могла быть сложной, требуя перебора списка объектов на экране и проверки, произошло ли событие в пределах их границ. MacApp предоставил решение этой проблемы, используя шаблон проектирования "команда", в котором действия пользователя инкапсулируются в объекты, содержащие детали события, а затем отправляются соответствующему объекту для выполнения. Логика сопоставления события "правильному объекту" полностью обрабатывалась в рамках платформы и её среды выполнения, что значительно упрощало эту задачу. Внутренние механизмы MacApp принимают базовые события ОС, преобразуют их в команды более высокого семантического уровня и направляют команду соответствующему объекту. MacApp не только избавлял разработчика от необходимости писать этот код, который требуется каждой программе, но и, как побочный эффект, обеспечивал чёткое разделение кода на команды, действия, ориентированные на пользователя, и их обработчики – внутренний код, выполняющий работу. Например, могли существовать команды "Сделать зелёным" и "Сделать красным", обе из которых обрабатываются одной функцией ChangeColor. Программа, которая чётко разделяет команды и обработчики, в терминологии Apple называлась "факторизованной". Факторизация программы была особенно важна в более поздних версиях Mac OS, начиная с System 7. System 7 представила систему Apple Events, которая расширила исходную систему событий Mac OS, предоставив более богатый набор возможностей, позволяющий отправлять события между приложениями, а не только от ОС к конкретному приложению. Это было объединено с системой AppleScript, которая позволяла генерировать эти события из скриптового кода. В MacApp 3.0 события Apple Events расшифровывались в те же команды, что и при прямом взаимодействии пользователя, что означало, что разработчику не требовалось писать много, если вообще, кода для прямой обработки событий Apple Events. Это была серьёзная проблема для разработчиков, использующих более ранние системы, включая MacApp 2.0, в которых отсутствовало такое разделение, и часто приводило к тому, что поддержка Apple Events оставалась нереализованной. В соответствии со своей ролью платформы приложений, MacApp также включал в себя ряд готовых объектов, охватывающих большинство основных элементов графического интерфейса Mac – окна, меню, диалоги и подобные виджеты были представлены в системе. К сожалению, Apple обычно поставляла облегчённые обёртки над существующим внутренним кодом Mac OS вместо предоставления систем, пригодных для использования в "реальных" приложениях. Например, класс TTEView предлагался в качестве стандартного виджета текстового редактора, но базовая реализация TextEdit была сильно ограничена, и сама Apple часто заявляла, что его не следует использовать в профессиональных приложениях. В результате разработчикам часто приходилось покупать дополнительные объекты для решения таких задач или создавать свои собственные. Отсутствие набора качественных графических объектов профессионального уровня можно считать одной из главных проблем MacApp. Эти проблемы были решены с выпуском MacApp R16. MacApp R16 использует стандартные элементы управления Carbon для всех объектов графического интерфейса MacApp. Например, Carbon представил многоязыковую текстовую систему (MLTE) для поддержки полного текста Unicode и длинных документов. В R16 оригинальный класс TTEView был заменён классом TMLTEView, который использует элемент управления MLTE.

Известные пользователи

Adobe Photoshop изначально был разработан с использованием MacApp 1.1.1 на языке Object Pascal, а затем портирован на C++ и MacApp 3.0 для версии Photoshop 2.5. После прекращения поддержки MacApp компанией Apple, его обслуживание было взято на себя внутренней командой разработчиков Photoshop, он был портирован на PowerPC и преобразован для использования с версией для платформы Windows.