2009-10-30 3 views
1

Я работаю над приложением RoR, но это общий вопрос стратегии для ООП. Рассмотрим случай, когда есть несколько типов ссылок, на которые вы храните данные: Книги, Статьи, Презентации, Главы книг и т. Д. Каждый тип ссылки является частью иерархии, где общие поведения находятся в самой общей точке наследования, и на уровне БД я использую однонаправленное наследование. Тип устанавливается с помощью опции выбора, поэтому давайте скажем, что я вводил данные так, как если бы это была книга, но потом понимаю, что это только глава. Поэтому я меняю тип ссылки, выбирая «Book Chapter», после чего публикует обновление существующей модели/формы. Вопрос в том, что является правильной стратегией для решения этой проблемы?Преобразование объектов в другие типы

С одной стороны, предпочтительнее преобразовать существующую запись в БД, чтобы избежать исчерпания идентификатора и потенциально сохранить операции для создания/удаления записей. Это, однако, как правило, делает стратегию обновления сложной.

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

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

ответ

1

Предпочитают неизменные объекты, другими словами: вторая стратегия. Ваши объекты не могут быть неизменными сами по себе, но уменьшение изменчивости часто является шагом в правильном направлении.

Кроме того, это более естественный способ. В общем случае ООП не существует способа изменить тип объекта. В вашей ситуации вы можете, но это все еще неудобно и необычно.

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

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

1

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

Каждая из записей, которые вы указали, имеет одинаковую форму. Это блок текста с братьями и сестрами, родителями и детьми. Например, глава может иметь блок текста с родительской книгой и дочерней сноской. Они дифференцируются на уровне БД только по типу, который сам по себе может быть полем.

Все, что вам нужно, это модель для обработки этих «элементов» по-разному в зависимости от того, помечена ли она как книга или глава и т. Д. Если элемент отмечен как глава, но не имеет родителя, для Например, вы можете пометить его как «книгу», когда она будет сохранена в БД.

Изменение способа, по которому элемент отмечен, не изменяет элемент, он изменяет только способ его просмотра. Пока элемент знает, как найти его детей, данные будут вычисляться одинаково. Что касается модели, это всего лишь элемент, о котором вы беспокоитесь. Остальное сделано в пользовательском интерфейсе.

+1

Согласен.Если ваши модели являются достаточно похожими, чтобы гарантировать однонаправленное наследование таблицы, то любой из этих вариантов будет намного более трудным, чем это действительно необходимо. –

+0

Возможно, я должен был использовать второй пример. Речь идет не только о хранении данных, но и о том, как ведут себя данные. Другой пример - это то, где мы создаем скрипты для игры, а записи представляют собой узлы выражения. Так что давайте скажем, что у нас есть класс Effect, и есть такие вещи, как «Дать» и «Вступить», но у GiveMoneyEffects есть другие требования, чем «GiveItemEffects», которые требуют выбора элементов. В этом случае происходят изменения поведения формы, а также проблемы времени обработки. Что такое «правильная» вещь? – adamaig

+0

@adamaig Ну, тогда правильная вещь могла бы создать новый объект с другим подклассом. Кроме того, вы можете просто иметь поле поведения, которое проверяет ваша модель. Если вы используете Ruby, вы можете использовать метапрограммирование, чтобы дать объекту свою собственную функциональность во время выполнения. Как прокомментировал @NSD, правильная вещь будет зависеть от диморфизма ваших моделей и языка/парадигмы, с которой вы решили работать. – deau

Смежные вопросы