
da horsie
19.05.2017
18:32:25
понял
спасибо

Konstantinx
20.05.2017
19:06:41
Привет всем.Такой вопрос.Как правильней? При работе с orm сначала создают схему базы и потом её мапят на классы или наоборот : мапят классы и автоматически генерируют базу?

Evgeniy
20.05.2017
19:31:18
если есть готова бд то второе

Google

Evgeniy
20.05.2017
19:31:26
если бд нет готовой то как удобней

Paul
20.05.2017
19:40:27
С автоматической генерацией не надо связываться: крест на миграциях
Отдельно схемы, отдельно модели. Причем для одной таблицы может быть несколько моделей
В идеале должно чекаться соответствие модели схеме. Например, в растовом diesel при компиляции чекается

Max
20.05.2017
20:03:30
Господа, день добрый. Вопрос сторонникам DDD. Правильно ли я понимаю, что у Эванса сущность (entity) - это anemic-модель с id? Ну или в реальности, какой-нибудь класс Employer с id, который соответствует id-шнику в базе данных.

Aleh
20.05.2017
20:04:36
Не anemic
Но с id

Konstantinx
20.05.2017
20:07:40

Sander
20.05.2017
20:14:19
кто-нибудь применяет на практике ddd(domain-driven-design)?

Max
20.05.2017
20:17:41
Но с id
Хорошо, но тогда еще вопрос, т.к. есть проблема с этим id
Православный вариант репозитория Эванса такой:
public interface AccountRepository {
void addAccount(Account account);
void removeAccount(Account account);
void updateAccount(Account account);
List query(AccountSpecification specification);
}
Если лепить без спецификаций (если операций мало, и нет желания усложнять), то это получается DAO.
Но в любом случае, у него в метод нужно запихивать уже инициализированную сущность
account. Но что делать, если у меня как раз таки есть привязка к id-шникам в базе данных (т.е. изначально я не знаю, какой у сущности id, пока не постучусь в базу)?

Aleh
20.05.2017
20:19:02

Sergei
20.05.2017
20:19:23
id это поле хранилища данных и ты его не должен трогать, хранилище само будет назначать тебе эти id

Google

Max
20.05.2017
20:25:04
Получается, я создавая в классе с бизнес-логикой этот account, должен не трогать id?

Sergei
20.05.2017
20:26:37
Ну если тебе зачем то нужен id то как ты узнешь какие у тебя есть, а какие нет, или я не совсем верно понял твой вопрос.
Допустим ты создаёшь новый аккаунт представь аналогию с блокнотом, ты создаёшь новый документ, его пока не существует на диске он называется new doc 1, потом когда ты его сохраняешь, то у него появляется id т.е. его имя на диске, а в случае с базой данных это номер, а не имя. А когда Account ещё не сохранён* то это поле null

Max
20.05.2017
20:30:05
Просто те подходы, которые рассмотрены в примерах в интернете, этот момент не затрагивают - там либо явно задается рандомный uuid, либо еще каким-то способом генерируется id, и случай "есть таблица бд с auto increment primary key" не рассматривается

Sergei
20.05.2017
20:42:57
вообще привязка к каким id? тем что primary key или uuid?

Max
20.05.2017
20:50:29
структуры таблиц бд в примерах я не видел,

Sergei
20.05.2017
20:52:32

Max
20.05.2017
20:59:14
если прям конкретные примеры, которые я смотрел, то вот https://bitbucket.org/sixty-north/d5-kanban-python/src/4f880ea7425a5bf1d859474cbf76897510a58978/infrastructure/persistence_oriented_repos/work_item_repository.py?at=master&fileviewer=file-view-default
и вот еще, там это все как я понял разруливается hibernate-ом, я пока без orm пробую делать в целях понимания https://github.com/citerus/dddsample-core/blob/master/src/main/java/se/citerus/dddsample/infrastructure/persistence/hibernate/CargoRepositoryHibernate.java

Aleh
20.05.2017
21:04:45

Max
20.05.2017
21:07:03

Aleh
20.05.2017
21:07:13
а зачем он вам?

Max
20.05.2017
21:12:23
а зачем он вам?
Конкретно в моем случае, у меня есть класс Card (таблица id, text, deck_id)) и класс CardStats(id, card_id, some_numbers). Юзер создает карточку Card, идет запрос к бд, я должен узнать id-шник, чтобы создать объект CardStats и впихнуть туда card_id.
ну и обратный вариант, я иду в класс логики, беру CardStats по нужным мне критериям и, если я правильно сделал, что храню в сущности CardStats id-шник конкретной карты card_id, выгружаю из базы уже конкретные карты по этим id-шникам
беру и сохраняю, соответственно, через репозиторий

Aleh
20.05.2017
21:32:20
Это же умеют сами делать doctrine/hibernate

Max
20.05.2017
21:33:17

Google

Aleh
20.05.2017
21:34:09
Тогда зачем вы усложняете?)

Max
20.05.2017
21:36:23
с точки зрения ddd

Sergey
21.05.2017
08:54:31
с точки зрения ddd
с точки зрения ddd ты должен загоняться по предметной области, разобраться как оно с точки зрения бизнеса должно работать, разбираться что именно и зачем ты делаешь
а orm или нет - у тебя с точки зрения бизнес логики будет примерно одинаково
то есть если у тебя нет orm - она у тебя появится

Ivan
21.05.2017
14:49:10
какие есть хорошие ресурсы по солиду?
книгу боба мартина не советовать.

Sergey
21.05.2017
14:49:36
одно и тоже, но как по мне осознается проще
SOLID просто больше оринтирован на рефакторинг и анализ потока изменений

Ivan
21.05.2017
14:50:56
скоро доберусь))
дядя боб просто много текста пишет заумного.

Sergey
21.05.2017
14:51:07
ну тогда Лармана точно не осилишь)

Aleh
21.05.2017
14:51:13
наоборот ж
дядя Боб все упрощает и немного искажает, чтобы легко донести мысли

Sergey
21.05.2017
14:51:34
если у тебя к примеру не практикуется регулярный рефакторинг, ты не думаешь как используется то что ты пишешь - SOLID не для тебя.

Like
21.05.2017
14:51:36

Ivan
21.05.2017
14:51:45
ну просто он реально некоторые простые вещи сложно расписывает

Sergey
21.05.2017
14:51:58

Ivan
21.05.2017
14:52:07
лисков
LSP

Google

Sergey
21.05.2017
14:52:23
конкретнее
что именно по твоему сложно расписывается?

Admin
ERROR: S client not available


Like
21.05.2017
14:52:36
Если что )
lsp - допустим есть тип Птица и есть подтипы: орёл, цапля, воробей. Все птицы умеют летать и во всех местах программы вместо птицы можно будет подставить три эти реализации и всё будет работать.
Substitutability is a principle in object-oriented programming stating that, in a computer program, if S is a subtype of T, then objects of type T may be replaced with objects of type S (i.e. an object of type T may be substituted with any object of a subtype S) without altering any of the desirable properties of T (correctness, task performed, etc.). More formally, the Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called (strong) behavioral subtyping,
Но есть ещё пингвин, который летать не умеет но он ЯВЛЯЕТСЯ птицей, добавляем пингвина в нашу программу и опять говорим всем птицам лететь, все выполняют команду, пингвин бросает UnsupportedOperationException. Или пингвин должен летать, т.к. он ЯВЛЯЕТСЯ птицей или он не должен быть птицей. Пингвин это нарушение lsp, пример из реального мира: java collection framework.


Ivan
21.05.2017
14:52:41
первый пример годный, а второй трындец.
в книге все есть

Sergey
21.05.2017
14:53:14
хз, проще чем у боба про SOLID ничего нет. Если что предлагаю просто то что ты прочитал у Боба шлифануть видяшками
(его же лекции + вот мне нравится у этого челика: https://www.youtube.com/watch?v=bVwZquRH1Vk

Aleh
21.05.2017
14:54:20
http://blog.byndyu.ru/2009/10/solid.html вот здесь еще норм

Ivan
21.05.2017
14:56:19
Если каждому объекту типа O1 типа S соответствует объект O2 типа T.
Таким образом, всех програм P, определенных на основе T, поведение P не меняется при замене O1 на O2, причем S является подтипом T.
это вырезка из книги

f4rt~
21.05.2017
14:56:36

Sergey
21.05.2017
14:56:39

f4rt~
21.05.2017
14:56:40
почти все видосы посмотрел

Ivan
21.05.2017
14:56:46
ага

Sergey
21.05.2017
14:57:59
ага
ну то есть а что ты еще хочешь? Что бы он не приводил в книге оригинальное определение? он же потом далее другими словами объясняет

Ivan
21.05.2017
14:58:42
хочется чтоб вообще просто было ))

Aleh
21.05.2017
14:58:51

Ivan
21.05.2017
14:58:54
что б не читать неделю

Sergey
21.05.2017
14:59:21
хочется чтоб вообще просто было ))
LSP это когда у тебя система завязана на одну ху*ню, а ты вместо нее "подставляешь" другую ху*ню, и поведение системы от этого не меняется

Google

Ivan
21.05.2017
14:59:36
та я знаю))

f4rt~
21.05.2017
14:59:37

Sergey
21.05.2017
14:59:55

f4rt~
21.05.2017
14:59:59
хм

Ivan
21.05.2017
15:00:01
оно не должно меняться

Sergey
21.05.2017
15:00:24
хм
поведение, оно не учитывает детали реализации вроде "ну тип теперь оно не в файл пишет а в базу"

Aleh
21.05.2017
15:00:42

Sergey
21.05.2017
15:00:58

Aleh
21.05.2017
15:01:05
ну я про это и говорю)

Sergey
21.05.2017
15:02:09
не сильно меняется*
суть именно в том что бы подстановка другой реализации какой-либо херни вообще никак не влияла на систему. Контракты как были так и остались. Все прекондишены как были так и остались. Все инварианты должны остаться прежними...

f4rt~
21.05.2017
15:02:17