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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свойства и поля класса, Как правильно работать? 
V
    Опции темы
emmanuil
Дата 24.4.2007, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Всем привет!
есть вот такой код:
Код

        private String dirPath;
        public String DirPath
        {
            get { return dirPath; }
            set { dirPath = value; }
        }

внутри класса я почти некогда не обращаюсь к свойству, а обращаюсь напрямую к полю, чтобы не запускать механизм доступа к полям класса. Обращаюсь к свойству, только если в методах get/set производятся какие-то необходимые действия. Правильно ли я делаю?
PM MAIL   Вверх
ivashkanet
Дата 24.4.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(emmanuil @  24.4.2007,  06:57 Найти цитируемый пост)
Правильно ли я делаю? 

А оно не важно smile 
Умный компилятор все равно преобразует обращение к свойству такого типа на обращение к полю.

P.S. Хотя я точно так же делаю
PM MAIL WWW ICQ   Вверх
scorzh
Дата 25.4.2007, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.4.2007
Где: Новосибирск, Росс ия

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



emmanuil, по-моему абсолютно правильно.. ) 
как еще внутри класса с полем работать? может тебе не нужно выполнять внутри класса те действия, которые выполняются при вызове свойства (ну допустим если бы у тебя они выполнялись 8)).
PM MAIL ICQ   Вверх
adLucem
Дата 27.4.2007, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Правильно, если пишете программу для себя и модифицировать ее вам врядли придется (имхо, в таком случае вы пишете бесполезную программу), в любом противном случае неправильно.

Простое добавление проверки правильности изменения атрибута класса повлечет перенаправление всех внутренних вызовов на свойство (например если в вашем случае необходимо будет добавить проверку при установке ссылки на строку на то, что она не может быть нулевой ссылкой). Кроме того при анализе кода необходимо анализировать все точки обращения к атрибуту напрямую.

Если есть свойство, которое инкапсулирует атрибут, то доступ должен осуществляться только через свойство. А то приходится слишком много думать по поводу. Утверждение 
Цитата(emmanuil @  24.4.2007,  05:57 Найти цитируемый пост)
внутри класса я почти некогда не обращаюсь к свойству, а обращаюсь напрямую к полю, чтобы не запускать механизм доступа к полям класса

является преждевременной (в большинстве случаев бесполезной) оптимизацией.
PM MAIL ICQ   Вверх
_Dream
Дата 27.4.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

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



да ну.. для того это и делается чтоб не были доступны извне класса эти поля(private) а доступ кним был только через акксессоры(они public) обращаться к видимому в классе обьекту через свойство ненужно..
+ на сет иногда ставится некоторая функциональность.. что на это при простом изменение значения тоже завязываться надо? smile 

Это сообщение отредактировал(а) _Dream - 27.4.2007, 11:56
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
adLucem
Дата 27.4.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Если не set метод ставиться некоторая функциональность, то это означает, что все данные, которые сохраняются во внутреннем поле, для которого создан этот set, должны быть некоторым образом обработаны (например, должны соответствовать некоторому формату). Полагать, что в процессе написания класса все данные, которые вы устанавливаете прямо в атрибут, посредством наличия доступа к private, соответствуют правилам, формализованным в set по меньшей мере безосновательно.

При наличии метода доступа (будь то get или set) в любом случае нужно использовать именно его. Иначе это ведет к ситуации, когда появление новых условий ведет к необходимости анализировать все внутренние обращения к атрибуту.
Код

public string FooString {
    get {
        return FooString_;
    }
    set {
        if ( ReferenceEquals ( value, null ) ) {
            throw new ArgumentNullException ( "FooString", "Reference could not be null." );
        }
        FooString_ = value;
    }
}
private string FooString_;

Если у меня появляется новое ограничение логики, например, что длина строки должна быть больше нуля, то я только изменяю set метод:
Код

public string FooString {
    get {
        return FooString_;
    }
    set {
        if ( ReferenceEquals ( value, null ) ) {
            throw new ArgumentNullException ( "FooString", "Reference could not be null." );
        }
        if ( value.Length == 0 ) {
            throw new ArgumentException ( "String length should be greater than zero.", "FooString" );
        }
        FooString_ = value;
    }
}
private string FooString_;

В случае, если я использую внутри класса прямые обращения к атрибуту строки, то мне придется просматривать весь код класса, на наличие ошибочной логики.
Код

public class FooClass {
    public FooClass {
        FooString = string.Empty; //верно
        FooString_ = string.Empty; //неверно
    }
}


В первом случае я обнаружу ошибку сразу в процессе тестирования, а во втором она может проявиться значительно позже.

Кстати зачастую в классах используются приватные методы доступа (в частности, set), которые обеспечивают доступ к полям внутри самого класса, централизируя управление доступом.

Это сообщение отредактировал(а) adLucem - 27.4.2007, 13:35
PM MAIL ICQ   Вверх
_Dream
Дата 27.4.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

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



то есть вы предлагаете на все поля классов заводить аксессоры и работать через них??
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
adLucem
Дата 27.4.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Я утверждаю, что если имеется функция доступа к атрибуту, то доступ нужно осуществлять только через нее.

Использование внутренних функций доступа обуславливается следующими причинами:
1. Несмотря на то, что атрибут модифицируется только внутри класса, модификация требует некоторых дополнительных действий.
2. Был произведен рефакторинг с инкапсуляцией доступа к атрибуту.
PM MAIL ICQ   Вверх
_Dream
Дата 27.4.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

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



Цитата

модификация требует некоторых дополнительных действий.

Код

private String dirPath;
        public String DirPath
        {
            get { return dirPath; }
            set { dirPath = value; }
        }


 я может не так вас понял но где вы видите здесь дополнительные действия...
с другой стороны... где гарантия что они там не появятся завтра? потому  я и спрашиваю.. тогда получается что всегда доступ надо получать через аксессоры
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
adLucem
Дата 27.4.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Доступ к атрибутам, осуществляется через функции доступа всегда, когда такие функции имеются в наличии.
Код

public class FooClass {
    public FooClass ( int fooInt, string fooString ) {
        FooInt = fooInt; //верно
        FooString = fooString; //верно, но может быть излишне в простых классах.
        FooString_ = fooString; //неверно, но может допускать в простых классах, в которых не определена внутренняя функция доступа.
        FooInt_ = fooint; //неверно
    }
    public int FooInt {
        get {
            return FooInt_;
        }
        set {
            FooInt_ = value;
        }
    }
    public string FooString {
        get {
            return FooString_;
        }
        // внутренняя функци доступа.
        private set {
            FooString_ = value;
        }
    }
    private int FooInt_;
    private string FooString_;
}

PM MAIL ICQ   Вверх
_Dream
Дата 27.4.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

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



короче если есть функционал на сет то через поля а нет так и не надо..
я так делаю smile
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
ivashkanet
Дата 27.4.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(_Dream @  27.4.2007,  13:39 Найти цитируемый пост)
короче если есть функционал на сет то через поля а нет так и не надо..

Тут, вопрос не в том, есть ли этот функционал, а в том, что если он появится, то ты получишь гемора на одно место.
Правда, если ты про это вспомнишь в момент изменения сетера, то ничего страшного, а вот если нет?

В общем, adLucem, зачет. Пересмотрел свою позицию  smile 
PM MAIL WWW ICQ   Вверх
Void
Дата 27.4.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



adLucem, лови заслуженный плюс.

Аксессоры накладывают на значение свойства определённый контракт, соблюдение которого ставиться под угрозу прямым доступом к полю.

Хороший пример — механизм dependency properties в WPF: прямого доступа к данным нет, отдельно валидация, отдельно уведомления об изменении значения.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
emmanuil
Дата 2.5.2007, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



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

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


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

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


 




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


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

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