Найти в Дзене

Парадигмы программирования языка С++

Объектно-ориентированное программирование есть техника программирования, можно сказать, парадигма, для написания «хороших» программ для некоторого класса задач. Термин же «объектно-ориентированный язык программирования» должен в первую очередь означать такой язык, который хорошо поддерживает объектно-ориентированный стиль программирования.
Здесь следует четко различать две ситуации. Мы говорим,

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

Здесь следует четко различать две ситуации. Мы говорим, что язык поддерживает некоторый стиль программирования, если он предоставляет специальные средства, позволяющие этот стиль легко (удобно, надежно, эффективно) реализовывать на практике. Если же язык требует исключительных усилий и огромного опыта для реализации некоторой техники программирования, то мы говорим, что он лишь допускает возможность ее применения. Например, на языке Forran 77 можно писать структурные программы, а на языке С можно писать программы в объектно-ориентированном стиле, но все это требует неадекватно больших усилий, так как эти языки напрямую не поддерживают указанные стили программирования.

Поддержка парадигмы программирования осуществляется не только через специально для этого предназначенные языковые конструкции, но и более тонко через механизмы автоматическоrо выявления непреднамеренного отклонения от выбранной парадигмы как на этапе компиляции, так и/или на этапе выполнения программы. Строгая проверка типов является очевидным примером такого механизма; выявление неоднозначностей (двусмысленностей — ambiguities) и контроль исполнения программы дополняют языковые средства поддержки парадигмы программирования. Внеязыковые средства, такие как библиотеки и среды программирования, еще более расширяют реальную поддержку парадигмы.

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

1. Все эти средства должны естественно и элегантно интегрироваться в язык.

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

3. Неестественных «средств специального назначения» в языке должно быть как можно меньше.

4. Реализация средств поддержки парадигм не должна обременять не нуждающиеся в них программы.

5. От программиста нельзя требовать знаний тех аспектов языка, которых он явным образом не использует в своих программах.

Первый из перечисленных принципов апеллирует к эстетике и логике. Два последующих выражают концепцию минимализма. А два последних принципа гласят: «нет нужды — нет проблемы».

Язык С++ создавался с учетом перечисленных принципов как расширение языка С для добавления поддержки абстракции данных, объектно-ориентированного и обобщенного стилей программирования. Он не навязывает программисту конкретный стиль программирования.

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

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