Переменные-члены класса, методы и их состояние - PullRequest
0 голосов
/ 27 мая 2010

Как использовать переменные-члены класса в сочетании с методами класса?

Допустим, у меня есть класс 'C' с переменной-членом 'someData'.

  1. Я вызываю C.getData (), которая не возвращает значение, а вместо этого помещает данные в C.someData. Класс, который создает экземпляр C, сначала вызывает C.getData, а затем использует данные, получая доступ к переменной-члену C.someData.

  2. Я вызываю C.getData () в классе, который создает экземпляр C, который является функцией, возвращающей данные.

Я сам предпочитаю второй способ. Но это также зависит от ситуации, и это небольшая разница. «Плохо» иметь методы класса, которые зависят от внутреннего состояния классов? Каковы лучшие соглашения?

Ответы [ 2 ]

3 голосов
/ 27 мая 2010

У каждого есть мнение по этому поводу, но то, что я видел эмпирически, это то, что государство является злом. State вынуждает вас принимать во внимание больше информации при понимании того, как ведет себя класс, поскольку его поведение теперь неявно зависит от состояния. Избегайте этого настолько, насколько позволяет ваша производительность. Я решительно поддерживаю второй способ, который вы упоминаете. Первый способ, скорее всего, вызовет ошибки и головные боли.

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

Насколько очевиден первый путь для кого-то еще? Имеет ли смысл иметь что-то под названием getData, которое на самом деле не возвращает никаких данных? Имеет ли смысл, что getData манипулирует состоянием объекта? Иногда да, манипулирование объектом ради кеширования является разумным. Но манипулирование объектом для хранения значения, которое вы должны фактически возвращать, вызывает проблемы.

Если вы действительно чувствуете, что должны пойти с первой версией, по крайней мере, назовите ее более точной, например void calculateValue() или даже void calculateCachedValue(), что означает, что она действительно не должна ничего возвращать и что вся ее цель состоит в том, чтобы посчитайте что-нибудь еще.

1 голос
/ 27 мая 2010

C.someData должна быть собственностью только для публичного получения. Вы можете лениво загрузить значение в someData при первом вызове C.someData.

public class C
{
    public C() { }

    string someData = string.Empty;
    public string SomeData
    {
        get
        {
            if (string.IsNullOrEmpty(someData))
                this.LoadSomeData();
            return someData;
        }
    }

    private void LoadSomeData()
    {
        this.someData = "Hello world";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...