Синтаксические проблемы
Синтаксические проблемы
Возможно что Вы, как и многие люди, с которыми я обсуждал эту проблему, имеете представление относительно синтаксического смысла моего утверждения, что не методы и не друзья предпочтительнее методов. Возможно, что Вы даже "купились" на мои аргументы относительно инкапсуляции. Теперь, предположим, что класс Wombat (Вомбаты – семейство австралийских млекопитающих отряда сумчатых. Благодарю Алекса за коррекцию перевода. А.Л.) поддерживает функциональные возможности, поедания и засыпания. Далее предположим, что функциональные возможности, связанные с поеданием, должны быть выполнены как метод, а засыпание может быть выполнено как член или как не член и не друг. Если Вы следуете моим советам, описанным выше, вы создадите описание подобные этим:
class Wombat {
public:
void eat(double tonsToEat);
…
};
void sleep(Wombat& w, double hoursToSnooze);
Это привело бы к синтаксическому противоречию для клиентов класса, потому что для
Wombat w;
они напишут:
w.eat(.564);
при вызове eat. Но они написали бы:
sleep(w, 2.57);
для выполнения sleep. При использовании только методов класса можно было бы иметь более опрятный код:
class Wombat {
public:
void eat(double tonsToEat);
void sleep(double hoursToSnooze);
…
};
w.eat(.564);
w.sleep(2.57);
Ах, эта всеобщая однородность! Но эта однородность вводит в заблуждение, потому что в мире имеется огромное количество функций, которые мечтают о вашей философии.
Чтобы непосредственно ее использовать, нужны функции – не методы. Позвольте нам продолжить пример Wombat. Предположим, что Вы пишете программу моделирования этих прожорливых созданий, и воображаете, что одним из методов, в котором Вы часто нуждаетесь при использовании вомбатов, является засыпание на полчаса. Ясно, что Вы можете засорить ваш код обращениями w.sleep (.5), но этих (.5) будет так много, что их будет трудно напечатать. А что произойдет, если это волшебное значение должно будет измениться? Имеется ряд способов решить эту проблему, но возможно самый простой заключается в определении функции, которая инкапсулирует детали того, что Вы хотите сделать. Понятно, что если Вы не являетесь автором Wombat, функция будет обязательно внешней, и вы будете вызвать ее таким образом:
// может быть inline, но это не меняет сути
void nap(Wombat& w) {w.sleep(.5);}
Wombat w;
…
nap(w);
И там, где Вы используете это, появится синтаксическая несогласованность, которой вы так боитесь. Когда Вы хотите кормить ваши желудки (wombats), Вы обращаетесь к методу класса, но когда Вы хотите их усыпить, Вы обращаетесь к внешней функции.
Если Вы самокритичны и честны сами с собой, вы увидите, что имеете эту предполагаемую несогласованность со всеми нетривиальными классами, Вы используете ее потому, что класс не может имеет любую функцию, которую пожелает како-то клиент. Каждый клиент добавляет, по крайней мере, несколько своих функций для собственного удобства, и эти функции всегда не являются методами классов. Программисты на C++ используют это, и они не думают ничего о этом. Некоторые вызовы используют синтаксис методов, а некоторые синтаксис внешних вызовов. Клиенты только ищут, какой из синтаксисов является соответствующим для тех функций, которые они хотят вызвать, затем они вызывают их. Жизнь продолжается. Это происходит особенно часто в STL (Стандартной библиотеки C++), где некоторые алгоритмы являются методами (например, size), некоторые – не методами (например, unique), а некоторые – тем и другим (например, find). Никто и глазом не моргает. Даже Вы.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Проблемы
Проблемы • Мониторинг в SQL базу активно пожирает дисковое пространство! Например, за неделю работы программы, при общем количестве прошедшего трафика порядка 40 гигабайт (82 миллиона пакетов), в таблице мониторинга образовалось 2 миллиона записей). Размер SQL–таблицы и
Проблемы
Проблемы 7.1. Что-то не работает, как найти причину? Вообще-то, этот вопрос не относится к какой либо из конкретных операционных систем, и опытные пользователи прекрасно знают ответ на него, но анализируя ваши письма мы пришли к выводу, что лишним он не будет. Прежде всего,
1.5.6. Проблемы при загрузке
1.5.6. Проблемы при загрузке ОС Linux может использовать разделы, которые расположены дальше 1024-го цилиндра, но не может загружаться с таких разделов. Поэтому, если вы не можете создать Linux-раздел «ближе» к началу диска, создайте небольшой раздел для точки монтирования /boot (не
B.6. Проблемы mIRC DCC
B.6. Проблемы mIRC DCC mIRC использует специфичные настройки, которые позволяют соединяться через брандмауэр и обрабатывать DCC соединения должным образом. Если эти настройки используются совместно с iptables, точнее с модулями ip_conntrack_irc и ip_nat_irc, то эта связка просто не будет
25. Проблемы с оборудованием
25. Проблемы с оборудованием Оборудование – физическая часть компьютера, куда входит все, что вы можете потрогать. Хотя оборудование доставляет меньшее количество проблем, чем программное обеспечение Windows XP (или любой другой операционной системы), они все-таки
2.1. Синтаксические правила
2.1. Синтаксические правила Синтаксические правила языка описывают допустимые способы соединения слов. В соответствии с нормами английского языка предложение «I see a zebra» («я вижу зебру») является синтаксически правильным в отличие от предложения «zebra see I а» («зебра видит
5. Проблемы и их решения
5. Проблемы и их решения Зависла программа Если зависла программа, то в таком случае существует несколько вариантов действий.• В Windows XP большинство зависших приложений можно закрыть, нажав кнопку: Программа попросит подтверждение (рис. 5.1). Нажимаем Завершить
1.1.3. Синтаксические выделения
1.1.3. Синтаксические выделения Помимо форматирования программного кода Emacs упрощает чтение файлов, написанных на C/C++, выделяя цветом различные синтаксические элементы. Например, ключевые слова могут быть выделены одним цветом, названия встроенных типов данных — другим, а
Синтаксические шаблоны
Синтаксические шаблоны Некоторые фрагменты кода представляют синтаксические шаблоны (syntax patterns), то есть модели кода, которые демонстрируют обязательные и необязательные элементы синтаксиса операторов SQL или команд командной строки.Для синтаксических шаблонов
Часть проблемы
Часть проблемы Автор: Киви БердСреди перлов народной мудрости, осевшей в пословицах и поговорках, переводчикам далеко не всегда удается находить равноценные эквиваленты для разных языков. Обычно лингвистические нюансы любят обыгрывать эстрадные юмористы, переводя, к
Проблемы (не)совместимости
Проблемы (не)совместимости Автор: Киви БердВ последнюю неделю мая окружной суд Хельсинки единогласно вынес «историческое» решение, постановив, что система защиты контента CSS, используемая на видеодисках DVD, является неэффективной (а значит, и ее снятие не является
Хьюстон, у нас проблемы!
Хьюстон, у нас проблемы! Похоже, нынешний «бархатный сезон» на юго-восточном побережье Соединенных Штатов обещает стать самым разрушительным за всю историю страны. Не прошло и месяца с тех пор, как грозная Катрина превратила Нью-Орлеан в Венецию (см. «КТ» #604, «КТ» #605), как
Сложные проблемы
Сложные проблемы Сборщик мусора сталкивается со следующими проблемами, вызванными практическими ограничениями на размещение объектов в современной ОО-среде:[x]. ОО-подпрограммы могут вызывать внешние программы, в частности, С-функции, которые могут, в свою очередь,
Проблемы с видеокартой
Проблемы с видеокартой Нет изображения на экране В большинстве случаев нужно просто вытащить и снова установить видеокарту (при выключенном компьютере), проверив подключение монитора к компьютеру. Хотя иногда нужна замена