Как создать свойства для однократной записи? - PullRequest
3 голосов
/ 21 декабря 2010

Я застрял с общей проблемой ООП и не могу найти правильный способ сформулировать мой вопрос.

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

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

Вот некоторые идеи, которые я рассмотрел до сих пор:

  1. Передать любую запись-информацию в конструкторе. Конструктор выдает исключение, если данные уже присутствуют.
  2. Создание нескольких классов в дереве наследования, где каждый класс представляет сущность на некоторой стадии ее жизненного цикла, с соответствующими установщиками, где это необходимо. Добавьте коллективный интерфейс для всех операций чтения.
  3. Молча отбрасывает любые неуместные записи.

Мои мысли по этому поводу: 1. Делает конструктор крайне нестабильным, как правило, плохой идеей. 2. Взрыв сложности и не решает проблему полностью (вы можете вызывать сеттер два раза подряд, в пределах одного запроса) 3. Легко, но та же проблема, что и с исключениями; все это большой обман по отношению к вашим клиентам.

(Только к вашему сведению: сейчас я работаю в PHP5 - хотя я подозреваю, что это общая проблема)

1 Ответ

1 голос
/ 21 декабря 2010

Интересная проблема. Я думаю, что ваш лучший выбор был # 1, но я не уверен, что сделал бы это в конструкторе. Таким образом, клиентский код может выбирать, что он хочет сделать с исключением (подавлять их, обрабатывать их, передавать их вызывающей стороне и т. Д.). А если вам не нравятся исключения, вы можете переместить запись в метод write(), который возвращает true, если запись прошла успешно, и false в противном случае.

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