Пусть располагается, имя файла не играет большой роли. Мы точно так же можем включить в interrupt.c заголовок Timer.h с тем же содержимым, ничего принципиально не изменится. Клиенты видят единственную функцию для доступа к счетчику тиков, внутрь модуля доступ закрыт.Goodefine писал(а): Такой вариант сразу вызывает вопросы.
1. Что будет если обработчик прерывания таймера вынужденно размещен в другом .с модуле? Это не надумано, ведь задач, которые используют таймер, может быть много - пусть в общем случае обработчик располагается в файле interrupt.c .
Хотя в принципе даже в случае множества задач, которые работают с таймером, можно заставить их работать через интерфейс.
Не совсем так. Функцию записи можно вынести в отдельный интерфейс, скажем, TimerModify.h . Этот интерфейс включаем лишь в те избранные модули, которые имеют право модифицировать часы. Все остальные работают с таймером через общедоступный интерфейс только на чтение. Это принципиально отличается от глобального варианта, ведь выставив объект на всеобщее обозрение, мы теряем дальнейший контроль над его модификациями.Goodefine писал(а):2. Значение надо иногда еще и корректировать (обнулять счетчик или флаг). Если добавить интерфейсную функцию записи, то мы получим вариант уж совсем не отличающийся по безопасности доступа от глобальной переменной.
В метод записи в закрытую переменную можно добавить еще и контроль допустимости действий. Например, если клиент пытается записать недопустимое значение (для нашего примитивного примера это, возможно, лишено смысла, но в других приложениях может оказаться полезным), его попытка игнорируется. Или, скажем, в определенные моменты сбрасывать таймер запрещено. С глобальным объектом таких возможностей нет принципиально - любой клиент с ошибкой в коде может изменить его целостность.
J. Ganssle


