|
Программирование >> Полиморфизм без виртуальных функций в с++
Предоставлять всестороннюю поддержку для каждого поддерживаемого стиля программирования. С++ должен развиваться, чтобы не отставать от потребностей серьезных программистов. Простота, конечно, важна, но нужно принимать во внимание и сложность проектов, в которых используется С++. Удобство сопровождения системы, написанной на С++, и ее производительность считаются более важными, нежели краткость определения языка. В результате язык получается довольно сложным. Отсюда также следует, что нужно поддерживать много гибридных стилей программирования. Программисты пишут не только классы, укладывающиеся в узкие рамки либо абстрактного типа данных, либо объектно-ориентированного стиля. Иногда приходится писать классы, имеющие признаки того и другого одновременно. Нередки и программы, части которых написаны в разных стилях, отражающих вкусы и потребности автора. Следовательно, языковые средства нужно проектировать так, чтобы их можно было применять в разных сочетаниях. Отсюда вытекает некоторая ортогональность проектирования С++. Возможность необычного использования - важный источник гибкости, заложенной в С++. Так, в этом языке правила контроля доступа, поиска подходящего имени, привязки виртуальных и невиртуальных функций и проверки типов ортогональны. Это делает возможным применение различных приемов, опирающихся на сокрытие информации и наследование классов. Пользователи, предпочитающие видеть лишь жестко определенные стили программирования, называют это хакерством . С другой стороны, ортогональность не относится к числу первостепенных принципов языка. С++ - развитый язык, и из этого следует, что программисту придется не только изучить библиотеки и отдельные программы, но и освоить язык и базовые приемы его использования для проектирования. Для большинства пользователей такое смещение акцентов, привыкание к новым методам программирования и включение в свой арсенал прогрессивных средств должно быть постепенным. Лишь немногие могут усвоить все сразу и применить вновь приобретенные навыки на практике (см. раздел 7.2). С++ спроектирован так, чтобы постепенное освоение было возможным и естественным. Общий принцип таков: если не знаешь, то и не страдаешь. Статическая система контроля типов и предупреждения компилятора всегда помогут. Ничего не заставлять делать насильно. Программисты - толковые ребята. Перед ними ставятся непростые задачи, поэтому им пригодится все, что можно получить от языка программирования и сопутствующих инструментальных средств. Попытка ограничить пользователя, заставив его делать правильно , заведомо бессмысленна и обречена на провал. Программист найдет способ обойти ограничение, которое считает неприемлемым. Следовательно, язык должен поддерживать широкий диапазон разумных стилей проектирования и программирования, а не навязывать единую концепцию. Вышесказанное не означает, что все способы программирования равно хороши или что С++ должен поддерживать любой имеющийся стиль. С++ проектировался для прямой поддержки стилей проектирования, базирующихся на статическом контроле типов, абстрагировании данных и наследовании. Однако наставления на тему о том, как правильно использовать эти средства, сведены к минимуму, и никакие средства не добавлялись в язык и не исключались из него только ради того, чтобы воспрепятствовать некоему логически последовательному стилю программирования. Я хорошо знаю, что далеко не все ценят свободу выбора и разнообразие. Однако те, кто предпочитает более ограниченную среду, вольны наложить на С-ы-собственные правила или выбрать язык, предоставляющий программисту меньший выбор. Многим программистам не нравится, когда им говорят, что вот тут возможна ошибка , если они точно знают, что ошибки здесь быть не может. Поэтому потенциальные ошибки в С-ы- таковыми не являются. Например, не считается ошибкой объявление, в принципе допускающее неоднозначное использование. Ошибкой будет само неоднозначное использование, а не его возможность. Мой опыт показывает, что такие потенциальные ошибки никогда не проявляются, поэто.му откладывание диагностического сообщения обычно означает, что оно так и не будет выдано. Это приносит дополнительное удобство и гибкость. 4.3. Правила поддержки проектирования Перечисленные в таблице 4.3 правила относятся главным образом к роли С-ы-как инструмента поддержки проектирования на основе абстрагирования данных и объектно-ориентировашюго программирования. Иными словами, язык в них рассматривается, скорее, как средство организации процесса мышления и выражения идей на достаточно высоком уровне, нежели как высокоуровневый ассемблер , что характерно для С или Pascal. Таблица 4.3 Правила поддержки проектирования Поддерживать устоявшиеся методы проектирования Предоставлять средства для организации программ Точно говорить то, что имеется в виду Все возможности должны быть адекватны Важнее включить полезную возможность, чем предотвращать неправильное использование Поддерживать сборку программ из независимо разработанных частей Поддерживать устоявшиеся методы проектирования. Каждое языковое средство должно укладываться в общую структуру. Наличие таковой позволяет ответить на вопрос, какие возможности были бы желательны. Сам язык тут не помощник, системообразующие принципы закладываются на другом концептуальном уровне. Для С-ы- это уровень, на котором формулируются идеи о возможностях проектирования программы. Моей целью было поднять уровень абстракции в системном программировании. Точно так же С заменил ассемблер в роли главной опоры системщика. Все идеи по поводу новых возможностей рассматриваются в свете того, как они помогают улучшить выразительность языка для описания проектирования. В частности, способствуют ли они более эффективному представлению концепции в виде класса? Это ключ к тому, как в С++ поддерживаются абстракции данных и объектно-ориентированное программирование. Язык программирования не может и не должен быть полноценным языком проектирования. Последний, разумеется, богаче. Однако язык программирования по возможности напрямую поддерживает некоторые принципы проектирования, что облегчает взаимодействие между проектировщика,ми и программистами и создание инструментальных средств. Оценка языка программирования с точки зрения методов проектирования позволяет принимать или отвергать те или иные средства в зависимости от того, насколько удачно они соотносятся с поддерживаемыми стилями проектирования. Один язык не может поддержать все мыслимые стили, но должен быть адаптирован хотя бы к нескольким. Расширение С++ в направлении поддержки методик проектирования, ориентированных на улучшенный С , абстракцию данных и объектно-ориентированное программирование, по.могло избежать искушения сделать язык всем для всех , и в то же время сохранило постоянный стимул для улучшений. Предоставлять средства для организации программ. По сравнению с С, С++ помогает организовать программу так, чтобы ее было легко писать, читать и сопровождать. Я считал, что осуществлять вычислительную работу с С очень удобно. Конечно, у меня есть свои мысли, как можно было бы улучшить выражения и предложения С, но я решил сосредоточить усилия на другом. Когда кто-то предлагал новый вид выражений или предложений, я оценивал его по тому, может ли оно улучшить структуру программы или просто слегка упростит некоторые вычисления. За немногими исключениями (например, разрешение включать объявление при первом обращении к переменной, см. раздел 3.11.5), выражения и предложения С не подвергались модификациям. Точно говорить то, что имеется в виду. Фундаментальная проблема низкоуровневых языков программирования заключается в следующем. Имеется огромный разрыв между тем, что люди говорят друг другу в беседе, и тем, что они могут выразить на данном языке. Базовая структура програ,ммы теряется за нагромождением битов, байтов, указателей, циклов и т.д. Основное средство преодоления такого разрыва - сделать язык более декларативным. Почти все предоставляемые С++ средства предполагают объявление чего-либо, а затем использование дополнительных конструкций для проверки непротиворечивости, обнаружения глупых ошибок и генерирования оптимизированного кода. Там, где нельзя воспользоваться декларативной структурой, может помочь явная нотация. Хорошими примерами служат операторы выделения и освобождения па.мяти (см. раздел 10.2) и новый синтаксис приведения типов (см. раздел 14.3). Концепция пря.мого и явного выражения намерений на первых порах формулировалась так: позволить выразить все важное самим языком, а не с по.мо-щью ко.мментариев или трюков с макросами . Отсюда следует, что язык в целом
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |