
Sergey
03.06.2018
17:08:16
да это я понимаю
подчеркну. Различие в том, кто может работать с данными. Сам гейтвей или только объектная модель, а мэппер не причем

Evgeniy
03.06.2018
17:09:56
в обоих случаях table gateway и data mapper, с данными может работать только gateway в первом случае или mapper во втором

Google

Sergey
03.06.2018
17:21:31

Evgeniy
03.06.2018
17:31:26
смотря что считать данными, я считаю данные то что в БД
маппер меняет данные в бд если изменилась сущность

Roman
03.06.2018
18:45:29
спасибо

Sheldhur
04.06.2018
06:28:58
суп
как щас push уведомления делать кошерно? появился какой-то единый протокол и точка распространения или до сих пор в каждом браузере своя реализация и сервер?

Ярослав
04.06.2018
09:18:15
Привет, ребят
Я новичок в программировании , не проведёте review кода с точки зрения архитектуры ?
https://jsfiddle.net/na8n1k6o/
Там небольшой класс
Реализация ActiveRecord в js

Sergey
04.06.2018
09:58:49
архитектура... ммм.... я вижу просто код

Ярослав
04.06.2018
09:59:21

Sergey
04.06.2018
09:59:38
и типичные проблемы решений с нарушением SRP (это не смертельно, и более того не всегда стоит заморачиваться на эту тему если ты круды делаешь), и высокая связанно (что за getStorage статический у типа представляющего сущности....)

Google

Ярослав
04.06.2018
10:00:22
сущность - entity, она прокидывается в конструкторе

Adel
04.06.2018
10:00:30
Чтобы выбрать одну энтити - запрашиваются данные со всей таблицы, загружаются, мапятся и потом фильтруется один

Sergey
04.06.2018
10:01:05

Ярослав
04.06.2018
10:01:25
спасибо, сейчас погуглю)
Сергей, я посмотрел
У меня нет бизнес-логики в activerecord
Это просто класс для удобной работы с данными
Бизнес логика лежит в сервисах (anemic domain model)
А также часть ее в entity :)
Я думал насчет агрегатов, но слишком уж большой overhead, так как у меня той логики кот наплакал
в activerecord instance просто инжектится entity и storage
этот компонент позволяет получать данные и редактировать их

Артур Евгеньевич
04.06.2018
10:08:16
Бизнес логика лежит в сервисах (anemic domain model)
бросай ты это дело пока не поздно

Ярослав
04.06.2018
10:09:32
почему?)
понятно, что active record и anemic domain model - антипаттерны при определенных условиях, но если не нарушать SOLID и SRP в частности, то будет все ок
Разве нет?

Sergey
04.06.2018
10:12:54
почему?)
потому что потом отучиваться заибешься

Adel
04.06.2018
10:13:13
Нет. Srp уже нарушен. Тесты нормально не напишкшь. Но если у тебя логики код наплакал, то пофиг

Sergey
04.06.2018
10:13:18

Ярослав
04.06.2018
10:13:32

Sergey
04.06.2018
10:13:35
ну и да. причин для изменений твоей модели данных стало больше

Adel
04.06.2018
10:14:29

Sergey
04.06.2018
10:15:03
Разве нет?
принципы ради принципов никому не нужны. Что нужно - понять что эти принципы тебе дают. В частности я очень рекомендую тебе подумать чем плоха высокая связанность
почему анемичная модель это антипаттерн - потому что она поощряет высокую связанность и скрывает проблемы декомпозиции (то есть проблемы ты испытывать будешь но менее явно почему)

Google

Sergey
04.06.2018
10:16:33
не ну можно конечно пойти по пути имутабельного стэйта и дробить больше
но я честно не очень понимаю для чего это в localStorage (оно же key-value хранилище уже)

Ярослав
04.06.2018
10:17:56

Sergey
04.06.2018
10:20:09
короч, вместо принципов и паттернов я тебе рекомендую больше внимания уделить терминам coupling, information hiding и cohesion. Без понимания этих концепций понять все остальное намного сложнее (и проще перекинуться в оверинжееринг)

Ярослав
04.06.2018
10:21:50

Sergey
04.06.2018
10:24:11
с конкретным ключем

Ярослав
04.06.2018
10:26:24
я иерархию храню
пример:
user: {
name: 'olalala',
settings: {
someDelay: 666
}
},
tasks: [
{name: 'tb_5', details: {}},
//...
]
хз, может я наркоман в key value такое хранить

Sergey
04.06.2018
10:27:04
я хз зачем тебе отдельные записи доставать
короч, не зная контекст ничего конкретного не скажу

Sergey
04.06.2018
10:27:21
но похоже на оверниженеринг и придумывание велосипедов

Ярослав
04.06.2018
10:31:23
есть расширения для браузера и есть данные в localStorage
схему я тебе скинул выше
задача была у меня - удобно работать с этими данными
вместо того, чтобы писать
chrome.storage.local.get()
и
chrome.storage.local.set()
я пишу
let task = TasksModel.findOne(someId);
task.name = 'changed_name';
task.save();
в activerecord модели ничего, кроме работы с данными нет
storage прокидывай какой хочешь, entity тоже
видимо, не дорос я еще до вашего уровня, чтобы понять о связанности и связности кода)
пойду курить книжки)

Bohdan
04.06.2018
10:34:39
@prophp7

Ярослав
04.06.2018
10:35:36
но похоже на оверниженеринг и придумывание велосипедов
я так и не нашел на просторах необьятного гитхаба нормальную реализацию работы с данными для расширений, а городить orm и агрегаты будет overhead'ом для проекта (хотя на счет orm можно будет подумать, если на indexeddb переезжать)

Sergey
04.06.2018
10:36:29

Ярослав
04.06.2018
10:36:47
для бизнес логики)

Google

Sergey
04.06.2018
10:40:35
правильно, елси ты в чем-то сильно уверен, значит хуевы твои дела

Ярослав
04.06.2018
10:42:22

Oleh
04.06.2018
10:42:35

Ярослав
04.06.2018
10:42:55
Затроллить меня хочешь ?)

Uiiuviiw
04.06.2018
10:49:45
Затроллить меня хочешь ?)
Вы это юзер. У Вас есть имя, но нет конфигурации, хотя конфигурация к Вам может быть описана в отдельном документе, которого у Вас, как у человека, быть не может. У Вас есть печень, почки, но нед документации. Поэтому правильно было бы создать ящик с названием юзер иположить в него конфигурацию и личные данные о юзере, в которых бы уже и было поле имя.
Это если я правильно понял.


Ярослав
04.06.2018
10:51:53
Вы это юзер. У Вас есть имя, но нет конфигурации, хотя конфигурация к Вам может быть описана в отдельном документе, которого у Вас, как у человека, быть не может. У Вас есть печень, почки, но нед документации. Поэтому правильно было бы создать ящик с названием юзер иположить в него конфигурацию и личные данные о юзере, в которых бы уже и было поле имя.
Это если я правильно понял.
тут нужно от требований бизнеса исходить
у меня дело в том, что user - user, а настройки для него - настройки)
будут еще настройки для всего приложения
потому и такое разделение
в settings лежат всякие delay для работы content скриптов, чтобы линкедин не забанил по сигнатурам)

Admin
ERROR: S client not available

Uiiuviiw
04.06.2018
10:53:25
что у Вас написано, то я и прокоментировал.
user: {
name: 'olalala',
settings: {
someDelay: 666
}
},
здесь нет user:{user, settings}

Ярослав
04.06.2018
10:56:03
верно, но потом будет {user, appSettings}
но user.setting и appSettings - разные вещи, поэтому спасибо за уточнение)

Uiiuviiw
04.06.2018
10:56:15
если бы было user:{id, user, settings} то вопросов бы подобныхнаверное и не возникло. Хотя, хочу заметить, это не меня смутило полеname, я всего лишь влез в разговор.

Ярослав
04.06.2018
10:59:04
это просто схема для понимания, хоть и очень схожая с реальной, но все же - синтетический пример)

Enterpise
05.06.2018
11:10:14
привет. У меня антипаттерн: имеется некий store который стабится
вручную
в стабе переобределены геттеры
сеттеры кидают исключение
это плохо ?

Sergey
05.06.2018
11:11:32
да

Google

Sergey
05.06.2018
11:11:49
https://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html
ну и заодно погугли сам связь между геттерами, сеттерами и coupling
и подумай как эта связь проявляется в том что тебе неудобно стабить

Enterpise
05.06.2018
11:21:40
не, вы не так поняли. У меня в одном и том же интерфейсе определены методы GETХХХ и PUTХХХ
для "тестирования" нужно только переопределния GETXXX
здесь ISP violation

Sergey
05.06.2018
11:26:59
или SRP violation
важный момент который ты не рассказал это для чего вызывается GETXXX
то есть как используется полученное значение

Enterpise
05.06.2018
11:45:41
у меня проблема: одни данные частично застабенны
другие нет
как мне заделить
то, что нужно 2 интерфейса - это ОК?

Sergey
05.06.2018
11:49:58

Sheldhur
06.06.2018
01:59:11
Вопрос по push уведомлениям. Вот у пользователя несколько девайсов, плюс к этому у него может быть несколько браузеров, в каждом из которых он может подисаться на пуши и каждый при этом может быть запущен. Как определить куда именно слать уведомление, чтобы не спамить на каждый девайс?

Andrei
06.06.2018
02:40:57
Зависит от архитектуры компонента, который управляет нотификашками. Можно после 1й удачной отправки помечать уведомление, что доставлено как пуш и это будет означать что больше попыток отправить на другие девайсы не будет, например.

Sheldhur
06.06.2018
05:25:05

Adel
06.06.2018
12:46:14
Мне от телеги приходит и туда и сюда...

Roman
06.06.2018
13:13:22