. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
В том, что при чтении/записи значения можно выполнить произвольные действия (помимо собственно обращения к полю). Например, класс "окно" может иметь свойство "ширина", при назначении значения которого вызывается ::MoveWindow(). ИМХО — красота подобного решения это дело вкуса.
Здравствуйте, LaptevVV, Вы писали:
LVV>В чем отличие от простых полей? Я на дельфях не писал.
Может в том, что можно при чтении/записи выполнять валидацию данных, какие-нить дополнительные действия по изменению состояния объекта ну и т.п. И в конце концов сами данные остаются скрытыми и могут быть изменены тока через паблик интерфейс. Хотя чем не угодили гетеры/сетеры — не понятно.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
maq>Да в общем ни в чем. Это синтаксический сахар
Вот и мне так показалось. Тем более, что средствами С++, как у Дениса написано, можно это все отлично реализовать. Нефиг в транслятор засовывать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
maq>>Да в общем ни в чем. Это синтаксический сахар LVV>Вот и мне так показалось. Тем более, что средствами С++, как у Дениса написано, можно это все отлично реализовать. Нефиг в транслятор засовывать.
В том виде, в каком свойства можно реализовать исключительно на с++, они нафиг никому не нужны. Если бы они были как в шарпе, в дельфях или хотя бы в VC — было бы круто.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал. > > В том, что при чтении/записи значения можно выполнить произвольные действия (помимо собственно обращения к полю). Например, класс "окно" может иметь свойство "ширина", при назначении значения которого вызывается ::MoveWindow(). ИМХО — красота подобного решения это дело вкуса.
Вот это как раз не прелесть, а ужас.
Концептуально, у объекта есть состояние и поведение (еще identity, но здесь это нас не интересует). Состоянием рекоммендуется манипулировать только через методы объекта (инкапсуляция). Когда мы начинаем манипулировать состоянием объекта напрямую (нарушение инкапсуляции) — это уже создает бардак в коде, так как нет гарантий, что инвариант класса не нарушен. Но когда изменение состояния вызывает еще какое-то поведение — это полный кошмар, т.к. из такого кода неясно, где просто изменяется переменная объекта, а где изменение состояния влечет за собой цепочку вызовов — поведение.
Здравствуйте, MaximE, Вы писали:
ME>Вот это как раз не прелесть, а ужас.
ME>Концептуально, у объекта есть состояние и поведение (еще identity, но здесь это нас не интересует). Состоянием рекоммендуется манипулировать только через методы объекта (инкапсуляция). Когда мы начинаем манипулировать состоянием объекта напрямую (нарушение инкапсуляции) — это уже создает бардак в коде, так как нет гарантий, что инвариант класса не нарушен.
Свойства нарушают инкапсуляцию? Каким образом
ME>Но когда изменение состояния вызывает еще какое-то поведение — это полный кошмар, т.к. из такого кода неясно, где просто изменяется переменная объекта, а где изменение состояния влечет за собой цепочку вызовов — поведение.
Перегруженные операторы присваивания в C++ делают тоже самое и никого это не пугает
"For every complex problem, there is a solution that is simple, neat,
and wrong."
AndrewJD wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>Вот это как раз не прелесть, а ужас. > > ME>Концептуально, у объекта есть состояние и поведение (еще identity, но здесь это нас не интересует). Состоянием рекоммендуется манипулировать только через методы объекта (инкапсуляция). Когда мы начинаем манипулировать состоянием объекта напрямую (нарушение инкапсуляции) — это уже создает бардак в коде, так как нет гарантий, что инвариант класса не нарушен. > > Свойства нарушают инкапсуляцию? Каким образом
(хотя статья про Java, все верно)
> ME>Но когда изменение состояния вызывает еще какое-то поведение — это полный кошмар, т.к. из такого кода неясно, где просто изменяется переменная объекта, а где изменение состояния влечет за собой цепочку вызовов — поведение. > > Перегруженные операторы присваивания в C++ делают тоже самое и никого это не пугает
Не понял, что "то же самое" делают операторы присваивания?
ME>Не понял, что "то же самое" делают операторы присваивания?
когда изменение состояния вызывает еще какое-то поведение — это полный кошмар, т.к. из такого кода неясно, где просто изменяется переменная объекта, а где изменение состояния влечет за собой цепочку вызовов — поведение.
Т.е. операторы с таким же успехом могут повлечь за собой цепочку вызовов. Это проблема дизайна, а не свойств
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>В том, что при чтении/записи значения можно выполнить произвольные действия (помимо собственно обращения к полю). Например, класс "окно" может иметь свойство "ширина", при назначении значения которого вызывается ::MoveWindow(). ИМХО — красота подобного решения это дело вкуса.
Imho, изящнее сделать метод-модификатор: set....(..) и в нем устанавливать поле и выполнять прозвольные действия
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
maq>>>Да в общем ни в чем. Это синтаксический сахар LVV>>Вот и мне так показалось. Тем более, что средствами С++, как у Дениса написано, можно это все отлично реализовать. Нефиг в транслятор засовывать.
AJD>В том виде, в каком свойства можно реализовать исключительно на с++, они нафиг никому не нужны. Если бы они были как в шарпе, в дельфях или хотя бы в VC — было бы круто.
Был бы крутой бардак и не более. Приходилось как то с прогой возиться где проперти на каждом шагу, если бы не ВизуалАссист, который показывает ху есть ху, то повеситься можно просто.
Every choice has a good and bad side, and you make your choice in the context of overall criteria defined by necessity. Good and bad are not absolutes, however. A good decision in one context might be bad in another.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Denwer, Вы писали:
D>Был бы крутой бардак и не более. Приходилось как то с прогой возиться где проперти на каждом шагу, если бы не ВизуалАссист, который показывает ху есть ху, то повеситься можно просто.
И причем тут свойства? Можно все было с таким же успехом все слить в одну функцию с кучей goto. А по пооводу ху есть ху то перегрузка операторов ничем не лучше
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
AJD>И причем тут свойства? Можно все было с таким же успехом все слить в одну функцию с кучей goto. А по пооводу ху есть ху то перегрузка операторов ничем не лучше
Просто к перегрузке привыкли с самого начала, а к свойствам — нет. Тем более, что они поддерживаются только в диалекте VC (может быть, ещё в билдере? — не знаю).
И, как и другие MS-овские штучки, были прикручены туда не из любви к искусству, а под конкретную задачу. А именно, для автоматизации программирования COM-овских свойств.
Поскольку у COM-интерфейса нет публичных переменных, а есть только свойства — то любое обращение к состоянию (чтение или запись) вызывает поведение. Признав этот факт, можно в дальнейшем более не комплексовать на этот счёт.
Насколько поведение соответствует ожиданиям — это вопрос. Но вопрос не свойств как конструкции языка, а данного конкретного компонента. Если функция YourClass::getSomething()const модифицирует объект, скрытый за фасадом YourClass — идите к автору...
IMHO, основная прелесть свойств в том, что они позволяют красиво заткунь места, в которых кто-то поленился сделать setter/getter
Можно, конечно, громко кричать фии, но, IMHO, на практике вещь довольно полезная.
Они позволяют внести исправления в одном месте, а не перелопачивать весь код, заменяя прасваивания на вызов функции.
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
Сравнение :
public поля:
class A
{
public:
int x; // если x 0 то возвратить нужно 1
};
// использование
A a;
a.x=10;
int x=a.x;
// преимущества
// нет вызовов промежуточных функций - можно расмотреть как и недостаток
// проблемы
// невозможно отследить момент изменения поля
a.x=0; // не будет написана ошибка
// невозможно отследить момент получения поляint x=a.x; // x==0
свойства :
class A
{
public:
// синтакстис не важен
property(get_x,set_x) int x; // если x 0 то возвратить нужно 1private:
// реализация скрытаvoid set_x(int newx)
{
if(newx)
x=newx;
}
int get_x(void)
{
return x?x:1;
}
};
// использование
A a;
a.x=10;
int x=a.x;
// преимущества
// конроль над изменением переменной
a.x=0; // a.x не будет измененint x=a.x; // если x был 0 то возвратит 1
// действие задается неявно
функции :
class A
{
private:
// закрытое полецint x; // если x 0 то возвратить нужно 1public:
void set_x(int newx)
{
if(newx)
x=newx;
}
int get_x(void)
{
return x?x:1;
}
};
// использование
A a;
a.set_x(10);
int x=a.get_x();
// преимущества
// конроль над изменением переменной
a.set_x(0); // a.x не будет измененint x=a.get_x(); // если x был 0 то возвратит 1
// действие задается явно
Если посмотреть различие между доступом через функцию и доступом через свойство то разница в том что в случае свойства не видны реальные действия, а с доступом через поле действия задаются явно.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, maq, Вы писали:
maq>>Здравствуйте, LaptevVV, Вы писали:
LVV>>>Прочитал я тут статью Дениса Майдыковского
. Статья хорошая. Только один вопрос меня интересует: а нафига свойства нужны? В чем их прелесть? В чем отличие от простых полей? Я на дельфях не писал.
maq>>Да в общем ни в чем. Это синтаксический сахар LVV>Вот и мне так показалось. Тем более, что средствами С++, как у Дениса написано, можно это все отлично реализовать.
Можно, но не отлично. Встроенная в язык реализация и синтаксически выразительнее, и не потребует ненужных накладных расходов.
LVV>Нефиг в транслятор засовывать.
Не могу согласиться. Очень не малое количество людей это бы оценило. Мне кажется, что лучше ориентироваться на потребности программистов, а не на ревнителей чистоты языка и прочих "экспертов".