Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Properties, полезны ли они? 
:(
    Опции темы
arilou
Дата 21.6.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Domestic @ 20.6.2005, 21:15)
Не понимаю. Свойство - это то же что и метод, реализация свойства в IL - это методы get_XXX, set_XXX.
И в ООП ничего, кроме отсылки сообщений нет.

Подожди, в данном случае не важно, как это реализовано в IL. Ты понимаешь любую операцию над классом как отсылку сообщения. ОК. Обращение к свойству - та же самая посылка сообщения. Но самое главное тут, что в свойстве объединяются методы и поля. Корпускулярно-волновую теорию света помнишь? smile То же самое и тут. Свойство несет двойной смысл - как поля, так и метода. И я не вижу тут никакого противоречия. Конечно, никто не запрещает тебе не испольщовать свойств вообще. Просто, если ты пишешь .NET код, то тебе нужно поддерживать культуру, которая сложилась в команде разработчиков. Если же вся команда на Java писала, а теперь на C#, то тогда, конечно, я могу всё понять smile

Цитата(Domestic @ 20.6.2005, 20:05)
1. Не всегда однозначно можно отнести метод к той или иной группе. Например, GetHashCode(). Он реализован как метод, но ведь он также может быть рассмотрен и как свойство объекта.

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

Цитата(Domestic @ 20.6.2005, 20:05)

2. Несмотря на то, что авторы FCL, видимо, следовали описанным выше принципам, никто не мешает им НЕ следовать. Возьмем проперти Environment.CurrentDirectory. Посмотрите, что оно делает - меняет текущую рабочую директорию. Почему это не метод? Тот же Resize - почему он не проперти Size?

2. Разве текущая директория - это не характеристика? Сколько не пляши, возвращаемое значение будет одинаковым, пока ее не изменишь smile

Цитата(Domestic @ 20.6.2005, 20:05)

3. Каков выигрыш от подобного разделения на свойства и методы? Что конкретно выиграно? Усложнены язык и документация, можно писать левый код, используя проперти там, где нужен метод, и наоборот. А выигрыша то нет, поиск по докам забирает (для меня по крайней мере) больше времени.

3. Да, без четкого понимания можно писать дебильный код, когла свойства используются не по назначению. Тоже самое и на C++ - можно не использовать указатели, там где это нужно, а испольщовать, например, индексы. Тоже получится дебильный код. Наверняка и на Java можно, не имея достаточных знаний, писать абы что.

Выиграно то, что видно, какие у объекта характеристики, и какие операции он поддерживает. Твой пример о Resize и Size. Могу предположить следующее:
1) Класс писался не одним человеком. В итоге получили два способа
2) В MS любят уважить сразу бОльшее кол-во программеров. В итоге есть несколько путей сделать ту или иную штуку - посмотри только в WinAPI.

Еще, твоя позиция о сообщениях почему-то напоминает мне о войне между процедурным программированием и ООП, когда приверженцы первого говорили "зачем мне классы, если я могу обойтись без них". ИМХО, не надо так фанатично отстаивать "чистое" ООП. Если бы все стояло на месте, писали бы программы до сих пор на перфокартах. А так, единожды поппробовав использовать свойства, ты бы потом не понял, как вообще можно без них обходиться.

Кстати, в .NET 2.0 появилась возможность задавать getter'ы и setter'ы с разной степенью доступности (private, protected, internal). Это то, чего 100% не хватало в 1.1, и за что многие ругали MS, и говорили - "если свойства - это те же методы, то почему нельзя задать им разную доступность?.




--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Domestic Cat
Дата 21.6.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(arilou @ 21.6.2005, 01:13)
1. Свойство следует применять в тех случаях, когда последовательное обращение к нему без каких-либо других изменений в членах класса всегда будет возвращать один и тот же результат. GetHashCode() - это метод, потому что его реализация может быть построена таким образом, что возвращаемые знаяения будут разными в зависимости от неопределенных факторов.


Хм.. Это официальное определение? smile Против него можно найти сколько угодно примеров в .НЕТ : например проперти Size. Если юзер изменил размеры формы - размер изменился, хотя явно я его не менял, вообще ничего не делал.

Цитата(arilou @ 21.6.2005, 01:13)
2. Разве текущая директория - это не характеристика? Сколько не пляши, возвращаемое значение будет одинаковым, пока ее не изменишь smile

Однако, это важная характеристика, не так ли? smile Почему например, не реализовать свойство FileInfo.Exists с set {} : file.Exists = false? Вот какой простой пример удаления файла smile
Где граница между свойством и методом?




--------------------

PM   Вверх
mr.DUDA
Дата 21.6.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Domestic @ 21.6.2005, 10:12)
"возвращаемому свойством значению" - звучит очень похоже на "возвращаемому методом значению"  То есть по-твоему свойство - это скорее метод ?

Да.
Отличие свойства от поля - то, что у свойства есть поведение. Поэтому св-во это суть метод (один или два метода), представляющий обёртку над полем. У св-ва, как и у метода, есть возвращаемое значение (у get) и аргумент (у set).

Цитата(Domestic @ 21.6.2005, 10:12)
Мы же не о них говорим, правильно? Да и что это доказывает?

Это пример предметной области, в которой широко используются свойства, полностью аналогичные св-вам C#.


Добавлено @ 10:28
Цитата(Domestic @ 21.6.2005, 10:22)
Где граница между свойством и методом?

Свойство - это скорее "умное поле", чем "действие". По поводу того, как и когда применять свойства, каждый решает сам. Не думаю, что кто-то, будучи в здравом уме, решит написать "File.Exists = false" для удаления файла. Это то же самое что сказать "файл не существует ! трах-тибидох ! исчезни !" вместо "давай удалим-ка этот файл".


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 21.6.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Domestic @ 21.6.2005, 10:22)
Хм.. Это официальное определение

Да. Я читал это в MSDN Technical Articles.
Цитата(Domestic @ 21.6.2005, 10:22)
например проперти Size. Если юзер изменил размеры формы - размер изменился, хотя явно я его не менял, вообще ничего не делал.

С одной стороны ты прав. Но с другой стороны, возможно, такое свойство нужно было сделать readonly, тогда бы и не возникало противоречия.
Цитата(Domestic @ 21.6.2005, 10:22)
file.Exists = false?

Не, ну не надо такого цинизма! smile Покажи мне человека в здравом уме, который такое напишет.
Добавлено @ 10:40
Цитата(Domestic @ 21.6.2005, 10:22)
Где граница между свойством и методом?

Истина посередине. Фотон - это и частица, и волна. Свойство - это и поле, и метод.
Добавлено @ 10:44
Цитата(Domestic @ 21.6.2005, 10:22)
file.Exists = false

Это мне напонимает такое (за синтаксис я не ручаюсь, но меня поймут)

Код

#define MACRO(x) printf("%d^2=%d", x, x*x)

// .....

MACRO(++d);
printf("%d", d);


Если не знаешь, что произойдет в таком случае, будешь голову ломать, почему моя прога не работает. Тоже и со свойством.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Domestic Cat
Дата 21.6.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(mr @ 21.6.2005, 01:24)
Свойство - это скорее "умное поле", чем "действие". По поводу того, как и когда применять свойства, каждый решает сам. Не думаю, что кто-то, будучи в здравом уме, решит написать "File.Exists = false" для удаления файла. Это то же самое что сказать "файл не существует ! трах-тибидох ! исчезни !" вместо "давай удалим-ка этот файл".


Да, но следуя определению из
Цитата(arilou @ 21.6.2005, 01:39)
MSDN Technical Articles.


ничто не препятствует созданию такого свойства smile


--------------------

PM   Вверх
arilou
Дата 21.6.2005, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Domestic @ 21.6.2005, 10:45)
ничто не препятствует созданию такого свойства

Котъ, у меня такое ощущение, что ты не хочешь ничего понять.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Domestic Cat
Дата 21.6.2005, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(arilou @ 21.6.2005, 01:48)

Котъ, у меня такое ощущение, что ты не хочешь ничего понять.

У меня такое же, только наоборот. Но я сейчас почти сплю. smile Потому отвечу часов через восемь. smile


--------------------

PM   Вверх
AntonSaburov
Дата 21.6.2005, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Цитата(arilou @ 20.6.2005, 21:03)
Ну ты же сам принимаешь решение о том, чтобы сделать свойство или метод, так? Т.е. ты чувствуешь, когда нужно одно, а когда другое?

Это когда я пишу сам. А когда я пользуюсь какой-то библиотекой ?

Понятно, что если соблюдать правила и писать высоко профессионально, то проперти будут работать и облегчать жизнь. Но IMHO не настолько они ее облегчают, насколько усложняют синтаксис и дают еще одну лазейку запутаться. И если уж писать высокопрофессионально, то красиво можно писать на любом языке.

Т.е. IMHO - ввод пропертей не дает большого выигрыша для профессионалов, а для начинающих это лишний повод поиграть. Что сами понимаете ничего хорошего не дает.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 21.6.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Давайте определимся, говорим мы о применении свойств программистами разного уровня, или об использовании свойств как конструкции языка. Это же разные вещи.

Насчёт
Цитата(AntonSaburov @ 21.6.2005, 11:18)
Это когда я пишу сам. А когда я пользуюсь какой-то библиотекой ?

Волков бояться - в лес не ходить. Нормальные библиотеки (какие использует более 1-го девелопера) пишуть нормальные программеры, отличающие проперти от метода.

Цитата(AntonSaburov @ 21.6.2005, 11:18)
Но IMHO не настолько они ее облегчают, насколько усложняют синтаксис и дают еще одну лазейку запутаться. И если уж писать высокопрофессионально, то красиво можно писать на любом языке.

Согласен со второй частью. Первая же - это имхо, т.к. никакого усложнения лично я не вижу.


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 21.6.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Народ, почитайте Буча. Я хотел сначала цитату привести, потом понял, что надо всю книгу сюда копировать smile Он очень много про свойства говорит.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Domestic Cat
Дата 21.6.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Попытаюсь еще раз smile

1. Де юре и де факто свойства - это методы гет/сет, для которых изменен синтаксис. Все! Они и реализованы по сути как методы.
2. Если так, то в чем их преимущество? Вариант А: меньше набирать. Личное мое мнение в том, что основная причина, по которой их называют "удобными" и т п состоит в том, что при ручном наборе присвоить значение свойству быстрее на несколько символов. Создать свойство быстрее на 10-15 символов.
3. Но реально это чепуха - длай быстрого "наборщика" это секунда. При использовании средств RAD это вообще не играет никакогй роли.
4. Вариант Б: свойство свидетельствует о чем то. О чем? Что изменение свойства не приведет к каким-то кардинальным изменениям? Что свойство - это "свойство объекта х"?
5. -------------------------------------------
6. Больше ничего за свойствами нет.
7. В связи с п 4. Возникают вопросы: 1. Каков четкий критерий использования свойств? 2. Методы позволяют сделать то же самое. setSpeed не менее выразителен, чем Speed = .... Если так, то зачем нужны свойства?
8. Получается, чт п.4 отпадает. Но против п.2 вот что:
9. Введена еще идна сущность в язык.
10. => Усложнена документация
11. => Усложнен язык
12. => Синтаксис использования свойства совпадает с синтаксисом доступа к паблик полю, что НЕ приветствуется в ООП (паблик поля). Например, новичок может сделать все поля какого-либо класса публичными ("для простоты"), а я буду думать что все ок и это свойства.
13. => Усложнен процесс дизайна, нужно выбирать между методом и свойством, тогда как никаких действующих на 100% правил я не нашел. Более того, редко в какой книге затронут этот вопрос.
14. => Плохой дизайн + различное понимание смысла свойств могут приводить к еще большей путанице. Пример с Exists очевиден, но что если речь идет о написании сотен классов? Хочешь не хочешь, а "странные" свойства будут созданы. Тогда как с методами такой проблемы не возникает.






--------------------

PM   Вверх
Дрон
Дата 21.6.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 92



Цитата(Domestic @ 21.6.2005, 19:12)
10. => Усложнена документация
12. => Синтаксис использования свойства совпадает с синтаксисом доступа к паблик полю, что НЕ приветствуется в ООП (паблик поля).

10 - мне удобнее читать документацию, когда методы и свойства разделены.
12 - но это же не паблик поле smile

Добавлено @ 18:21
Цитата(Domestic @ 21.6.2005, 19:12)
13. => Усложнен процесс дизайна, нужно выбирать между методом и свойством, тогда как никаких действующих на 100% правил я не нашел. Более того, редко в какой книге затронут этот вопрос.

С одной стороны ты прав. Но с другой точно так же можно сказать и про методы: в чём разница между использованием методов getSize() и Size(). По какому принципу к названию метода приписывается get? И вдруг какой-нибудь индус вообще не знает такой записи, и пишет не get, а pleaseGiveMeValueOf. Попробуй пойми, что он хотел сказать. Проперти же стандартизированы smile

Это сообщение отредактировал(а) Дрон - 21.6.2005, 18:17


--------------------
Да. Именно так.
PM   Вверх
arilou
Дата 21.6.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Domestic @ 21.6.2005, 18:12)
Попытаюсь еще раз

Лучше бы ты прочитал все те посты, которые были написаны, и над ними подумал, чем еще раз писать одно и то же. Тут было много написано, и ни на один аргумент ты ничего не ответил. Я считаю, что это пренебрежение к оппонентам.

Цитата
И вдруг какой-нибудь индус вообще не знает такой записи, и пишет не get, а pleaseGiveMeValueOf. Попробуй пойми, что он хотел сказать. Проперти же стандартизированы

Как говорят англикосы, I second that, что значит примерно "я подписываюсь под этим тоже"


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 21.6.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Domestic Cat, да на здоровье. Методы, так методы. Помнится, ты аналогичным образом критиковал делегаты, приводя контрпример в виде методов-листенеров. Такое впечатление, что кроме методов больше в ООП ничего не юзается (шаг влево, шаг вправо - расстрел).

P.S. а книгу мистера G. Booch всё же почитать бы стоило.


--------------------
user posted image
PM MAIL WWW   Вверх
Domestic Cat
Дата 21.6.2005, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата
По какому принципу к названию метода приписывается get? И вдруг какой-нибудь индус вообще не знает такой записи, и пишет не get, а pleaseGiveMeValueOf. Попробуй пойми, что он хотел сказать. Проперти же стандартизированы smile


Согласен, метод можно назвать как угодно, но я ведь говорю о том, что преимущества в этом плане у свойств нет. свойство тоже можно назветь как угодно или сделать методом.

Цитата
12 - но это же не паблик поле smile

Из записи a.B = 33 это определить невозможно.

Цитата(arilou @ 21.6.2005, 09:27)
Лучше бы ты прочитал все те посты, которые были написаны, и над ними подумал, чем еще раз писать одно и то же. Тут было много написано, и ни на один аргумент ты ничего не ответил. Я считаю, что это пренебрежение к оппонентам.

Ну я перечитал тему еще раз. Кроме Дрона, никто не попытался четко и ясно ответить на подняты мнои вопросы.

Цитата(mr @ 21.6.2005, 09:29)
Domestic Cat, да на здоровье. Методы, так методы. Помнится, ты аналогичным образом критиковал делегаты, приводя контрпример в виде методов-листенеров. Такое впечатление, что кроме методов больше в ООП ничего не юзается (шаг влево, шаг вправо - расстрел).

Если ты помнишь, вопрос про делегаты был поднят именно на этом форуме, и не мной. Да, я их критиковал, но могу дать ссылки на мои посты, где я утверждаю, что данное решение ничуть не хуже листенеров.

Цитата(mr @ 21.6.2005, 09:29)
P.S. а книгу мистера G. Booch всё же почитать бы стоило.

Товарищи, здесь не соревнование "кто кого перецитирует". Мы собираемся на форуме не только для того, чтобы ответить на вопросы "а почему я не могу запустить программу". Гораздо интереснее приходить сюда и общаться на несколько более глубокие темы. Если хотите - объясните ваши аргументы, а Гради Буча я и сам могу почитать. Не хотите - можем закрыть тему.


--------------------

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1118 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.