Дональд Бокс - Сущность технологии СОМ. Библиотека программиста стр 13.

Книгу можно купить на ЛитРес.
Всего за 24.5 руб. Купить полную версию
Шрифт
Фон

Инкапсуляция и С++

Предположим, что вам удалось преодолеть проблемы с транслятором и компоновщиком, описанные в предыдущем разделе. Очередное препятствие при построении двоичных компонентов на C++ появится, когда вы будете проводить инкапсуляцию (encapsulation), то есть формирование пакета. Посмотрим, что получится, если организация, использующаяFastString в приложении, возьмется выполнить невыполнимое: закончит разработку и тестирование за два месяца до срока рассылки продукта. Пусть также в течение этих двух месяцев некоторые из наиболее скептически настроенных разработчиков решили протестироватьO(1)-поисковый алгоритмFastString, запустив профайлер своего приложения. К их большому удивлению,FastString::Find стала бы на самом деле работать очень быстро, независимо от заданной длины строки. Однако с операторомLength дело обстоит не столь хорошо, так какFastString::Length использует подпрограммуstrlen из динамической библиотеки С. Эта подпрограмма – алгоритмO(n) – осуществляет линейный поиск по строкам с использованием символа конца строки (null terminator); скорость его работы пропорциональна длине строки. Столкнувшись с тем, что клиентское приложение может многократно вызывать операторLength , один из таких скептиков, скорее всего, свяжется с разработчиком библиотеки и попросит его убыстритьLength , чтобы его работа также не зависела от длины строки. Но здесь есть одно препятствие. Разработчик библиотеки уже закончил свою разработку и, скорее всего, не расположен менять одну строку исходного кода, чтобы воспользоваться преимуществами улучшенного методаLength . Кроме того, некоторые другие разработчики, возможно, уже выпустили свои продукты, основанные на текущей версииFastString , и теперь разработчик библиотеки не имеет морального права изменять эти приложення.

С этой точки зрения нужно просто вернуться к определению классаFastString и решить, что можно изменить и что необходимо сохранить, чтобы уже установленная база успешно функционировала. К счастью, классFastString был разработан с учетом возможности инкапсуляции, и все его элементы данных ( data members) являются закрытыми ( private). Это придает классу значительную гибкость, так как ни одна клиентская программа не может непосредственно получить доступ к элементам данныхFastString . В силу того, что по отношению к четырем открытым ( public) членам класса не было сделано никаких изменений, то и в любом клиентском приложении никаких изменений также не потребуется. Вооружившись этой верой, разработчик библиотеки переходит к реализацииFastString версии 2.0.

Очевидным улучшением является следующее решение: в тексте конструктора ( constructor) занести длину строки в кэш и возвращать кэшированную длину в новой версии методаLength. Так как строка не может быть изменена после создания, нет необходимости беспокоиться, что ее длина будет вычисляться многократно. В действительности длина уже однажды вычислена в конструкторе при назначении буфера, так что понадобится только горстка дополнительных машинных инструкций. Вот каким будет модифицированное определение класса:

// faststring.h version 2.0

class declspec(dllexport) FastString {

const int mcch;

// count of characters

// число символов

char mpsz;

public:

FastString(const char *psz);

~FastString(void);

int Length(void) const;

// returns # of characters

// возвращает число символов

int Find(const char *psz) const;

// returns offset – возвращает смещение

};

Отметим, что единственной модификацией является добавление закрытого элемента данных. Чтобы правильно инициализировать такой элемент, конструктор должен быть изменен следующим образом:

FastString::FastString(const char *psz) : mcch(strlen(psz)), mpsz(new char[mcch + 1])

{

strcpy(mpsz, psz);

}

С введением кэшированной длины метод Length становится тривиальным:

int FastString::Length(void) const

{

return mcch;

// return cached length

// возвращает скрытую длину

}

Сделав эти три модификации, разработчик библиотеки може

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub