Это скорее шаблонно-ориентированный вопрос, а не языковой.Предположим, у меня есть объект User, который имеет форму:
class User
var id
var email
var password
var dateCreated
end
Два распространенных подхода, которые я видел для сохранения объекта User, следующие:
// Approach 1
new User(id)
->setEmail(email)
->setPassword(pass)
->setDateCreated(date)
->saveNew()
В этом подходеобъект User имеет каждый набор свойств, а затем метод saveNew
создаст соответствующий оператор вставки для выполнения в базе данных, используя свойства, заданные для пользователя (например, insert into user values (this.email, ...)
. Другой подход:
// Approach 2
new User()->saveNew(User userObj)
В этом примере вы видите, что метод save, хотя и метод экземпляра, в некотором роде рассматривается как статический метод, поскольку ему передается заполненный объект User, а не работа с его собственными данными, что вПоворот создает правильное утверждение (например, insert into user values (user.email, ...)
).
Второй подход, для меня, кажется немного неправильным. Но вот почему я спрашиваю вас. В качестве продолжения позвольте мне спросить васпохожий вопрос. Допустим, мы хотим получить пользователя. Мы можем сделать что-то вроде следующего:
new User(id)->fetch
-или- new User()->fetch(id)
Сейчасв методе выборки я видел эти 2подходы:
function fetch
result = db->fetch('select * from user where id=this.id')
user = new User()
user->setId(result->id)
user->setEmail(result->email)
user->setPassword(result->password)
user->setDateCreated(result->dateCreated)
return user
end
-and-
function fetch
result = db->fetch('select * from user where id=this.id')
// We can set the properties directly or through their 'setters'
this->id = result->id
this->email = result->email
this->password = result->password
this->dateCreated = result->dateCreated
return this
end
Возврат нового объекта User в отличие от установки свойств this
кажется противоинтуитивным, но яувидеть это местами.Имеет ли это значение?Есть ли правильный, чистый способ сделать это?