Размышления о Программировании на С++

Размышления о Программировании на С++

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

В большинстве разработок имеются понятия, которые трудно представить в программе в виде одного из основных типов или как функцию без ассоциированных с ней статических данных. Если имеется подобное понятие, опишите класс, представляющий его в программе. Класс – это тип, это значит, что он задает поведение объектов его класса: как они создаются, как может осуществляться работа с ними, и как они уничтожаются. Класс также задает способ представления объектов. Но на ранних стадиях разработки программы это не является (не должно является) главной заботой. Ключом к написанию хорошей программы является разработка таких классов, чтобы каждый из них представлял одно основное понятие. Обычно это означает, что программист должен сосредоточиться на вопросах: Как создаются объекты этого класса? Могут ли эти объекты копироваться и/или уничтожаться? Какие действия можно производить над этими объектами? Если на такие вопросы нет удовлетворительных ответов, то во-первых, скорее всего, понятие не было «ясно», и может быть неплохо еще немного подумать над задачей и предлагаемым решением, вместо того, чтобы сразу начинать «программировать» сложности.

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

Понятие не существует в пустоте, всегда есть группы связанных между собой понятий. Организовать в программе взаимоотношения между классами, то есть определить точную взаимосвязь между различными понятиями, часто труднее, чем сначала спланировать отдельные классы. Лучше, чтобы не получилось неразберихи, когда каждый класс (понятие) зависит от всех остальных. Рассмотрим два класса, A и B. Взаимосвязи вроде «A вызывает функции из B», «A создает объекты B» и «A имеет члены B» редко вызывают большие сложности, а взаимосвязь вроде «A использует данные из B» обычно можно исключить (просто не используйте открытые данные-члены). Неприятными, как правило, являются взаимосвязи, которые по своей природе имеют вид «A есть B и ...».

Одним из наиболее мощных интеллектуальных средств, позволяющих преодолевать сложность, является иерархическое упорядочение, то есть организация связанных между собой понятий в древовидную структуру с самым общим понятием в корне. В С++ такие структуры представляются производными классами. Часто можно организовать программу как множество деревьев (лес?). То есть, программист задает множество базовых классов, каждый из которых имеет свое собственное множество производных классов. Для определения набора действий для самой общей интерпретации понятия (базового класса) часто можно использовать виртуальные функции (#7.2.8). Интерпретацию этих действий можно, в случае необходимости, усовершенствовать для отдельных специальных классов (производных классов).

Естественно, такая организация имеет свои ограничения. В частности, множество понятий иногда лучше организуется в виде ациклического графа, в котором понятие может непосредственно зависеть от более чем одного другого понятия, например, «A есть B и C и ...». В С++ нет непосредственной поддержки этого, но подобные связи можно представить, немного потеряв в элегантности и проделав малость дополнительной работы (#7.2.5).

Иногда для организации понятий некоторой программы оказывается непригоден даже ациклический граф, некоторые понятия оказываются взаимозависимыми по своей природе. Если множество взаимозависимых классов настолько мало, что его легко себе представить, то циклические зависимости не должны вызвать сложностей. Для представления множеств взаимозависимых классов с С++ можно использовать идею friend классов (#5.4.1).

Если вы можете организовать понятия программы только в виде общего графа (не дерева или ациклического направленного графа), и если вы не можете локализовать взаимные зависимости, то вы, по всей видимости, попали в затруднительное положение, из которого вас не выручит ни один язык программирования. Если вы не можете представить какой-либо просто формулируемой зависимости между основными понятиями, то скорее всего справиться с программой не удастся.

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

Вопрос «Как пишут хорошие программы на С++» очень похож на вопрос «Как пишут хорошую английскую прозу?» Есть два вида ответов: «Знайте, что вы хотите сказать» и «Практикуйтесь. Подражайте хорошему языку.» Оба совета оказываются подходящими к С++ в той же мере, сколь и для английского – и им столь же трудно следовать.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Наука: Размышления о чудесных выздоровлениях

Из книги Журнал «Компьютерра» N 29 от 15 августа 2006 года автора Журнал «Компьютерра»

Наука: Размышления о чудесных выздоровлениях Автор: Дмитрий ШабановНесмотря на летнее затишье в потоке научных новостей, за последнее время пришло несколько сообщений, которые могут изрядно расширить наши представления о пластичности собственных организмов.В 1984 году


10.3.1. Необходимые сведения о программировании на языке Си

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

10.3.1. Необходимые сведения о программировании на языке Си Начать стоит с того, что операционная система UNIX родилась на свет одновременно с языком программирования C (Си). Более того, язык C был создан специально для разработки этой ОС, значительная часть UNIX была написана на


12. Размышления о Vista

Из книги Как перейти на Windows Vista. Начали! автора Бардиян Дмитрий Владимирович

12. Размышления о Vista Менее чем через две недели после официального выпуска корпоративной версии Windows Vista хакерам удалось взломать сложную систему активации, считавшуюся разработчиками практически «непробиваемой». Взломавшие систему умельцы назвали программу для


Размышления об эффективности

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Размышления об эффективности [x]. Может ли элегантность и простота нанести удар по эффективности выполнения? Одна из причин широкого использования массивов состоит в том, что основные операции - доступ и изменение элемента - проходят быстро. Надо ли платить за каждый вызов


1.12. ПРОБЛЕМА ТИПОВЫХ ЭЛЕМЕНТОВ В ПРОГРАММИРОВАНИИ

Из книги Технологии программирования автора Камаев В А

1.12. ПРОБЛЕМА ТИПОВЫХ ЭЛЕМЕНТОВ В ПРОГРАММИРОВАНИИ Под типовыми элементами, или "кубиками", понимаются какие-то отдельно изготовленные типовые части, из которых можно было бы собирать множество программ. Проблема "кубиков" присуща не только программированию, и в разных


Часть III. Практикуемся в программировании на VBA

Из книги VBA для чайников автора Каммингс Стив

Часть III. Практикуемся в программировании на VBA Эта часть - сердце книги. Здесь, в сотворенных с любовью главах, я открою вам секреты мира VBA. Первая половина глав этой части систематизирует компоненты VBA-программы и раскрывает структуру этих компонентов, чтобы вы всегда


Часть III Практикуемся в программировании на VBA

Из книги Цифровой журнал «Компьютерра» № 161 автора Журнал «Компьютерра»

Часть III Практикуемся в программировании на VBA В этой части...После того как вы познакомились с основами программирования на VBA и решили попробовать свои силы, вам пора изучить материал части III В главе 11 рассматриваются встроенные функции и операторы VBA; я не рекомендую вам


Дмитрий Вибе: Размышления в постметеоритную эпоху Дмитрий Вибе

Из книги Цифровой журнал «Компьютерра» № 189 автора Журнал «Компьютерра»

Дмитрий Вибе: Размышления в постметеоритную эпоху Дмитрий Вибе Опубликовано 20 февраля 2013 Прошу прощения у читателей и редакции, но по сложившимся обстоятельствам ни о чём, кроме метеорита, я на этой неделе написать не могу. Все эти дни шла, да и


Почему мы позволяем нас обманывать, или Грустные размышления об иррациональности политической жизни Дмитрий Шабанов

Из книги Цифровой журнал «Компьютерра» № 199 автора Журнал «Компьютерра»

Почему мы позволяем нас обманывать, или Грустные размышления об иррациональности политической жизни Дмитрий Шабанов Опубликовано 30 апреля 2013 Я сейчас хочу обсудить сложную для меня тему, относительно которой не достиг ощущения полного


Стабилизация лавины законодательным путём: прогнозы и размышления Василий Щепетнёв

Из книги Цифровой журнал «Компьютерра» № 214 автора Журнал «Компьютерра»

Стабилизация лавины законодательным путём: прогнозы и размышления Василий Щепетнёв Опубликовано 02 сентября 2013 Трам, драм, бух — и на тарелку упало… нет, вот так: упали каловые массы. Ведущий и гости студии внимательно осмотрели продукт и пришли к


Обладает ли этнос самостоятельным бытием? Размышления о несогласии со Львом Гумилёвым Дмитрий Шабанов

Из книги Wiki-правительство [Как технологии могут сделать власть лучше, демократию – сильнее, а граждан – влиятельнее] автора Новек Бет

Обладает ли этнос самостоятельным бытием? Размышления о несогласии со Львом Гумилёвым Дмитрий Шабанов Опубликовано 12 ноября 2013 В трёх колонках (вот они: , и), написанных в августе этого года, я вторгся на территорию, на которой чувствую себя не


Облачная судьба домашней бухгалтерии: юбилейные размышления над тупиком Сергей Голубицкий

Из книги автора

Облачная судьба домашней бухгалтерии: юбилейные размышления над тупиком Сергей Голубицкий Опубликовано 24 февраля 2014 Сегодня очередная юбилейная статья — двухсотый выпуск «Битого Пикселя», колонки, которая пришла на смену «Голубятням Онлайн»