Информация об изменениях

Сообщение Re[3]: Factory pattern от 31.01.2017 10:28

Изменено 31.01.2017 10:57 ·

Re[3]: Factory pattern
Здравствуйте, Gattaka, Вы писали:

S>>Во всех трех одновременно и безусловно? Или либо в одной, либо в другой, либо в третьей в зависимости от некоторых условий?

G>Давай рассмотрим оба варианта.
Это довольно разные варианты. Во втором случае просто сохраняешь и всё. В первом случае... а что если в двух базах сохранилось, а в третей — constraint какой-нибудь упал или место кончилось? Откатывать всё или надеяться на авось? Нужен поди какой-нибудь 2PC. Или сделать одну из БД "главной", работа будет только с главной БД, а остальные две просто синхронизируются в фоне.

G>>>Но как быть с обновлением и удалением?

S>>Наверное так же как и с сохранением... нет?
G>Ну вот об этом и вопрос. Если создание сущности абстрагируется особым паттерном — фабрика, то почему нет паттерна для обновления или удаления?
Ты путаешь. Фабрика — для создания инстансов класса. А бд это копирование данных класса из/в внешнего хранилища — persistence.
Для доступа к базам данных есть паттерны DAO, repository, ORM. Например:
interface MyEntityDao
{
    void insert(MyEntity entity);
    void update(MyEntity entity);
    void delete(MyEntity entity);
}
...
class GalaxyMyEntityDao implements MyEntityDao
{
    @Override void insert(MyEntity entity) {galaxyConnection.doInsert(...entity...);}
...
}
class JdbcMyEntityDao implements MyEntityDao
{
    @Override void insert(MyEntity entity) {jdbc.execute("INSERT INTO MY_ENTITY_TABLE(...)...", ...entity...);}
...
}
...

И тут же можно размножать:
class MultipleStoreMyEntityDao implements MyEntityDao
{
    GalaxyMyEntityDao galaxy;
    JdbcMyEntityDao jdbc;
    OneCMyEntityDao oneC;
    @Override void insert(MyEntity entity)
    {
        // надо ещё добавить правильную обработку исключений.
        galaxy.insert(entity);
        jdbc.insert(entity);
        oneC.insert(entity);
    }
}
Re[3]: Factory pattern
Здравствуйте, Gattaka, Вы писали:

S>>Во всех трех одновременно и безусловно? Или либо в одной, либо в другой, либо в третьей в зависимости от некоторых условий?

G>Давай рассмотрим оба варианта.
Это довольно разные варианты. Во втором случае просто сохраняешь и всё. В первом случае... а что если в двух базах сохранилось, а в третей — constraint какой-нибудь упал или место кончилось? Откатывать всё или надеяться на авось? Нужен поди какой-нибудь 2PC. Или сделать одну из БД "главной", работа будет только с главной БД, а остальные две просто синхронизируются в фоне.

G>>>Но как быть с обновлением и удалением?

S>>Наверное так же как и с сохранением... нет?
G>Ну вот об этом и вопрос. Если создание сущности абстрагируется особым паттерном — фабрика, то почему нет паттерна для обновления или удаления?
Ты путаешь. Фабрика — для создания инстансов класса. А бд это копирование данных инстанса из/в внешнего хранилища — persistence.
Для доступа к базам данных есть паттерны DAO, repository, ORM. Например:
interface MyEntityDao
{
    void insert(MyEntity entity);
    void update(MyEntity entity);
    void delete(MyEntity entity);
}
...
class GalaxyMyEntityDao implements MyEntityDao
{
    @Override void insert(MyEntity entity) {galaxyConnection.doInsert(...entity...);}
...
}
class JdbcMyEntityDao implements MyEntityDao
{
    @Override void insert(MyEntity entity) {jdbc.execute("INSERT INTO MY_ENTITY_TABLE(...)...", ...entity...);}
...
}
...

И тут же можно размножать:
class MultipleStoreMyEntityDao implements MyEntityDao
{
    GalaxyMyEntityDao galaxy;
    JdbcMyEntityDao jdbc;
    OneCMyEntityDao oneC;
    @Override void insert(MyEntity entity)
    {
        // надо ещё добавить правильную обработку исключений.
        galaxy.insert(entity);
        jdbc.insert(entity);
        oneC.insert(entity);
    }
}