Шаблон для сохранения объектов модели? - PullRequest
0 голосов
/ 10 марта 2012

Это скорее шаблонно-ориентированный вопрос, а не языковой.Предположим, у меня есть объект 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 кажется противоинтуитивным, но яувидеть это местами.Имеет ли это значение?Есть ли правильный, чистый способ сделать это?

1 Ответ

0 голосов
/ 10 марта 2012

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

OTOH обычно не лучшая идея, чтобы класс нес ответственность за себя (кроме маленьких и простых систем). Этот подход не масштабируется. Если логика постоянства разбросана повсюду, это превратится в кошмар, если возникнет необходимость в миграции на другую БД. Постоянство - это понятие, ортогональное идее представления Пользователя, поэтому лучше обращаться с ним в отдельном классе. Такие классы часто называют объектами доступа к данным (DAO) . Использование DAO может выглядеть так:

dao = new UserDAO()
...
user = new User(id)
user->setEmail(email)
user->setPassword(pass)
user->setDateCreated(date)
dao->save(user)

...

user2 = dao->fetch(id2)

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

...