Введение

В программировании компьютеров Apple Macintosh, Component Manager был одним из множества подходов к повторному использованию кода, зародившихся на компьютерах Macintosh до PowerPC. Он был впервые представлен как часть QuickTime, которая оставалась наиболее активным пользователем этой технологии в классической Mac OS.

Технические детали

Компонент представлял собой фрагмент кода, предоставляющий различные функции, которые могли вызываться клиентами. Каждая функция идентифицировалась знаковым 16-битным целым числом в качестве ID-кода. Неположительные коды были зарезервированы для предопределенных функций, которые должны были пониматься всеми компонентами – открытие/закрытие экземпляра компонента, запрос о поддержке функции и т.п. Значения положительных кодов функций зависели от типа компонента. Экземпляр компонента создавался путем открытия компонента. Это вызывало функцию открытия компонента для выделения и инициализации необходимой памяти для экземпляра. Закрытие экземпляра освобождало эту память и делало недействительными все ссылки на этот экземпляр. Компоненты и экземпляры компонентов адресуются 32-битными значениями, которые не являются указателями. Вместо этого они интерпретируются как ключи во внутренние таблицы менеджера компонентов. Эти ссылки генерировались таким образом, что после того, как они становились недействительными, эти значения вряд ли снова становились бы действительными в течение длительного времени. Это минимизировало вероятность возникновения трудноуловимых ошибок из-за висячих ссылок. Компоненты идентифицировались кодами OSType, указывающими их тип, подтип и "производителя". Например, тип компонента мог быть "компрессор растровых изображений", для которого могли существовать подтипы для JPEG, H.261, Sorenson и Intel Indeo, среди прочих. Была возможность зарегистрировать несколько компонентов с совершенно одинаковыми идентификационными кодами, предоставляя альтернативные реализации одного и того же алгоритма, например, с использованием аппаратных и программных средств, компромисса между скоростью и качеством или других критериев. Приложения могли запрашивать наличие таких альтернатив и делать явный выбор между ними или позволять системе выбирать значение по умолчанию. Среди доступных опций компонент мог делегировать часть своих функций другому компоненту в качестве формы подклассинга для повторного использования кода. Также было возможно, чтобы один компонент захватил другой, что означало, что весь доступ к захваченному компоненту должен был осуществляться через захватывающий компонент.