Б. Страуструп - Язык программирования С++ (1119446), страница 88
Текст из файла (страница 88)
Нужно учитыватьследующее:-Разработчикам и программистам требуется время для овладения новыми методами.-Новые программы должны взаимодействовать со старыми программами.-Старые программы нужно сопровождать (часто бесконечно).-Работа по текущим проектам и программам должна быть выполнена в срок.-Средства, рассчитанные на новые методы, нужно адаптировать к локальному окружению.Здесь рассматриваются как раз ситуации, связанные с перечисленными требованиями. Легконедооценить два первых требования.Поскольку в С++ возможны несколько схем программирования, язык допускает постепенный переход нанего, используя следующие преимущества такого перехода:-Изучая С++, программисты могут продолжать работать.-В окружении, бедном на программные средства, использование С++ может принестизначительные выгоды.-Программы, написанные на С++, могут хорошонаписанными на С или других традиционных языках.-Язык имеет большое подмножество, совместимое с С.взаимодействоватьс программами,Идея заключается в постепенном переходе программиста с традиционного языка на С++: вначале онпрограммирует на С++ в традиционном процедурном стиле, затем с помощью методов абстракцииданных, и наконец, когда овладеет языком и связанными с ним средствами, полностью переходит наобъектно-ориентированное программирование.
Заметим, что хорошо спроектированную библиотекуиспользовать намного проще, чем проектировать и реализовывать, поэтому даже с первых своих шаговновичок может получить преимущества, используя более развитые средства С++.Идея постепенного, пошагового овладения С++, а также возможность смешивать программы на С++ спрограммами, написанными на языках, не имеющих средств абстракции данных и объектноориентированного программирования, естественно приводит к проекту, имеющему гибридный стиль.Большинство интерфейсов можно пока оставить на процедурном уровне, поскольку что-либо болеесложное не принесет немедленного выигрыша. Например, обращение к стандартной библиотеке mathиз С определяется на С++ так:extern "C" {#include <math.h>}и стандартные математические функции из библиотеки можно использовать так же, как и в С.
Для всехосновных библиотек такое включение должно быть сделано теми, кто поставляет библиотеки, так чтопрограммист на С++ даже не будет знать, на каком языке реализована библиотечная функция.Использование библиотек, написанных на таких языках как С, является первым и вначале самымважным способом повторного использования на С++.На следующем шаге, когда станут необходимы более сложные приемы, средства, реализованные натаких языках как С или Фортран, представляются в виде классов за счет инкапсуляции структур данныхи функций в интерфейс классов С++. Простым примером введения более высокого семантическогоуровня за счет перехода от уровня процедур плюс структур данных к уровню абстракции данных можетслужить класс строк из $$7.6.
Здесь за счет инкапсуляции символьных строк и стандартных строковыхфункций С получается новый строковый тип, который гораздо проще использовать.Подобным образом можно включить в иерархию классов любой встроенный или отдельноопределенный тип. Например, тип int можно включить в иерархию классов так:class Int : public My_object {313Бьерн Страуструп.Язык программирования С++int i;public:// definition of operations// see exercises [8]-[11] in section 7.14 for ideas// определения операций получаются в упражнениях [8]-[11]// за идеями обратитесь к разделу 7.14};Так следует делать, если действительно есть потребность включить такие типы в иерархию.Обратно, классы С++ можно представить в программе на С или Фортране как функции и структурыданных. Например:class myclass {// representationpublic:void f();T1 g(T2);// ...};extern "C" { // map myclass into C callable functions:void myclass_f(myclass* p) { p->f(); }T1 myclass_g(myclass* p, T2 a) { return p->g(a); }// ...};В С-программе следует определить эти функции в заголовочном файле следующим образом:// in C header fileextern void myclass_f(struct myclass*);extern T1 myclass_g(struct myclass*, T2);Такой подход позволяет разработчику на С++, если у него уже есть запас программ, написанных наязыках, в которых отсутствуют понятия абстракции данных и иерархии классов, постепенноприобщаться к этим понятиям, даже при том требовании, что окончательную версии программы можнобудет вызывать из традиционных процедурных языков.12.2 КлассыОсновное положение объектно-ориентированного проектирования и программирования заключается втом, что программа служит моделью некоторых понятий реальности.
Классы в программе представляютосновные понятия области приложения и, в частности, основные понятия самого процессамоделирования реальности. Объекты классов представляют предметы реального мира и продуктыпроцесса реализации.Мы рассмотрим структуру программы с точки зрения следующих взаимоотношений между классами:-отношения наследования,-отношения принадлежности,-отношения использования и-запрограммированные отношения.При рассмотрении этих отношений неявно предполагается, что их анализ является узловым моментомв проекте системы. В $$12.4 исследуются свойства, которые делают класс и его интерфейс полезнымидля представления понятий. Вообще говоря, в идеале, зависимость класса от остального мира должнабыть минимальна и четко определена, а сам класс должен через интерфейс открывать лишьминимальный объем информации для остального мира.Подчеркнем, что класс в С++ является типом, поэтому сами классы и взаимоотношения между ними314Бьерн Страуструп.Язык программирования С++обеспечены значительной поддержкой со стороны транслятора и в общем случае поддаютсястатическому анализу.12.2.1 Что представляют классы?По сути в системе бывают классы двух видов:[1]классы, которые прямо отражают понятия области приложения, т.е.
понятия, которыеиспользует конечный пользователь для описания своих задач и возможных решений; и[2]классы, которые являются продуктом самой реализации, т.е. отражают понятия,используемые разработчиками и программистами для описания способов реализации.Некоторые из классов, являющихся продуктами реализации, могут представлять и понятия реальногомира. Например, программные и аппаратные ресурсы системы являются хорошими кандидатами нароль классов, представляющих область приложения. Это отражает тот факт, что систему можнорассматривать с нескольких точек зрения, и то, что с одной является деталью реализации, с другойможет быть понятием области приложения.
Хорошо спроектированная система должна содержатьклассы, которые дают возможность рассматривать систему с логически разных точек зрения. Приведемпример:[1]классы, представляющие пользовательские понятия (например, легковые машины игрузовики),[2]классы, представляющие обобщения пользовательских понятий (движущиеся средства),[3]классы, представляющие аппаратные ресурсы (например, класс управления памятью),[4]классы, представляющие системные ресурсы (например, выходные потоки),[5]классы, используемые для реализации других классов (например, списки, очереди,блокировщики) и[6]встроенные типы данных и структуры управления.В больших системах очень трудно сохранять логическое разделение типов различных классов иподдерживать такое разделение между различными уровнями абстракции. В приведенном вышеперечислении представлены три уровня абстракции:[1+2] представляет пользовательское отражение системы,[3+4] представляет машину, на которой будет работать система,[5+6] представляет низкоуровневое (со стороны языка программирования) отражение реализации.Чем больше система, тем большее число уровней абстракции необходимо для ее описания, и темтруднее определять и поддерживать эти уровни абстракции.
Отметим, что таким уровням абстракцииесть прямое соответствие в природе и в различных построениях человеческого интеллекта. Например,можно рассматривать дом как объект, состоящий из[1]атомов,[2]молекул,[3]досок и кирпичей,[4]полов, потолков и стен;[5]комнат.Пока удается хранить раздельно представления этих уровней абстракции, можно поддерживатьцелостное представление о доме. Однако, если смешать их, возникнет бессмыслица. Например,предложение "Мой дом состоит из нескольких тысяч фунтов углерода, некоторых сложных полимеров,из 5000 кирпичей, двух ванных комнат и 13 потолков" - явно абсурдно.