7.3 Предварительная обработка

Предыдущая  Содержание  Следующая V*D*V

Какую предварительную обработку команд должен выполнять ooc? Просмотр нашего эксперимента с Point в разделе 7.1 выявляет три области, в которых ooc может помочь: при наличии имени метода он знает заголовок метода; при наличии метода он может проверить и проимпортировать параметры объекта; где-то он может создать селекторы, конструктор метакласса и функцию инициализации как это требуется. После экспериментов с Point выглядит разумно такой файл реализации Point.dc:

 

% move {

%casts

    self -> x += dx, self -> y += dy;

}

% Point ctor {

    struct Point * self = super_ctor(Point, _self, app);

 

    self -> x = va_arg(* app, int);

    self -> y = va_arg(* app, int);

    return self;

}

% Point draw {

%casts

    printf("\".\" at %d,%d\n", x(self), y(self));

}

%init

 

Жирный шрифт указывает, что ooc находит интересным:

 

% method {

заголовок для статически компонуемых методов

% class method {

заголовок для перезаписи динамически компонуемых методов

%casts

импорт параметров объектов

%init

создание селекторов и кода инициализации

 

Для метода со статической компоновкой класс, для которого он объявлен, уже известен. Тем не менее, этот класс может быть указан в любом случае и если позднее мы решим изменить компоновку метода, нам не потребуется снова редактировать исходник.

Есть вопрос — не должны ли мы требовать, чтобы заголовок метода быть объяснён программистом, списком параметров и так далее. Хотя это сделало бы файл реализации легче читаемым, такое труднее поддерживать, если определение метода изменяется. Это также (незначительно) труднее разбирать.

 

Предыдущая  Содержание  Следующая