Скотт Мейерс - Как функции, не являющиеся методами, улучшают инкапсуляцию

Здесь есть возможность читать онлайн «Скотт Мейерс - Как функции, не являющиеся методами, улучшают инкапсуляцию» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Год выпуска: 2000, Издательство: C/C++ user Journal, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Как функции, не являющиеся методами, улучшают инкапсуляцию: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Как функции, не являющиеся методами, улучшают инкапсуляцию»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Когда приходится инкапсулировать, то иногда лучше меньше, чем больше
Я начну со следующего утверждения: Если вы пишете функцию, которая может быть выполнена или как метод класса, или быть внешней по отношению к классу, Вы должны предпочесть ее реализацию без использования метода. Такое решение увеличивает инкапсуляцию класса. Когда Вы думаете об использовании инкапсуляции, Вы должны думать том, чтобы не использовать методы.
Удивлены? Читайте дальше.

Как функции, не являющиеся методами, улучшают инкапсуляцию — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Как функции, не являющиеся методами, улучшают инкапсуляцию», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Скотт Мейерс

Как функции, не являющиеся методами, улучшают инкапсуляцию

Предпосылка

Когда, в 1991 г., я писал первое издание "Эффективное использование C++" (Effective C++ [1]), я изучал проблему определения функций, связанных с классом. Для заданного класса Cи функции f, связанной с C, я разработал следующий алгоритм:

if (f необходимо быть виртуальной) сделайте f функцией-членом C;

else

if (f – это operator›› или operator‹‹) {

сделайте f функцией – не членом;

if (f необходим доступ к непубличным членам C) сделайте f другом C;

}

else if (в f надо преобразовывать тип его крайнего левого аргумента) {

сделайте f функцией – не членом;

if (f необходимо иметь доступ к непубличным членам C) сделайте f другом C;

} else сделайте f функцией-членом C;

Этот алгоритм хорошо служил мне многие годы, и когда я правил "Эффективное использование C++" для второй издания в 1997 г. [2], я не сделал никаких изменений в этот алгоритм.

Однако, в 1998 году, когда я проводил презентацию в Actel, где Аран Канду (Arun Kundu) заметил, что мой алгоритм диктовал, что функции должны быть методами даже тогда, когда они могли бы быть реализованы как не члены, которые использовали только открытый интерфейс класса C. "Это действительно, что-нибудь означает?" – спросил он меня? Другими словами, если fмогла бы быть реализован как функция-член (метод) или как функция не являющаяся не другом, не членом, я действительно защищал, что ее надо реализовать как метод класса? Я немного подумал об этом и решил, что это не то, то, что я подразумевал. Поэтому я изменил алгоритм [3]:

if (f необходимо быть виртуальной) сделайте f функцией-членом C;

else if (f – это operator›› или operator‹‹) {

сделайте f функцией – не членом;

if (f необходим доступ к непубличным членам C) сделайте f другом C;

} else if (f необходимо преобразовывать тип его крайнего левого аргумента) {

сделайте f функцией – не членом;

if (f необходимо иметь доступ к непубличным членам C) сделайте f другом C;

} else if (f может быть реализована через доступный интерфейс класса) сделайте f функцией – не членом;

else сделайте f функцией-членом C;

С той поры я критиковал программистов, которые освоили урок, преподанный объектно-ориентированным подходом, предлагающий помещать функции внутрь классов, содержащих данные, обрабатываемые этими функциями. В ответ они возражают мне, что это все делается ради инкапсуляции.

Но они ошибаются.

Инкапсуляция

Инкапсуляция не определяет вершину мира. Нет ничего такого, что могло бы возвысить инкапсуляцию. Она полезна только потому, что влияет на другие аспекты нашей программы, о которых мы заботимся. В частности, она обеспечивает гибкость программы и ее устойчивость к ошибкам. Посмотрите на эту структуру, чья реализация (я думаю, что мы все согласимся) не является инкапсулированной:

struct Point {

int x, y;

};

Слабостью этой структуры является то, что она не обладает гибкостью при ее изменении. Как только клиенты начнут использовать эту структуру, будет очень тяжело изменить ее. Придется изменять слишком много клиентского кода. Если бы мы позднее решили, что хотели бы вычислять x и y вместо того, чтобы хранить эти значения, мы были бы обречены на неудачу. У нас возникли бы аналогичные проблемы при запоздалом озарении, что программа должна хранить x и y в базе данных. Это реальная проблема при недостаточной инкапсуляции: имеется препятствие для будущих изменений реализации. Неинкапсулированное программное обеспечение негибко, и, в результате, оно не очень устойчиво. При изменении внешних условий программное обеспечение неспособно элегантно измениться вместе с ними. Не забывайте, что мы говорим здесь о практической стороне, а не о том, что является потенциально возможным. Понятно, что можно изменить структуру Point. Но, если большой объем кода зависит от этой структуры, то такие изменения не являются практичными.

Перейдем к рассмотрению класса с интерфейсом, предлагающим клиентам возможности, подобные тем, которые предоставляет выше описанная структура, но с инкапсулированной реализацией:

class Point {

public:

int getXValue() const;

int getYValue() const;

void setXValue(int newXValue);

void setYValue(int newYValue);

private:

… // прочее…

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Как функции, не являющиеся методами, улучшают инкапсуляцию»

Представляем Вашему вниманию похожие книги на «Как функции, не являющиеся методами, улучшают инкапсуляцию» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Как функции, не являющиеся методами, улучшают инкапсуляцию»

Обсуждение, отзывы о книге «Как функции, не являющиеся методами, улучшают инкапсуляцию» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x