|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Рекомендации по проектированию классов1. Определитесь, какому понятию соответствует проектируемый класс. Максимально точно охарактеризуйте это понятие. Например: прямоуголник на плоскости со сторонами, параллельными осям (прямоугольной!) системы координат. 2. Определите минимальный набор независимых свойств данного понятия, который достаточен для полного и однозначного описания соответствующего понятию объекта. Например, для класса «(плоский) треугольник» это могут быть: а) три стороны; б) две стороны и угол между ними; в) одна сторона и два прилежащих к ней угла. Выберите один из этих наборов свойств. Ни в коем случае их не смешивайте — свойства должны быть независимыми! 3. Каждому такому свойству будет соответствовать одно (и только одно) поле класса. Определитесь с его типом и поместите соответствующее поле в private-область. Принято говорить, что совокупность значений всех полей определяет состояние объекта. Поля класса никогда не хранят информацию о состоянии двух или более объектов (данного класса) одновременно! 4. Часто бывает удобно обеспечить внешний доступ к некоторым полям класса. Это делается с помощью специальных методов, неформально именуемых «getter-ами» и «setter-ами». Например, если в вашем классе имеется поле по имени length (длина), то в public-область вы могли бы поместить следующие методы: ... public: void setLength(float len){length = len;} float getLength() const {return length;} ... 5. На первый взгляд может показаться, что это излишнее усложнение — помещать поле в часть private, а потом все равно писать в public’е целых два метода, которые, по сути, обеспечивают к нему доступ, эквивалентный public. Не лучше ли сразу поместить это поле в часть public? Нет, не лучше[1]. 6. Иногда бывает удобнее сделать один setter сразу на несколько полей вместо того, чтобы писать по одному setter’у на каждое из них. Так, для класса «треугольник» было бы логично написать: void setEdges(float a, float b, float c){...} или void setAngles(float alpha, float beta, float gamma){...} 7. Подобно setter’у с несколькими параметрами, часто бывает удобно создать конструктор с несколькими параметрами. Подумайте, какие свойства объекта вам, скорее всего, часто захочется задавать при его создании, и напишите соответствующий конструктор с параметрами. Очевидные кандидаты на такие конструкторы для класса «треугольник» перечислены в а), б) и в) в п.2. Причем уместны будут все три варианта одновременно (независимо от конкретного способа хранения состояния объекта!). 8. Не забудьте про конструктор по умолчанию. Он пригодится при создании массивов объектов, а также при создании «неинициализированных» объектов. Обычно такой конструктор записыает нули[2] в числовые поля класса, и пустые строки в поля строковые. Иногда (для целей отладки) в строковые поля бывает полезно записать что-то типа «default». В любом случае, конструктор по умолчанию должен оставлять после себя объект в непротиворечивом состоянии (например, стороны треугольника должны иметь такую длину, чтобы вообще складываться в треугольник, а сумма углов должна равняться 180 градусам). 9. Не откладывая в долгий ящик, только покончив с конструкторами, сразу напишите своему классу деструктор. Как правило, задача деструктора — освободить всю динамическую память, которая была выделена в конструкторе (а также во время всей последующей жизни объекта). 10. Вернемся к понятиям. Помимо набора свойств, для понятий часто бывают характерны также некоторые операции над ними (вернее, над предметами, обозначенными данным понятием). Простейшими операциями являются: · получение и установка отдельных свойств объекта; · конструирование объекта; · печать состояния объекта на экране; · ввод состояния объекта с клавиатуры. 11. Внимательно подумайте, какие операции характерны для данного понятия (операции в жизни, а не в программировании!) и добавьте в класс соответствующие им методы. Например, для треугольника сами собой напрашиваются следующие: · вычисление периметра; · вычисление площади; · масштабирование (пропорциональное увеличение или уменьшение всех сторон); · вычисление радиуса описанной окружности; · вычисление радиуса вписанной окружности; · приведение площади треугольника к единичной. 12. Если метод класса производит действия, не являющиеся операцией над данным объектом (this) — такого метода там быть не должно! Примеры неправильных методов: · · · 13. Внимание! Классы предназначены для повторного использования. Поэтому методы класса: · все исходные данные для своей работы берут из своих входных параметров или из соответствующего объекта класса (this); · результат своей работы — возвращают при помощи оператора return или записывают в соответствующий объект класса (this). С пользователем, сидящим за клавиатурой, методы классов не взаимодействуют![3] Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.008 сек.) |