Глава 14. Базовые концепции классов____________________________337
Например, фраза "О, какой прекрасный бриллиант" несет в себе ту же информацию, что и фраза "Какой исключительно элегантный экземпляр ограненного кристаллического спрессованного углерода". Все это длинное определение умещается в слове "бриллиант".
Эта особенность человеческого мышления обеспечивает возможность оперирования сложными понятиями посредством простых мнемоник, что неимоверно упрощает нам как общение, так и программирование. Мы создаем абстракцию комплексного понятия, а затем стараемся обеспечить удобные средства манипулирования этой абстракцией. В конечном счете, если нам удастся свести методы манипулирования классами к операциям и интуитивно понятным функциям, то сколь угодно сложные классы можно сделать практически столь же "ручными", как и базовые типы данных.
Достичь этого не всегда просто, но язык C++ со своей стороны обеспечивает вас всем необходимым, позволяя выражать весьма сложные понятия в интуитивно понятном и наглядном виде.
*
Все ли является классами?
Не переусердствуйте — не стоит пытаться все подряд представлять в виде классов. Во многих случаях классы являются не самым подходящим средством. Хотя вы пока и не знаете, как писать классы, это не помешает вам разобраться, насколько они подходят для реализации вашей концепции.
Когда использовать классы. Примите несколько общих советов о том, как выяснить, когда стоит использовать классы и когда лучше обойтись без них (но не воспринимайте эти указания как догму). Если в вашу абстракцию входит более одной-двух составных частей, независимо данных или функций, то смело создавайте класс. Старайтесь также использовать классы в тех случаях, когда следует обеспечить корректную инициализацию и деи-нициализацию ресурса. Это относится к таким вещам, как файлы, аппаратные устройства или процессы, требующие определенной серии шагов для инициализации и освобождения ресурса.
Когда не использовать классы. Обычно без классов можно обойтись, когда ваша абстракция содержит слишком мало данных-членов или функций-членов. Одиночные функции также чаще всего бессмысленно оформлять в виде класса; примерами этого могут служить алгоритмы сортировки или поиска (единственным переменным звеном в сортировке или поиске может являться тип данных; для таких случаев гораздо более, подходящим средством является функция-шаблон, см. главу 19 "Классы-шаблоны").
Сложность программирования заключается еще и в том, что оценка качества решения в высшей степени субъективна. Если два радикально отличающихся решения обеспечивают правильный результат и примерно одинаковое время выполнения, то какая реализация лучше, а какая хуже — это в