Не подразумевает ли статика никакого состояния - PullRequest
7 голосов
/ 27 октября 2009

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

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

Мои вопросы: «подразумевает ли метод, помеченный как статический, что он не требует состояния и что в большинстве случаев методы без состояния должны быть статическими».

Ответы [ 13 ]

7 голосов
/ 27 октября 2009

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

5 голосов
/ 27 октября 2009

подразумевает метод, помеченный как статический что оно не требует состояния

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

в большинстве случаев следует без гражданства методы должны быть сделаны статичными

2) Да. Методы, которые не требуют состояния, поэтому не требуют экземпляр , обычно должны быть статическими.

3 голосов
/ 27 октября 2009

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

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

Службы без сохранения состояния могут (и были) реализованы на языках, которые поддерживают только статические переменные (например, COBOL, RPG), и языках, которые даже не допускают статические переменные (Erlang и т. Д.).

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

Он также серьезно неправильно понимает, что такое "статический" - статическая переменная - это способ хранения состояния между вызовами - и, следовательно, может показаться более подходящим для службы "с состоянием".

3 голосов
/ 27 октября 2009

Мне довольно страшно говорить, что без состояний - это то же самое, что static , поскольку это два разных мира. Отсутствие состояния означает, что состояние не сохраняется, т.е. идеальным примером является HTTP-соединение (после отправки данных соединение закрывается и память не сохраняется), где мы на самом деле пытаемся сделать все возможное, чтобы поддерживать состояние независимо государство для одного).

С другой стороны, статический - это термин, используемый для описания способа вызова метода. В C # это означает, что метод может быть вызван без экземпляра класса, но экземпляр класса не совпадает с состоянием. Все еще есть статический экземпляр, и он вполне способен поддерживать состояние: любая статическая переменная-член, поле или свойство могут поддерживать состояние. Статический метод или класс также вполне способен поддерживать состояние, используя отображенные в памяти файлы, базу данных или что-то еще. Static - это соглашение о вызовах, не более того, оно не связано с отсутствием состояния или без него.

3 голосов
/ 27 октября 2009

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

Действительно не сохраняющий состояния метод действительно может быть сделан статическим, и, как правило, должен.

2 голосов
/ 27 октября 2009

static - ключевое слово языка, а state - концепция проекта. Между этими двумя вещами существует очевидная связь, но это отношение конкретного к метафизическому, а не причинно-следственная связь. Статические методы могут ссылаться на некоторые виды информации о состоянии.

Что касается методов без сохранения состояния, здесь мы говорим о методе, который не ссылается на экземпляр класса, то есть указатель this. Обозначение этих методов как статических улучшает ясность кода и согласуется с лучшими практиками. Обратите внимание, что в этом случае мы говорим об особом «безгражданстве» и не делаем общих комментариев по поводу использования контекстов с контролем состояния.

1 голос
/ 27 октября 2009

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

Статический класс без каких-либо переменных уровня класса не имеет состояния. Он не содержит данных.

1 голос
/ 27 октября 2009

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

Тем не менее, реальный ответ "нет". В реальной жизни (например, веб-сервисы по HTTP или взаимодействие с любым видом Orb) сервисы никогда не выставляют свои сервисные методы с использованием реальных статических методов. Обычно вы вызываете статические методы для получения экземпляра службы (или экземпляра фабрики служб, из которой вы получаете экземпляр!), А затем работаете с этим. Это связано с тем, что ваш прокси-сервер службы должен отслеживать, где он находится. Так что, хотя ваши методы кажутся вам не имеющими состояния, на самом деле это не так.

Надеюсь, это не слишком смущает :)

1 голос
/ 27 октября 2009

Краткий ответ на ваш вопрос «нет», static не означает «нет состояния».

Что касается других ваших комментариев, static может использоваться, чтобы помочь вам реализовать службу без сохранения состояния, но одного static недостаточно. Другой инструмент / метод, помогающий сделать что-то без учета состояния, - это использование неизменяемых структур данных. Это (в настоящее время) не является сильной стороной C #, особенно по сравнению с F #.

1 голос
/ 27 октября 2009

Каждый класс имеет структуру определения класса, в которой статические поля представлены и сохранены. Каждый «экземпляр» класса имеет доступ к статическим полям, хранящимся в определении класса (структура данных caleld CORINFO_CLASS_STRUCT). Даже если экземпляры НЕТ не созданы, код в любом месте вашей сборки может получить доступ к этим статическим полям уровня класса, используя синтаксис classname.StaticFieldName, без какого-либо экземпляра вообще.

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

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

Для получения дополнительной информации проверьте CORINFO_CLASS_STRUCT ссылку на великую книгу Дона Бокса, Essential .Net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...