Дж. Рамбо, М. Блаха - UML 2.0 - Объектно-ориентированное моделирование и разработка (1158633), страница 107
Текст из файла (страница 107)
Заменяйте длинные выражения с большой глубиной вложения на временные переменные. Не используйте одну и ту же переменную для разных целей внутри одного метода, даже если области действия этой переменной не перекрываются. Большинство компиляторов в любом случае оптимизируют переменные. Незначительное повышение эффективности не окупит потери удобочитаемости. ° Делайте методы понятными.
Метод можно считать понятным, если его код может понять кто-лнбо, кроме его создателя (а также сам создатель через некоторый промежуток времени после написания метода). Небольшие цельные методы в среднем получаются более понятными. 20.5. Программирование крупных систем 449 ° Используйте те же названия, что и в модели классов.
Названия сущностей в программе должны соответствовать названиям из модели классов. В программе могут использоваться дополнительные сущности, служашне целям реализации модели, но сущности, переносимые нз модели в программу, должны сохранять свои исходные имена. Следование этому правилу повышает возможности отслеживания изменений, документирования, а также улучшает понятность кода. Можно использовать дополнительные соглашения, помогающие избегать конфликтов имен. К таким соглашениям относятся префиксы имен.
° Аккуратно выбирайте имена. Имена должны точно описывать операции, классы и атрибуты, к которым они оз носятся. Выберите один стиль именования и следуйте ему всегда. Например, вы можете давать операциям имена вида действиеОбьект (например, аг[г)Е/етепг плп йаиН1КЫгНЬг). Создайте словарь часто используемых действий. К примеру, не стоит использовать и пет, и сгеаге в одной программе, если только они не несут разный смысл. Во многих объектно-ориентированных языках названця методов формируются автоматически из названий классов и операций.
Не используйте одинаковые имена методов для семантически различаю- шихся операций. Как показано на рис. 20.3, все методы с одинаковыми именами должны иметь одну и ту же сигнатуру (количество н тнп аргументов) и одинаковый смысл. мЬвисздитг0 — реноппа гпагпх 1пчетгоп яюб~й~ещ — Югпа Пдиге ираше Оочт С!гс!есагеай Пес!апд!асагеа11 Прае илыт Старайтесь иабеаать Рис. 20.3. Названия методов и зак 699 ° Следуйте правилам программирования. Команды, работающие над проектами, должны следовать правилам программирования, установленным в их организациях, или внешним стандартам, таким как [Чегп1еп!еп-001, Правила программирования касаются таких вопросов, как формат имен переменных, выделение управляющих структур отступамн, документирование методов в их заголовках, а также встроенное документирование.
° Используйте пакеты. Группируйте тесно связанные классы в пакеты (см, раздел 4.11). ° Документируйте классы и методы. Документация метода должна описывать его назначение, функции, контекст, входные и выходные данные, а также все предположения и предусловия, касающиеся состояния объекта. Вы должны описать не только детали алгоритма, но также причины его выбора.
Основные части метода следует документировать комментариями внутри этого метода. ° Избегайте дублирования кода. В работе [Вакег-95[ рассматриваются два приложения с обьемом кода более миллиона строк (одно из приложений — система Х 'чу'1пг[очч). Было обнаружено, что не менее 12 % кода было 450 Глава 20 ° Стиль программирования получено копированием, которого можно было избежать. В результате копирования код разбухает, что затрудняет его поддержку и понимание.
° Публикуйте спецификацию. Спецификация — зто контракт между создателем класса и его клиентами. После написания спецификации создатель класса не может нарушить ее условия, потому что в противном случае он причинит вред клиентам. Спецификация содержит объявления методов, но их должно быть достаточно, чтобы клиент мог использовать зти методы. Доступность в сети описания класса и его составляющих помогает обеспечить корректность использования этого класса.
Ниже приведены примеры спецификаций. Спецификация класса Название класса: Сис1е Версия: 1.0 Описание: Эллипс, большая и малая полуоси которого равны. Суперклассы: ЕПсрзе Составляющие: Закрытые атрибуты: сепгеп Рот( — координаты центра гайигк Кеа! — радиус окружности Открытые методы: г1гат(йгтйогп) — построение окружности в окне тгегзесгЕте(Е(пе): 5ег о(Рот(а — поиск точек пересечения отрезка и окружности, возвращает множество, содержащее от 0 до 2 точек агеа(): Аеа! — вычисляет плошадь круга рептегегОг йеа( — вычисляет длину окружности Закрытые методы: отсутствуют Спецификация операции Операция: тгегзесйлпе(Бпег Ете): зег о)' Ро1пгз Исходный класс: Сеотегпср(лиге Описание: Возвращает множество точек пересечения геометрической фигуры с отрезком.
Множество может содержать произвольное неотрицательное количество точек. Точки касания присутствуют в множестве в единственном числе. Если отрезок совпадает с прямолинейным сегментом фигуры, в множество включаются только две конечные точки прямолинейного сегмента. Статус: Абстрактная операция в исходном классе, должна быть перекрыта. Входные данные: зечг Сеотегпср(лиге — геометрическая фигура, для которой осуществляется поиск Йпе: Ете — отрезок, для которого ищутся точки пересечения 20.6. Резюме 451 Возвращает: Множество точек пересечения. Множество может содержать произвольное количество точек. Побочные эффекты: Никаких.
Ошибочные ситуации: Если фигуры не пересекаются, возвращает пустое множество. Если отрезок совпадает с линейным сегментом фигуры, множество будет содержать только две конечные точки этого линейного сегмента. Если фигура содержит ограничиваемую ей плошадь, рассматривается только граница этой фигуры. Спецификация метода Метод: Сгс!е:лпгегзесЖпе ййпес рте) 5ег а~ Ротгз Описание: Поиск точек пересечения (от О до 2) окружности и отрезка. Возвращает множество точек пересечения. Если отрезок является касательной к окружности, множество будет содержать одну точку.
Входные данные: хе~~:СгсГе — окружность Йпе:Ппе — отрезок Возвращает: Множество точек пересечения. Множество может содержать от О до 2 точек. Побочные эффекты: Никаких. Ошибочные ситуации: Если фигуры не пересекаются, возвращает пустое множество. Если отрезок является касательной к окружности, возвращает точку касания. Если радиус окружности равен О, возвращает единственную точку, при условии, что центр окружности лежит на отрезке. 20.6. Резюме Хороший стиль программирования помогает максимально реализовать преимущества объектно-ориентированного программирования.
Наибольший выигрыш достигается благодаря сокрашению затрат на обслуживание и усовершенствования, а также благодаря возможности повторного использования кода в новых приложениях. Правила хорошего стиля объектно-ориентированного программирования добавляют к обычным правилам новые, которые распространяются на уникальные концепции, присущие только объектно-ориентированному подходу. Одной из важных целей объектно-ориентированной разработки является повышение возможностей повторного использования классов и методов.
Повторное использование внутри одного приложения подразумевает поиск и консолидацию схожих участков кода. Планирование повторного использования в будущих приложениях требует больших затрат. Вероятность использования повышается, если 452 Глава 20 к Стиль программирования Таблица 20.1. Ключевые слова главы устойчивость видимость делегирование документирование инкапсуляция расширяемость оптимизация программирование крупных систем рефакторинг повторное использование Библиографические замечания Объектно-ориентированное программированис требует корректного воплощения концепций приложения в языковые конструкции. Большинство принципов, применимых к обычному программированию, распространяются и на объектноориентированное программирование.
Хорошим руковолством по стилю программирования является книга [Кегп1811ап-99!. Программирование крупных систем хорошо описано в известной книге !Вгоо1сз-95 !. Детальный список правил по программированию на 1ата приводится в !Чеппеи1еп-ОО!, и большая часть этих правил применима и к другим языкам. Литература !Вайег-95! Вгепс1а 5. Ва1сег. Оп 6пс11пй с1ир11сасюп апс! пеаг-с1ир1гсасюп !и!агйе зойтеаге зузсепиь Весопс! 1ЕЕЕ ЪЧогк1пй Соп1егепсе оп Вот егхе Еп81пеег1п8. 1и1у 1995, Тогопсо, Опсапо, 86 — 95.
методы делаются небольшими, цельными и локальными. Важно отделять политику от реализации. Чтобы использовать наследование, можно разбить общий метод на вспомогательные методы, часть из которых унаследовать от исходного класса, а другую часть определить в подклассах. Прн необходимости совместного использования методов между классами, не находящимися в родственных отношениях, следует применять делегирование. Большинство программ когда-нибудь приходится расширять. Способность к расширению можно повысить благодаря инкапсуляции, сокращению зависимостей, использованию методов для обращения к атрибутам других классов и ограничения видимости методов.