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

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

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

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

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

4 ответа

Решение

Нет, они не имеют в виду одно и то же.

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

Без гражданства означает, что нет государства.

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

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

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

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

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

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

- из моего комментария

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

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

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

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

Напомним: в случае услуг (сетевых или ООП, не имеет значения) я бы сказал, что эти термины являются взаимозаменяемыми.

Просто пример:

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

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

Но у этого сервиса тоже нет сеттеров и каких-либо мутаторов вроде changeFileName() -> это неизменный сервис / объект.

Изменчивость делает объект состоящим из состояния. Stateful делает объект изменчивым. Эти термины взаимозависимы в контексте услуг.

Они определенно не одинаковы.

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

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

Другие вопросы по тегам