Преобразование объектов в другие типы - PullRequest
1 голос
/ 30 октября 2009

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

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

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

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

Ответы [ 2 ]

1 голос
/ 30 октября 2009

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

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

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

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

1 голос
/ 30 октября 2009

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

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

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

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

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