Re[2]: Свойства в С++
От: Шахтер Интернет  
Дата: 14.07.04 02:27
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>LaptevVV wrote:


>> Прочитал я тут статью Дениса Майдыковского
Автор(ы): Денис Майдыковский

В этой статье автор рассматривает различные способы реализации свойств в
стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++,
тогда как другие годятся для применения в любой программе, написанной на
языке C++.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.


ME>Вот здесь разжевано, чем плохи свойства: C++ Properties -- a Library Solution


ME>--

ME>Maxim Yegorushkin

Нет ни одного аргумента. Только ссылка на мнение неких безымянных "экспертов".
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Свойства в С++
От: MaximE Великобритания  
Дата: 14.07.04 07:31
Оценка: -1
Шахтер wrote:

> ME>Вот здесь разжевано, чем плохи свойства: C++ Properties -- a Library Solution

>
> Нет ни одного аргумента. Только ссылка на мнение неких безымянных "экспертов".

Лично для меня мнение эксперта — аргумент.

Вообще, я не вижу как property могут сделать мой код более элегантным, понятным, кратким и эффективным.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[2]: Свойства в С++
От: _nn_  
Дата: 14.07.04 07:34
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, LaptevVV, Вы писали:


LVV>>Прочитал я тут статью Дениса Майдыковского
Автор(ы): Денис Майдыковский

В этой статье автор рассматривает различные способы реализации свойств в
стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++,
тогда как другие годятся для применения в любой программе, написанной на
языке C++.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.


SDB>В том, что при чтении/записи значения можно выполнить произвольные действия (помимо собственно обращения к полю). Например, класс "окно" может иметь свойство "ширина", при назначении значения которого вызывается ::MoveWindow(). ИМХО — красота подобного решения это дело вкуса.


Чем хуже будет так :
class Window
{
 int _width;
public:
 int get_width() { return _width; }
 void set_width(int width) { _width=width; MoveWindow(...); }
};


Window wnd;
wnd.set_left(30); // неявный вызов MoveWindow

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 07:37
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, LaptevVV, Вы писали:


LVV>>В чем отличие от простых полей? Я на дельфях не писал.


G>Может в том, что можно при чтении/записи выполнять валидацию данных, какие-нить дополнительные действия по изменению состояния объекта ну и т.п. И в конце концов сами данные остаются скрытыми и могут быть изменены тока через паблик интерфейс. Хотя чем не угодили гетеры/сетеры — не понятно.


Очень просто.

сравни:

a.x++;

и

int x = a.get_x();
x++;
a.set_x(x);
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 07:39
Оценка: 1 (1) +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Прочитал я тут статью Дениса Майдыковского
Автор(ы): Денис Майдыковский

В этой статье автор рассматривает различные способы реализации свойств в
стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++,
тогда как другие годятся для применения в любой программе, написанной на
языке C++.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.


Простые публичные поля нарушают инкапсуляцию.
Свойства позволяют работать с инкапсулированными данными как с обычными полями (с синтаксической точки зрения), но при этом инкапсуляция полностью сохранена, так как все происходит через операции get/set.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 07:41
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>Здравствуйте, LaptevVV, Вы писали:


LVV>>>Прочитал я тут статью Дениса Майдыковского
Автор(ы): Денис Майдыковский

В этой статье автор рассматривает различные способы реализации свойств в
стиле Visual Basic на C++. Некоторые способы специфичны для Visual C++,
тогда как другие годятся для применения в любой программе, написанной на
языке C++.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.


SDB>>В том, что при чтении/записи значения можно выполнить произвольные действия (помимо собственно обращения к полю). Например, класс "окно" может иметь свойство "ширина", при назначении значения которого вызывается ::MoveWindow(). ИМХО — красота подобного решения это дело вкуса. :)


__>Чем хуже будет так :

__>
__>class Window
__>{
__> int _width;
__>public:
__> int get_width() { return _width; }
__> void set_width(int width) { _width=width; MoveWindow(...); }
__>};
__>


__>
__>Window wnd;
__>wnd.set_left(30); // неявный вызов MoveWindow
__>

__> :xz:

Тем, что тебе придется поддерживать текущее значение _width, т.е. повесить слушалку на события ресайза и т.д. и т.п.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Свойства в С++
От: _nn_  
Дата: 14.07.04 07:44
Оценка: +1
Здравствуйте, jazzer, Вы писали:


J>Тем, что тебе придется поддерживать текущее значение _width, т.е. повесить слушалку на события ресайза и т.д. и т.п.


А свойства ?
class Window
{
public:
 property(get_width,set_width) int width;
private:
 int get_width() { return width; }
 void set_width(int _width) { width=_width; MoveWindow(...); }
};

Window wnd;
wnd.width=10; // wnd.set_width(10);


Мне кажется вызов функции более нагляден чем свойство.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Свойства в С++
От: ssm Россия  
Дата: 14.07.04 07:59
Оценка:
Здравствуйте, jazzer, Вы писали:


J>сравни:


J>
J>a.x++;
J>

J>и

J>
J>int x = a.get_x();
J>x++;
J>a.set_x(x);
J>


сравни:

a.incAltitude();

and 

a.x++;
Re[5]: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 08:26
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Мне кажется вызов функции более нагляден чем свойство.

я же не с этим утверждением спорил, а отвечал на твой вопрос "Чем хуже будет так".
Вроде, ответил...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Свойства в С++
От: _nn_  
Дата: 14.07.04 08:28
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, _nn_, Вы писали:


__>>Мне кажется вызов функции более нагляден чем свойство.

J>я же не с этим утверждением спорил, а отвечал на твой вопрос "Чем хуже будет так".
J>Вроде, ответил...

Я просто хочу сказать, что и в случае свойства и в случае функции нужно будет все отслеживать, следовательно разница только в работе извне, точнее как это выглядит.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 08:31
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, jazzer, Вы писали:



J>>сравни:


J>>
J>>a.x++;
J>>

J>>и

J>>
J>>int x = a.get_x();
J>>x++;
J>>a.set_x(x);
J>>


ssm>сравни:


ssm>
ssm>a.incAltitude();

ssm>and 

ssm>a.x++;
ssm>



1. Altitude — это какое-то новое слово (в смысле, легко можно скатить в обсуждение смысловой составляющей кода, хотя изначально речь не об этом)
2. А как насчет:
++a.x;
--a.x;
a.x--;
a.x += 5;
c.x = a.x++ + ++b.x;
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 08:34
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, _nn_, Вы писали:


__>>>Мне кажется вызов функции более нагляден чем свойство.

J>>я же не с этим утверждением спорил, а отвечал на твой вопрос "Чем хуже будет так".
J>>Вроде, ответил...

__>Я просто хочу сказать, что и в случае свойства и в случае функции нужно будет все отслеживать, следовательно разница только в работе извне, точнее как это выглядит.


совершенно верно.
а отслеживать вообще ничего не надо, независимо от выбора между свойствами и функциями.
эта внутренняя переменная просто не нужна, все должно делаться через MoveWindow и GetWidth (или как там соответствующая функция API называется)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: Свойства в С++
От: _nn_  
Дата: 14.07.04 08:37
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, jazzer, Вы писали:


J>>>Здравствуйте, _nn_, Вы писали:


__>>>>Мне кажется вызов функции более нагляден чем свойство.

J>>>я же не с этим утверждением спорил, а отвечал на твой вопрос "Чем хуже будет так".
J>>>Вроде, ответил...

__>>Я просто хочу сказать, что и в случае свойства и в случае функции нужно будет все отслеживать, следовательно разница только в работе извне, точнее как это выглядит.


J>совершенно верно.

J>а отслеживать вообще ничего не надо, независимо от выбора между свойствами и функциями.
J>эта внутренняя переменная просто не нужна, все должно делаться через MoveWindow и GetWidth (или как там соответствующая функция API называется)
Так ведь внутри есть какая-то переменная, которая меняется, так что переменная нужна
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Свойства в С++
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 14.07.04 09:04
Оценка: 1 (1)
J>сравни:

J>
J>a.x++;
J>

J>и

J>
J>int x = a.get_x();
J>x++;
J>a.set_x(x);
J>




a.set_x(a.get_x()+1);


если дело только в инкременте :)
а вообще дело я так понимаю не в одном инкременте и полезность этих проперти вылазит на ваш взгляд когда часто используешь их...

Тут я согласен...
:) Но разве что в том почему вам так кажется...
На самом деле если копнуть... То если вам часто требуется использовать этот проперти, то элегантней создать кеширующую переменную :) и с ней играться:

int a_x = a->get_x();
a_x++;
a_x = a_y + b_x;
...
a->set_x(a_x);


и красивее и понятней и вызовов меньше...
чем если:

a.x++;
a.x = a.y + b.x;
...

согласен кода меньше... а внутри? :) вызовы методов...
Сейчас мне конечно скажут, что то аля : "В то время когда производительность процессоров ..." :)

Простота не всегда достигается просто...
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re[5]: Свойства в С++
От: ssm Россия  
Дата: 14.07.04 09:07
Оценка:
Здравствуйте, jazzer, Вы писали:


J>1. Altitude — это какое-то новое слово (в смысле, легко можно скатить в обсуждение смысловой составляющей кода, хотя изначально речь не об этом)


altitude(ENG) = die Höhe(DE)

J>2. А как насчет:

J>
J>++a.x;
J>--a.x;
J>a.x--;
J>a.x += 5;
J>c.x = a.x++ + ++b.x;
J>



class X
    {
    public:
        operator++()...
        ...
    }

    class A
    {
    public:
        property x(type "X" get="getX" set="setX")
    }


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


++а.х; 
--а.х; 
а.х--;



обект класса А не получает вообше никаких уведомлений о измемении агрегата, поэтому приведенное тобой сравнениe


а.х++; 

и 

int х = а.get_х(); 
х++; 
а.set_х(х);


совершенно не равназначны, в первом случае мы просто нарашиваем значение агрегата, а во втором мы даем обекту а
информазию о изменении агрегата



von http://www.mashke.org/cgi-bin/conv.cgi
Re[5]: Свойства в С++
От: Аноним  
Дата: 14.07.04 09:17
Оценка:
J>2. А как насчет:
J>
J>++a.x;
J>--a.x;
J>a.x--;
J>a.x += 5;
J>c.x = a.x++ + ++b.x;
J>


Ну а что мешает возвратить из метода get ссылку на переременную-член класса? Кроме того, логичнее и правильнее было бы реализовать два метода: один возвращает ссылку, а другой константную ссылку или копию переменной. Тогда в коде программы было бы видно зачем данная переменная член используется в данном месте и позволяло избежать глупых ошибок когда переменная-член в каком-то сложном выражении неожиданно изменяет свое значение.
Re[5]: Свойства в С++
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 14.07.04 09:22
Оценка:
J>2. А как насчет:
J>
J>++a.x;
J>--a.x;
J>a.x--;
J>a.x += 5;
J>c.x = a.x++ + ++b.x;
J>


О!!!
:)))
Именно то что я имел ввиду выше! :)))
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re[6]: Свойства в С++
От: _nn_  
Дата: 14.07.04 09:23
Оценка: +1
Здравствуйте, Аноним, Вы писали:


J>>2. А как насчет:

J>>
J>>++a.x;
J>>--a.x;
J>>a.x--;
J>>a.x += 5;
J>>c.x = a.x++ + ++b.x;
J>>


А>Ну а что мешает возвратить из метода get ссылку на переременную-член класса? Кроме того, логичнее и правильнее было бы реализовать два метода: один возвращает ссылку, а другой константную ссылку или копию переменной. Тогда в коде программы было бы видно зачем данная переменная член используется в данном месте и позволяло избежать глупых ошибок когда переменная-член в каком-то сложном выражении неожиданно изменяет свое значение.


А как отслеживать изменения ?
class X
{
int x;
public:
int& get_x() { return x; }
};

X a;
a.get_x()=3; // как узнаем что x изменился ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Свойства в С++
От: Glоbus Украина  
Дата: 14.07.04 09:31
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Glоbus, Вы писали:


G>>Здравствуйте, LaptevVV, Вы писали:



J>Очень просто.


J>сравни:


J>
J>a.x++;//вот читаю я код и задаюсь вопросом - это открытое поле класса или свойство
J>

J>и

J>
J>int x = a.get_x();
J>x++;
J>a.set_x(x);
J>


То есть не хочу разводить войну насчет пропертей, но саттер писал, что выбор надо делать в пользу прозрачности и понятности кода, и я лично с ним согласен. По моему субъективному мнению единственный недостаток пропертей — это именно неоднозначость при чтении кода.
Удачи тебе, браток!
Re[9]: Свойства в С++
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.04 09:36
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, _nn_, Вы писали:


__>>>Здравствуйте, jazzer, Вы писали:


J>>>>Здравствуйте, _nn_, Вы писали:


__>>>>>Мне кажется вызов функции более нагляден чем свойство.

J>>>>я же не с этим утверждением спорил, а отвечал на твой вопрос "Чем хуже будет так".
J>>>>Вроде, ответил...

__>>>Я просто хочу сказать, что и в случае свойства и в случае функции нужно будет все отслеживать, следовательно разница только в работе извне, точнее как это выглядит.


J>>совершенно верно.

J>>а отслеживать вообще ничего не надо, независимо от выбора между свойствами и функциями.
J>>эта внутренняя переменная просто не нужна, все должно делаться через MoveWindow и GetWidth (или как там соответствующая функция API называется)
__>Так ведь внутри есть какая-то переменная, которая меняется, так что переменная нужна :)
А откуда она взялась?
Имхо, в данном случае свойство должно реализовываться непосредственно через АПИ, без промежуточных переменных
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.