![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BreakPointMAN |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Доброе время суток всем!
Вообщем, дружан подкинул мне такую задачку... Представим, что у нас имеется класс:
Надеюсь, что затруднений особых он не вызовет. Вот, каким образом мы обращаемся к переменной data? Через функции доступа - getData и setData, т.е. примерно так:
или так:
Товарищу моему такой вариант не слишком понравился... Говорит, что не наглядно и не слишком красиво... Хотелось бы видеть что-то вроде:
Ну, говорю, тогда помести переменную data в public:-секцию и не мучайся!.. Но тут возникает одно НО: нужен контроль за тем, что присваивается нашей переменной... Ну, если мы используем функцию доступа, то все просто:
Тут f - это функция, принимающая int и возвращающая bool, а в функции может быть записано какое-то условие, ну, например,
Разрешит изменение переменной data только в том случае, если мы захотим присвоить ей четное число; если число будет нечетным - то переменная меняться не должна. Вопрос в том, как сделать это, чтобы синтаксис работы с классом был такой: A a; a.data=10; // переменная изменится и станет равной 10 a.data=-7; // переменная не изменится, и останется равной 10 ??? Добавлено @ 07:42 Помучавшись немного, я пришел к следующему варианту... НО УСПОКОЙТЕ МЕНЯ - Я ИЗВРАЩЕНЕЦ ИЛИ НЕТ?! %)) Или можно проще?!
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||||||||||
|
|||||||||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В общем, все примерно так и делается, когда нужно обеспечить контроль за внутренними переменными, прозрачный для клиентского кода. Если не ощибаюсь, это паттерн "прокси".
Однако конкретный случай тем не менее является извращением: нельзя так грубо менять семантику оператора присваивания. Когда программист видит в коде выражение a = b, то он имеет право предполагать, что либо присваивание произойдет, либо будет исключение. А тут - либо присвоит, либо нет ... Такого рода действия нужно прямо выражать в коде, и не оператором, а функцией с "говорящим" названием типа TryToAssign. А ваш случай аналогичен переопределению оператора 'плюс' причем в смысле 'через раз поделим на 2'. -------------------- ... |
|||
|
||||
| Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
Property в C++:
взято отсюда -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
ммм... наверное, только, не "прокси", а "property"... %) мде... вообщем, я изобрел велосипед! %))) Ну ничего, зато интересно было...
Вообще говоря, да, я согласен. Но здесь функция f у него, насколько я понял, просто будет обеспечивать верификацию корректности задания значения св-ва, т.е. чтобы, например, число лежало в определенных границах и т.п. И ничего более... так что... в принципе... с натяжкой... думаю, что можно допустить этот вариант. 2 Alastis: спасибо за ссылку! -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
BreakPointMAN
Да, существует точка зрения, что иногда на красный свет идти можно (если никого нет и т.д.). Но в вопросах программирования я категорически против такой "избирательности". Проффесиональный программист от любителя отличается не только хорошим знанием языка, но и тем, что твердо знает: программы пишутся для людей, а не для компиляторов. Программиста из моей группы я бы за такой изыск просто убила, ей-богу. Насчет того, как называется паттерн - не помню, может и property... я имела ввиду паттерны от "банды четырех". -------------------- ... |
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Несмотря на то, что уже есть инфа о том, что есть паттерн "свойство", и как это дело реализовано в MS VC и BCB, ... я продолжил изобретение велосипеда... извращенец я всё-таки... мде...
- вынес все в отдельный класс - добавил параметризацию, сделав класс шаблонным - добавил специализацию для типа char* - ввел в интерфейс класса функтор - указатель на функцию проверки условия, должно присваиваться или нет... в принципе, если условиям r-value не подходит, можно выбрасывать исключение - так вроде правильнее будет... Короче, хз, что получилось, ... обычный класс-контейнер, по сути... Бред... но всё же выложу... уууух, и багов тут наверное!!! (хотя вроде проверял, работать должно)
Добавлено @ 21:56 Юзается примерно так:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
PS: для стандартных типов типа char, int, float, double, а также char* должно работать без проблем... а для остальных - надо чтобы в классах, которые типом будут, были корректно определены конструкторы (по умолчанию и копирования), операция присваивания и деструктор.
Добавлено @ 22:07
а то была, вообще, не моя идея... )) меня спросили - как сделать можно... ну и заинтересовало... good, что это pattern такой есть, good, что уже давно написан, проверен и отлажен и под BCB, и под MSVC, потыркаться все равно прикольно было. вот... ) -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Кстати, народ, может посоветуете что-нибудь по паттернам почитать, кто знает?
Хотелось бы побольше про всякие фишки узнать... Монотипы, синглетоны... бррр... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Что-то не помню я такого паттерна "property".
-------------------- Волны гасят ветер... |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Например здесь Добавлено @ 22:49 Хотя property и не относится к шаблонам проекитрования. -------------------- Волны гасят ветер... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
2Fantasist & Vyacheslav: спасибо!
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
К сожалению, ничего нового не увидел. Что мне не нравится присутвует и здесь - надо передавать тип класса в котором эта проперти используется для каждой проперти. Это сообщение отредактировал(а) Fantasist - 7.7.2005, 00:17 -------------------- Волны гасят ветер... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Как это так? Там кажется есть соглашение. Для определения проперти XXX нужно определить хотя бы один из методов getXXX и setXXX -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
А почему property не вносят в стандарт языка?? Ведь в Borland-e вполне себе работает. И синтаксис очень красивый.
Или оно порождает некие глюки, простым смертным не видные?? Или не согласуется с концепцией какой-нить?? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |