Подтвердить что ты не робот

В чем разница между безгражданством и неизменным?

Я часто слышу термин "безгражданство" и "неизменяемый". Например, HTTP - это протокол без учета состояния, а объект String - неизменяемый объект. Но мне трудно понять разницу между ними. Когда я создаю объект без гражданства, он не сохраняет никаких "состояний" данных внутри. И если я создам объект Immutable, это означает, что его никогда не изменится.

Разве это не означает то же самое?

Поскольку неизменяемый объект не изменяется, по определению он не может иметь состояние. Это то, что навсегда. И если объект не имеет состояния, он не может быть мутирован (по определению). Таким образом, не все ли неизменный объект неизменен и неизменяемый объект без гражданства?

Что может быть примером изменчивого объекта без сохранения состояния или неизменяемого объекта с сохранением состояния?

4b9b3361

Ответ 1

Нет. Они не означают одно и то же.

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

Безстоящий означает, что нет состояния.

Ответ 2

Контекст важен, и здесь есть две несвязанные концепции.

"HTTP - это протокол без учета состояния" означает, что каждый запрос не имеет явного знания других запросов, включая любой предыдущий запрос, отправленный одним и тем же клиентом. Это отличается от протокола FTP или SMTP, где установлено соединение, а затем отправляются разные команды - каждая команда/запрос "ассоциируется" с одним и тем же клиентом/соединением. Конечно, состояние/отслеживание добавляется обратно. куки и отслеживание URI и даже конвейерная обработка, но дело в том, что каждый запрос является "новым" и "отдельным" в протоколе HTTP.

"String - неизменяемый объект" означает, что данные конкретного объекта всегда будут идентичны тем, какими они являются теперь в каждом наблюдаемом порядке (это также означает, что наблюдаемые атрибуты не могут быть изменены). Некоторые пуристы могут утверждать, что это имеет более глубокие последствия, чем это, но в практичности есть наблюдаемые атрибуты - проблема становится более сложной, когда неизменные объекты могут "содержать" изменяемые объекты.

(И да, по техническим причинам, объект без разрешенных данных - или состояния - не может быть обновлен и, следовательно, "неизменен". Однако, опять-таки, контекст важен, и странно говорить о Fangs on Elephant или туловище на тигре.)

Изменить: Разница между двумя

Объект, который не имеет состояния, не имеет состояния. Все объекты без гражданства неизменны (потому что нечего мутировать); это тавтологическая техника. Объект может иметь состояние и оставаться неизменным - однако объект с состоянием (неизменным или иным) больше не может считаться апатридом. По комментарий связанного ответа: "[неизменный объект] имеет ровно одно состояние", начальное состояние.

— from мой комментарий

Ответ 3

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

Когда люди говорят, что "без гражданства" означает, что у него нет состояния, это заставляет меня смеяться. Конечно, с некоторой точки зрения оно имеет некоторое состояние, например. Служба stateless может поддерживаться сложным графиком объектов (инъекция зависимостей). Дело в том, что сетевой протокол имеет несколько иное значение "состояния": это то, что зависит от предыдущего запроса/ответа. Но неизменяемая услуга также не зависит от предыдущих вызовов.

"Безстоящий" не всегда связан с HTTP-протоколом, тот же термин, который мы можем использовать для аргументации сеттеров в объектах службы в вашем блестящем коде OOP. И здесь вы можете видеть, что эти два термина на самом деле одинаковы: неизменяемый сервис - это служба без состояния и наоборот.

Однако мне неудобно вызывать объект значения "объект без гражданства". Звучит ужасно.

Recap: в случае сервисов (сеть или ООП, не имеет значения) Я бы сказал, что эти условия взаимозаменяемы.

Только пример:

interface Logger
{
    public function logWarning(string $message);
    public function logError(string $message);
}

Неважно, сколько раз мы вызывали logWarning или logError, и порядок вызовов тоже не имеет значения. Таким образом, мы можем назвать это "службой без гражданства".

Но эта служба также не имеет сеттеров и любых мутаторов, таких как changeFileName() → , это неизменяемый сервис/объект.

Mutability делает объект stateful. Stateful делает объект изменчивым. Эти условия взаимозависимы в контексте услуг.

Ответ 4

Они определенно не совпадают.

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

И без гражданства означает, что нет состояния. HTTP называется протоколом без сохранения, поскольку каждая команда выполняется независимо, без каких-либо знаний о командах, которые были перед ней. Он основан на парадигме запроса. В этом протоколе связь обычно выполняется по протоколу TCP/IP.