Идиомы и стили С++ - [12]
Они не правы.
Выход есть. Нужно взять новогоднюю шняжку, опознать и учесть ее. Потом перегрузить у ней операторы operator[](), operator-›() и оператор приведения типа к элементу массива. Вы узнаете ее? Да это сэр Хьюго Баскервиль собственной персоной, он же Умный Указатель, он же Курсор, он же Proxy-объект! Вот черт, кто бы знал… Далее его именуем Курсором за сходство с аналогом из баз данных.
Так теперь перед кодом давайте самое важное вычленим:
1. Массив возвращает в операторе operator[] курсор.
2. Курсор имеет перегруженный оператор присваивания operator=(), что позволяет нам грамотно обрабатывать вставки и записи в массив.
3. Курсор может неявно преобразовываться к значению элемента массива, что позволяет нам грамотно читать из массива.
4. Курсор имеет перегруженный оператор operator-›(), что позволяет нам читать и… и в общем все, что нужно; смотри предыдущие шаги.
Теперь мы имеем семантический массив. Внутри может быть что угодно, но снаружи он совершенно неотличим, вообще. Элджер справедливо замечает: "внутреннюю реализацию Вы можете сменить даже на последних стадиях разработки". Я справедливо замечаю: "и ни одна… не до…". (Вообще это нам сержант Прищепкин говорил по поводу начищенности пряжки, но и здесь вполне подходит).
Еще по коду: Я написал для примера код, имитирующий базу данных наподобие SQL, потом засунул базу в класс такого массива и все такое… но получилось около 300 строк, и наглядность совсем пропала. Так что беру попроще - связанный список.
>class CThat {int a;};
>class CCursor;
>class CArray;
>class CNode;
>class CNode {
>public:
> int index;
> CThat* that;
> CNode* next;
> CNode (int _index, CThat* _that, CNode* _next): index(_index), that(_that), next(_next) {}
>};
>class CCursor {
>public:
>CArray* array;
>int index;
>CNode* node;
>CCursor(CArray* _array, int _index):
>array(_array), index(_index), node (NULL){};
>CCursor(CArray* _array, CNode* _node):
>array(_array), index (_node-›index), node (_node){};
>CCursor& operator=(CThat* _that);
>operator CThat*();
>CThat* operator-›();
>};
>class CArray {
>public:
> CNode* cells;
> CArray(): cells(NULL) {}
> CCursor operator[](int i);
>};
>CCursor CArray::operator[](int _index) {
> CNode* pNode = cells;
> while (pNode!=NULL)
>{
> if (pNode-›index -_index) {
> return CCursor(this, pNode);
> }
>else pNode=pNode-›next;
> }
> return CCursor(this, _index);
>}
>CCursor& CCursor::operator=(CThat* _that) {
> if (node==NULL) {
> node = new CNode (index, _that, array-›cells);
> array-›cells = node;
> } else {
> node-›that = _that;
> }
> return *this;
>}
>CCursor::operator CThat*() {
> return node != NULL ? node-›that : NULL;
>};
>CThat* CCursor::operator-›() {
> if (node == NULL) { throw 1; }
> return node-›that;
>}
Шаг 17 - Как НЕ создавать локальные переменные.
Что он сделал? Я не постигаю. Что нибудь особенное есть в этих словах: "Буря мглою…"? ___ Повезло ___ стрелял в него этот белогвардеец ___ и тем обеспечил бессмертие.
М. Булгаков. Мастер и Маргарита.
Лирическое отступление номер 2. Нажмите PageDown, если Вам неинтересно.
2001, апрель, 15.
Спасибо всем, написавшим отклики. Постараюсь проработать еще 3-4 больших темы и возможно бОльшую пачку маленьких идиом и приемов.
Увы, есть ограничивающие факторы: в первую очередь, это - просто тяжелый труд, а иных стимулов, кроме гордыни и тщеславия, нет. Второй фактор - текущее место работы, я подумываю его сменить. Понимаете, напрягают одноэсить, 1C в смысле, и если заставят, то шагам конец, да и деньги опять же; а я человек увлекающийся, и тем, чем занимаюсь, живу в полном смысле. Я вообще за шаги взялся потому, что решил продвинуть статус MCP до MCSD, стал учебники листать-повторять да и увлекся…
Как следствие: Если Вас заинтересовали мои шаги, и у Вас есть свободные вакансии программиста (и интересная, лучше трудная работа), прошу Вас и Ваш HR department (отдел кадров) рассматривать данные шаги как мое резюме.
Да-да, а что Вы хотите - естественно, это реклама…
Так, все, далее - заготовленный текст шага.
Иной раз найдешь какую-нибудь красивую фенечку, поразишься гению человека, ее придумавшего… и остается только жалеть, что не ТЫ это придумал, а ведь мог же, ну что тут такого! С другой стороны, широкое использование идей других людей и есть тот феномен, который позволил так быстро развиться компьютерной индустрии, и в конечном счете дающий нам работу. (Имею в виду конечно покупку Биллом Гейтсом операционки DOS в прошлом тысячелетии).
Ну ладно, будет. Перейдем к делу.
Допустим у Вас есть блажь - запретить конструирование объектов в стеке. Или другими словами - запретить создание локальных переменных. Зачем? Да как зачем - хочется и все… Ну хотя бы затем, чтобы они не удалялись при выходе за скобки. Или опять же, Вы создаете сообщения и толкаете их в очередь на обработку. Или Вы написали свой менеджер памяти (неплохое занятие кстати, позже будем разбирать управление памятью, увидите, сколь сие плодотворно). Вообще, стек и куча (stack и heap) вещи разные, у них разная скорость и вообще много разного. Смешивать никак нельзя. Ясно, для Вас это сейчас не проблема. Даже если не знали раньше, прочитали в шагах:
1. Определяем ВСЕ необходимые конструкторы.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Embedded system software. General requirements for development and documentationСтандарт подготовлен в развитие ГОСТ Р ИСО/МЭК 12207-99 «Информационная технология. Процессы жизненного цикла программных средств» с целью учета специфики разработки и документирования программного обеспечения встроенных систем реального времени.
«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.