ФорумПрограммированиеPHP для идиотовPHP и ООП → Репозиторий, Модель, Инкапусуляция

Репозиторий, Модель, Инкапусуляция

  • lekafe

    Сообщения: 149 Репутация: N Группа: Адекваты

    Spritz 27 ноября 2014 г. 1:16

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


    $manager = $this->repositoryManager;
    $repository = $manager->getByModule('pages');
    $model = $repository->read(562);
    $model->set('name', 'something');
    $repository->update($model);


    как то много, в AR все проще


    $model = Page::read(562);
    $model->name = 'something';
    $model->update();


    Таки вопрос будет ли правильным сделать AR, но при том в самой модели будет все на репозиториях, то есть все вот эти простыни будут внутри. Не будет ли это противоречить паттерну репозиторий?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 1:31, спустя 14 минут 56 секунд

    юзай чо нить готовое, сэкономишь свое время. в жизни важно только время. это я понял за свои 29 ...

    Сапожник без сапог
  • lekafe

    Сообщения: 149 Репутация: N Группа: Адекваты

    Spritz 27 ноября 2014 г. 1:36, спустя 5 минут 8 секунд

    @phpdude, это понятно, но это же велосипед, готовое я юзаю на работе
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 1:42, спустя 5 минут 48 секунд

    @lekafe, db layer велосипедить в наше время - трата времени, их уже сотни тысяч )) чо нить другое велосипедь ))

    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 1:46, спустя 4 минуты 15 секунд

    _паттерны_ это не цель. они вторичны! паттерны это то, что позволяет тебе не думать, действовать по накатанной — в широком смысле, не только в IT.
    ты находишь путь как что-то выполнить с минимумом усилий, вот в чем суть. а потом проанализировав, можешь обнаружить в этой практике элементы какого-то паттерна.

    а ты пытаешся действовать строго наоборот. это говно!

    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 2:00, спустя 13 минут 54 секунды

    конкретно по интерфейсу доступа к БД. да, что-то похожее на ActiveRecord распостранено и многим кажется удобным. но, блять, я не думаю, что
    $rec->field_a чем-то лучше, чем $rec['field_a'] ! это никак не ускоряет написание кода. когда нет настоящих типов — нет подсказок от IDE. значит похуй какой синтаксис использовать. я при таком раскладе выбираю простой вреппер над PDO, с парой нужных мне плюшек.

    другое дело DataMapper. там в центре внимания целевой объект, то есть ты сначала пишешь класс "пользователь", IDE видит и умеет подсказыть все его свойства и методы. это помогает в разработке! а задача маппера эти объекты сохранять и добывать. такое вот разделение труда.
    но, блять, нет в жизни идеала. DM дорогой в реализации. и полностью абстрагироваться всё равно не получается, не все классы из коробки готовы быть персистентными.

    все абстракции дырявы!

    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 2:02, спустя 2 минуты 17 секунд

    DataMapper это чудесно .. ar - обычно

    Сапожник без сапог
  • lekafe

    Сообщения: 149 Репутация: N Группа: Адекваты

    Spritz 27 ноября 2014 г. 2:57, спустя 54 минуты 51 секунду

    @artoodetoo, ты какую-то кашу написал, при чем тут DataMapper, у меня репозиторий
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 3:24, спустя 26 минут 56 секунд

    да мне похуй что у тебя :) так-то если начистоту.

    ιιlllιlllι унц-унц
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 27 ноября 2014 г. 3:27, спустя 3 минуты 5 секунд

    юзай чо нить готовое, сэкономишь свое время. в жизни важно только время. это я понял за свои 29 …

    @phpdude, с одной стороны верно, с другой - опыт приходит через количество самостоятельно написанного разнообразного кода, в том числе велосипедного.

    Спустя 172 сек.

    @lekafe, как показывает практика, проще и, что немаловажно, читаемей - просто захардкодить названия моделей, как у тебя во втором варианте.

    $model = Page::read(562);
    $model->name = 'something';
    $model->update();


    и таблицу в базе назвать тоже pages.

    А вся эта вложенность ради вложенности не нужна.
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 3:30, спустя 2 минуты 52 секунды

    если вопрос в том, будет ли твоё поделие противоречить какому-то паттерну, могу еще раз повторить: увидеть паттерн можно в чем угодно. некоторые в куске говна бога видят. ни к чему эти мучительные самокопания, важно чтобы задача выполнялась и чтобы хуятор поменьше уставал при этом.

    ιιlllιlllι унц-унц
  • lekafe

    Сообщения: 149 Репутация: N Группа: Адекваты

    Spritz 27 ноября 2014 г. 3:42, спустя 12 минут 25 секунд

    @artoodetoo, тут же вопрос не только в правильности применения паттернов, а в том не обвернется ли это печальными последствиями.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 3:44, спустя 1 минуту 43 секунды

    если вопрос в том, будет ли твоё поделие противоречить какому-то паттерну, могу еще раз повторить: увидеть паттерн можно в чем угодно. некоторые в куске говна бога видят. ни к чему эти мучительные самокопания, важно чтобы задача выполнялась и чтобы хуятор поменьше уставал при этом.

    @artoodetoo, что за экстримизм!

    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 4:49, спустя 1 час 4 минуты 51 секунду

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

    $manager = $this->repositoryManager;  
    $repository = $manager->getByModule('pages');  
    $model = $repository->read(562);  
    $model->set('name', 'something');  
    $repository->update($model);
    

    как то много, в AR все проще

    $model = Page::read(562);  
    $model->name = 'something';  
    $model->update();
    

    Таки вопрос будет ли правильным сделать AR, но при том в самой модели будет
    все на репозиториях, то есть все вот эти простыни будут внутри. Не будет ли
    это противоречить паттерну репозиторий?

    @lekafe, так проблема только в том что ты больше на две строки написал? Тогда сделай себе хелпер и все. Если проблема что "repositoryManager" это слишком излишне для твоей системы, ну тогда не используй

    Если тебе интересно, в какой-нибудь жанге это вот так выглядит:

    obj = Page.objects.get(pk=562)
    obj.name = 'something'
    obj.save()
    

    или лучше

    Page.objects.filter(pk=562).update(name='something')
    
    adw/0
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 27 ноября 2014 г. 4:53, спустя 3 минуты 41 секунду

    У меня есть претензии к эктив рекорд ))) Фактически он не дает нам никакой новой функциональности. Настоящий "голый SQL" нагляднее и эффективнее. Вот твой пример показывает, что для изменения одного поля мы должны создать объект, загрузить в него все поля из базы, затем изменить одно и записать все поля назад. А без него мы бы написали _буквально_ то, то хотим сделать: "UPDATE page SET name='ololo' WHERE id=536".

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

    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!