Используете ли вы Элементы данных или Общедоступные свойства внутри самого класса?
-
21-08-2019 - |
Вопрос
Если у меня есть простая настройка класса, подобная этой:
class MyClass
{
private string _myName = string.Empty;
public string MyName
{
get
{
return _myName;
}
}
public void DoSomething()
{
// Get the name...
string name = string.Empty;
name = _myName;
// OR
name = MyName;
// ...and do something with it...
}
}
Что мне следует использовать, общедоступное свойство или элемент данных?
Очевидно, что в данном примере это не имеет значения, поскольку они оба просто ссылаются на одну и ту же переменную.Но как насчет реального использования Общедоступных объектов?
В общем, выполняют ли общедоступные свойства очень мало, и в этом случае их можно вызывать?Или люди вкладывают много функциональности в свои общедоступные свойства, которые не должны вызываться внутренними ссылками на классы?
Я видел кое-что в другом посте о ТОМ, что НЕ нужно вкладывать много функциональности в Свойства, поскольку их изучение в отладчике может привести к неожиданным результатам.Это правда?
Решение
Используйте свойство - любая логика, которая может быть инкапсулирована в установщики и получатели, должна применяться даже внутри самого класса.Если в получателях и установщиках нет логики, все равно небезопасно использовать сами поля, потому что, если в какой-то момент вы захотите добавить логику вокруг доступа к этим полям, вам придется провести гораздо больший рефакторинг.
Другие советы
Я считаю, что вы должны ссылаться на собственность как на общую практику.Хотя в данном конкретном примере это действительно не имеет большого значения, средства доступа get / set предлагают возможность выполнить немного больше работы при захвате свойства.Например, многие из наших средств доступа к свойству "get" выполняют некоторый поиск в более сложной структуре данных или устанавливают значения по умолчанию, если ничего не было определено.Чтобы остальная часть класса могла воспользоваться преимуществами этой логики, у нас вошло в привычку использовать свойства.Просто чтобы нам не приходилось слишком много думать об этом, мы пытаемся обобщить практику.
Могут быть случаи, когда мы хотим напрямую получить доступ к базовому элементу данных, но тогда это сознательное решение с определенной причиной, и оно, как правило, является исключением.
Я предпочитаю свойства, потому что они легко обрабатывают ситуации, доступные только для чтения, и их легко обернуть любой базовой проверкой, которая вам может понадобиться.
Если я просто возвращаю значение внутренней переменной, я делаю переменную общедоступной - в этом нет никакого вреда.Я всегда использовал Общедоступные свойства, когда я хочу что-то сделать в ответ на просмотр или изменение значения - т. Е. Записать это в базу данных, установить что-то еще (как во второй части вашего примера).
Вопрос, который вы должны задать, заключается в том, хотите ли вы, чтобы то, что происходит внутри вашего класса, вызывало эти события.Если вы это сделаете, так же, как это сделал бы внешний вызывающий, затем получите доступ к значениям через свойство.Если вы просто хотите прочитать значение, используйте внутреннюю переменную.
Чтобы ответить на ваш вопрос, в любом случае нет ничего плохого в том, чтобы делать это - просто учитывайте потенциальные побочные эффекты.