|
Программирование >> Полиморфизм без виртуальных функций в с++
неудачным и трудным для сопровождения программам на С++. Это происходит потому, что для проектирования хорошей программы на С++ необходимо пользоваться преимуществоми статической системы контроля типов, о не сражаться с ней. Smolltalk же поддерживоет динамические типы (и только их), о при переводе такого проектирования на С++ приходится постоянно прибеготь к небезопосным и некросивым приведениям типов. Думоется, что большоя часть приведений типов в программох на С++ - признок неудочно-го проектировония. Опираясь на свой опыт, отмечу, что программисты, довно пишущие на языке С, а также те, кто пришли к объектно-ориентировонному прогроммированию через Smalltalk, чаще всего пользуются приведениями типов, которых при другом проектировании легко можно было бы избежать. Кроме того, Smolltolk учит видеть в наследовании единственное или, по крайней мере, основное средство структурировония программ и организации клоссов в виде иерархий с одним общим корнем. В С++ классы - это типы, а наследование ни в коей мере не является единственным средством структурирования. В частности, основным средством для построения контейнерных клоссов являются шаблоны. Я также с большим подозрением отношусь к призывам зоставить писать в объектно-ориентированном стиле. Если человек не хочет чему-то учиться, то он и не научится. Если вы ие можете продемонстрировать принципы, стоящие за обстрагировонием данных и объектно-ориентированным программированием, то получите лишь нелепые и непровильные примеры использовония тех языковых средств, которые призваны поддержать эти концепции. В равной степени это относится к С++, Smolltalk и любому другому языку. Более подробное обсуждение взаимосвязей между разными средствами С++ и проектированием программ см. в книге Язык программировония С++ (второе издание) [2nd]. Надо ли приступать к изучению С++ как языка объектно-ориентированного программирования или как улучшенного С?Это зависит от обстоятельств, от того, зачем вы хотите овладеть С++. Именно ответ но донный вопрос и должен определить ваш подход к изучению языка. Судя по моему опыту, лучше всего изучать С++ снизу вверх , то есть сначала освоить те средства, которые предоставлены для традиционного процедурного программирования (улучшенный С), затем переходить к средствам абстрагирования данных и, наконец, к использованию иерархий классов как способа оргонизации взаимосвязанных классов. Но мой взгляд, проскочить первые этапы галопом опасно, поскольку есть вероятность упустить какую-то ключевую концепцию. Например, опытный прогроммист но С может решить, что подмножество, составляющее улучшенный С, ему хорошо знакомо и, читая учебник, пропустит строниц сто, где оно описывается. При этом он пройдет мимо возможности перегрузки функций, мимо разницы между присваиванием и инициолизацией, мимо использования операторе new для выделения помяти, мимо ссылок и некоторых других не столь вожных возможностей, а позже, когда придет время для более сложных вопросов, эти упущения не раз дадут о себе знать. Если вы действительно знокомы с концепциями, применяемыми в С-подмножестве, то на чтение сотни страниц уйдет всего пара чосов, о некоторые встретившиеся при этом детали окажутся интересными и полезными. Если же нет, то потротить время на чтение просто необходимо. Есть мнение, что при таком постепенном подходе программист ток всю жизнь и будет писать в стиле С. Конечно, это не исключено, но вероятность токого результото гораздо меньше, чем пытаются представить поборники чистых языков и принуждения при обучении программи-ровонию. Главное - осозноть, что успешное применение С++ как языко для обстрагировония данных и объектно-ориентированного программирования требует понимания нескольких новых концепций, которые не имеют прямых аналогов в С или Pascol. С++ - не просто новый синтаксис для вырожения старых идей. По крайней мере, для большинства программистов это не так. Отсюда следует, что требуется образовоние, а не только Во втором издании книги [Booch, 1993] используется только Сн обучение. Новые концепции подо изучоть и осваивать на практике. Испытанные приемы роботы придется пересмотреть. Не стоит бросаться делать все старым добрым способом , нужно искать новые пути. Допустимо утверждение, что зотраты времени и сил но изучение ключевых концепций абстрагирования данных и методов объектно-ориентированного прогроммировония ночиноют давать отдачу не в отдаленной перспективе, а уже через 3-12 месяцев. Использование С++ может принести пользу и без этого, но она будет тем больше, чем лучше усвоены основные концепции, и я не понимаю, зачем вообще переходить но С++ человеку, который не готов на начальном этапе потрудиться как следует. Приступая к изучению С++ впервые или после долгого перерыва, изыщите возможность прочитать по теме хорошую книжку или несколько удчано подобранных статей (они в избытке содержатся в журналах The С++ Report* и The С++ Journals). Также стоит посмотреть на исходные тексты кокой-нибудь большой библиотеки и порозмыслить над применяемыми том приемами. Это не повредит и тем, кто уже некоторое время работает с С++. С момента появления языко он и относящиеся к нему методы прогроммировония и проектировония сильно изменились. Чтобы убедиться в этом, достаточно бегло сравнить первое и второе издания книги Язык програлширования С++ . Сколько времени нужно для изучения С++? Это зависит от разных факторов: от вашего опыта и от того, что вы понимаете под словами изучение С++ . Для освоения синтаксиса и основ программирования но С++ кок но улучшенном С, о также для определения и использования простых классов большинству программистов достаточно одной-двух недель. Это легкая часть работы. Самое трудное, но и самое интересное, - овладение новыми методами проектирования и программирования. Большинство опытных программистов, с которыми я беседовал, говорят, что для глубокого освоения С++ и тех способов обстрогировония донных и объектно-ориентированного прогролшировония, которые поддерживаются языком, им потребовалось от полугода до полутора лет. При этом учились они прямо но рабочем месте и продолжали писать прогролшы, но в этот период использовали С++ осторожно . Если у вас есть возможность посвятить некоторое время исключительно изучению С++, то вы освоитесь быстрее, но у вас не будет возможности применить новые идеи к реальным проектам, о без этого обретенная уверенность может оказаться обманчивой. Объектно-ориентированные проектирование и прогролширова-ние - это практические, о не теоретические дисциплины. Если их не применять но практике или применять только к игрушечным примерам, то могут появиться негативные последствия. Замечу, что овладение языком С++ - это прежде всего изучение методов проектирования и прогролшировония, о не деталей. Рекомендую сначала проштудировать хороший учебник по С++, затем какую-нибудь книгу по проектированию, например [Booch, 1991], где есть прекрасные содержательные примеры но пяти языках (Ado, CLOS, С++, Smalltalk и Object Pascal). Больше всего в этой книге мне нравится изложение концепций проектирования и главы, где подобраны примеры. Взгляд но язык с точки зрения проектировщика резко контрастирует со скрупулезным изучением деталей определения языка, ведущимся обычно по книге ARM, в которой содержится много полезной информации, но ничего не сказано о том, кок писать программы но С++. При изучении С++ важно все время помнить о ключевых концепциях, чтобы не запутаться в технических деталях. При этом условии и изучение, и использование языка станут приятным и продуктивным делом. Доже поверхностное знание С++ может оказаться преимуществом по сравнению с владением С, о уж если приложить усилия к пониманию абстракций данных и объектно-ориентированных методов, то пользы будет намного больше . Надо учитывать и современное состояние инструментальных средств и библиотек. Имея более защищенную среду, например включающую по у.молчанию всесторонние проверки во время исполнения, и небольшую четко определенную библиотеку базовых классов, в рискованные эксперименты с С++ можно пуститься и несколько раньше. Это позволит сместить акценты от языковых средств С++ к тем методам программирования и проектирования, которые он поддерживает. Не стоит с головой погружаться в синтаксис и несущественные технические детали языка, как это любят делать программисты с большим стажем. Нередко такой интерес - не что иное, как обычное нежелание изучать новые .методы программирования. В каждой учебной группе и в каждом проекте обязательно находится кто-то, кто не может поверить, что С++ может быть достаточно эффективен, и пото.му старается не выходить за рамки испытанного С-подмножества. Только зная о конкретных результатах измерения производительности отдельных средств С++ и написанных на нем системах (например, [Russo, 1988], [Russo, 1990], [Keffer, 1992]), можно преодолеть стойкое убеждение, что средства более удобные, чем в С, обязательно должны требовать больших затрат. Пользователи, убежденные в том, что эффективность - аспект несуп1ествен-ный, также есть в каждой учебной или проектной группе. Они проектируют до такой степени обобщенные системы, что их медленная работа за.метиа даже на самом современном оборудовании. К сожалению, это обычно не видно в програ,м-мах, которые пишутся во вре.мя обучения, поэто.му проблемы из-за пренебрежительного отношения к ним проявляются лишь позже, уже в реальных проектах. 7.3. Пользователи и приложения Один аспект применения С++ никак не давал мне покоя: слишко.м многие приложения, с ним связанные, были довольно-таки необычными. Конечно, это могло быть потому, что такие приложения интереснее обсуждать, но я склонен подозревать, что причина более серьезна. Сила С++ в гибкости, эффективности и переносимости, поэтому его можно применять в проектах, где используются необычное оборудование, нестандартная операционная среда или требуется интерфейс с други.ми языками. Пример такого проекта - система для Уолл Стрит, которая должна была работать на мейнфрей.мах совместно с профаммами, написанными на COBOL, на рабочих станциях вместе с Fortran-программами, на ПК вместе с модулями на С и в сети, которая связывала все это оборудование. Данный пример убедительно свидетельствует о том, что с помошью С++ можно разрабатывать передовое промышленное материальное обеспечение. В этом отношении он заметно отличается от языков, использующихся в основном для экспериментов - промышленных, академических - или для обучения. Конечно, С++ находит широкое применение как в экспериментальных и исследовательских работах, так и в образовательных целях. Но его роль в промышленных профаммах обычно является определяющим фактором при выборе проектного решения. 7.3.1. Первые пользователи Вначале мирок С with Classes и С++ был совсем небольшим. Его характерной особенностью было изобилие личных контактов, которые способствовали обмену
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |