c # vb: когда говорят, что статические классы не должны иметь состояния - PullRequest
0 голосов
/ 24 апреля 2011

когда говорят, что у статических классов не должно быть состояний / побочных эффектов, это означает:

    static void F(Human h)
    {
        h.Name = "asd";
    }

нарушает его?

Редактировать:

У меня есть личноепеременная теперь называется p , которая является целым числом.Он никогда не читается во всей программе, поэтому он не может повлиять на поток программы.

это нарушение "без побочных эффектов"?:

int p;
static void F(Human h)
    {
        p=123;
        h.Name = "asd";
    }

ввод и выводвсе равно всегда в этом случае ..

Ответы [ 3 ]

2 голосов
/ 24 апреля 2011

Когда вы говорите «они», на кого вы ссылаетесь?

В любом случае, двигайтесь дальше.Такой метод, как то, что вы представили, вполне подойдет - если вы этого хотите, то ОК.Не беспокойтесь.

Аналогично, для статического класса вполне допустимо иметь статическое состояние.Опять же, может случиться так, что вам это понадобится в какой-то момент.

Реальная вещь, на которую стоит обратить внимание, это что-то вроде

static class A
{
    private static int x = InitX();

    static A()
    {
        Console.WriteLine("A()");
    }

    private static int InitX()
    {
        Console.out.WriteLine("InitX()");
        return 0;
    }
    ...
}

Если вы используете что-то подобное, то вы могли былегко запутаться, когда вызывается статический конструктор и когда вызывается InitX().Если бы у вас были некоторые побочные эффекты / изменения состояния, которые происходят, как в этом примере, то это было бы плохой практикой.

Но что касается вашего фактического вопроса, такого рода изменения состояния и побочные эффекты в порядке.

Редактировать

Если вы посмотрите на ваш второй пример и точно примете правило, как оно указано, то да, вы его нарушаете.

Но ...

Не позволяйте этому правилу обязательно остановить вас от подобных вещей.В некоторых случаях это может быть очень полезно, например, когда метод выполняет интенсивные вычисления, запоминание является простым способом снижения затрат на производительность.Хотя запоминание технически имеет состояние и побочные эффекты, выходные данные всегда одинаковы для каждого ввода, что действительно важно.

1 голос
/ 24 апреля 2011

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

Шаблон, которого следует избегать, имеет статический класс, в котором методы имеют побочные эффекты, которые не ограничиваются переданными объектами или объектами, на которые они ссылаются. Предположим, например, что у кого-то был класс построения вышивки, который имел функции для выбора модуля вышивания, а также для масштабирования, перевода или поворота будущих графических операций. Если несколько подпрограмм ожидают выполнения какого-либо рисования, может быть трудно предотвратить выбор устройств или преобразований, выполняемых одной подпрограммой, повлиять на другие подпрограммы. Есть два распространенных способа решения этой проблемы:

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

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

1 голос
/ 24 апреля 2011

Побочные эффекты элемента static означают, что он изменяет значение некоторых других элементов в своем контейнере class.Участник static в вашем случае не влияет на других членов его class и не нарушает предложение, которое вы упомянули.* Во втором примере, который вы добавили, отредактировав свой вопрос, вы его нарушаете.

...