LINUX.ORG.RU

История изменений

Исправление eao197, (текущая версия) :

Не достаточно. Другой программист добавит обработчик сообщения, который его изменяет, всё успешно скомпилируется и уйдёт в production с скрытым неприятным багом.

Не добавит, если все обработчики сообщений *всегда* получают константные ссылки на сообщения. Что элементарно гарантируется на уровне фреймворка.

Так же на уровне фремворка можно гарантировать, что оправитель больше не будет владеть объектом сообщения. Например, если отсылка сообщения делается методом вроде:

template<class MSG>
void send(std::unique_ptr<MSG> msg);

Именно это immutable и гарантирует. После того как immutable данные созданы, они не могу быть изменены никем и никогда. В том числе создателем.

Во-первых, разве я где-то утверждал обратное? Во-вторых, почему я не могу сделать так:

class Logger { /* thread-safe но с немутабельными методами. */ };

class CurrentConfig {
  ...
  public Logger logger() { return logger_; }
  ...
  private Logger logger_ = ...;
}

immutable CurrentConfig cfg = new CurrentConfig( new Logger() );
?

Т.е. никто не может менять объект cfg. Все могут к нему обращаться. И все могут работать с Logger-ом, который доступен через cfg.

Где здесь источник потенциальных багов?

Исходная версия eao197, :

Не достаточно. Другой программист добавит обработчик сообщения, который его изменяет, всё успешно скомпилируется и уйдёт в production с скрытым неприятным багом.

Не добавит, если все обработчики сообщений *всегда* получают константные ссылки на сообщения. Что элементарно гарантируется на уровне фреймворка.

Так же на уровне фремворка можно гарантировать, что оправитель больше не будет владеть объектом сообщения. Например, если отсылка сообщения делается методом вроде:

template<class MSG>
void send(std::unique_ptr<MSG> msg);

Именно это immutable и гарантирует. После того как immutable данные созданы, они не могу быть изменены никем и никогда. В том числе создателем.

Во-первых, разве я где-то утверждал обратное? Во-вторых, почему я не могу сделать так:

class Logger { /* thread-safe но с немутабельными методами. */ };

class CurrentConfig {
  ...
  public Logger logger() { return logger_; }
  ...
  private Logger logger_ = ...;
}

immutable CurrentConfig cfg = new CurrentConfig( new Logger() );
?

Т.е. никто не может менять объект cfg. Все могут к нему обращаться. И все могут работать с Logger-ом, который доступен через cfg?

Где здесь источник потенциальных багов?