2013-05-30 3 views
0

Я использую PHP, если это имеет значение, и я отслеживаю продукты с классом Product. Конструктор принимает один параметр, который является идентификатором продукта. Затем конструктор переходит в базу данных и получает всю информацию о продукте и задает все свойства для этого экземпляра. После выполнения всех операций пользователь может вызвать функцию save(), и новая информация обновит продукт в базе данныхOOP, разбивающий класс на создание и использование

Если идентификатор продукта установлен в ноль в конструкторе, то класс продукта понимает что это новый продукт и не получает ни одной из переменных. Он позволяет вам устанавливать все переменные и проверять их. Затем, когда вы вызываете функцию save(), она создает продукт и устанавливает идентификатор продукта в новый идентификатор, который был присвоен строке в базе данных.

Проблема, с которой я сталкиваюсь, состоит в том, что некоторые функции нельзя вызывать, если продукт создается и еще не был сохранен, поскольку он не имеет идентификатора. Поэтому в каждый момент времени, когда вызываются некоторые функции, я должен проверить, что ID> 0.

Мне было интересно, нужно ли разделить класс на класс только для создания и класс для использования существующего продукта (например, Product и CreateProduct). Преимущество этого заключается в том, что класс Product всегда может предположить, что продукт уже создан, поэтому мне не нужно его проверять, и все методы проверки могут быть перемещены в отдельный класс и лучше управляться.

Просто хотел услышать мнения и рекомендации. Спасибо, Alex

+0

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

+0

Если вы уверены, что экземпляр продукта будет каким-то образом сохранен, вы не можете зарезервировать идентификатор в базе данных, вставив пустую строку из своего конструктора? Затем в методе «save» вы действительно сделаете обновление db, чтобы продукт был вновь создан или нет. Таким образом, любой сконструированный продукт будет иметь идентификатор (который часто используется конструктором = для получения объекта, который «безопасен» для использования). – darma

+0

(Возможно, существует путаница между программным объектом, который является временным, и резидентным «объектом» базы данных, который является постоянным. Эти два являются отдельными, физически и концептуально, хотя программный объект является чем-то вроде «doppelganger» резидентный объект базы данных.) –

ответ

1

Короче говоря, я так считаю. Похоже, что общее поведение звучит как кандидат на несохраненный продукт как подкласс продукта, но это также сильно зависит от того, регулярно ли продукт переводится из сохраненного в несохраненный над исполнением скрипта. В этом случае вы можете исправить это, всегда имея $product->save() верните правильный экземпляр объекта.

Вы также можете извлечь выгоду из этого шаблона в целом, поскольку в будущем, если вы добавите какой-то метод Product :: find ($ id), вы можете затем вернуть подкласс, более определенный на основе данных, загружаемых из базы данных, или в случае 0, вернуть CreateProduct.

Я из школы, которая инициализирует класс идентификатором базы данных, в общем, является неудобной практикой и одновременно создает логику ветвления для чего-то конкретного. «Является ли id для исключения, если id не существует? Я просто устанавливаю id равным null, если он не существует?»

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