212 похожих чатов

Привет. А подскажите как правильно смоделировать агрегаты в этой ситуации: Есть

два агрегата ReadingSession и Book.

У ReadingSession есть метод setCurrentPage, которые перелистывает страницу. Соответственно устанавливемая страница не должна быть больше, чем всего страниц у книги.

Что я могу сделать:

1. Передавать в setCurrentPage инстанс Book, чтобы можно было сделать сравнение с кол-вом страниц. В таком случае инвариант не будет нарушен
2. Добавить в ReadingSession readonly парамер pages, куда будет выгружать кол-во страниц из кинги. Так удобнее в том плане, что не нужно два агрегата выгружать сразу. Но инвариант уже не гарантирован.

Как мне поступить?

10 ответов

22 просмотра

почему инвариант не гарантирован во втором случае? штука, которая инстанцирует сессию должна проверять инварианты, мне кажется. new ReadingSession(book.pages.size)

Alexander- Автор вопроса
🐴
почему инвариант не гарантирован во втором случае?...

За время работы с ReadingSession, Book может измениться

1. Перечислить операции в которые вовлечены данные 2. Перечислить инварианты стэйта, прекондишены для этих операций и от каких данных зависят 3. Прикинуть насколько мы чувствительны к stale data 0. Выкинуть из головы агрегаты книга и т.д. агрегаты про процессы а не про сущности

Alexander
За время работы с ReadingSession, Book может измен...

Может, но это значит что мы уже другую книгу читаем, это ок вообще?

Alexander- Автор вопроса
Sergey P
Может, но это значит что мы уже другую книгу читае...

А. Действительно. У меня же страницы не меняются после создания

Alexander- Автор вопроса
Sergey P
1. Перечислить операции в которые вовлечены данные...

А вообще зачем мне агрегат книги выкидывать из головы, если во время чтения я не могу читать страницу, которой нет?

Alexander
А вообще зачем мне агрегат книги выкидывать из гол...

Я не знаю зачем тебе агрегат книги. Очень странно иметь границу бизнес транзакций которую мы называем книгой

Alexander- Автор вопроса

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

а почему устанавливаемая страница не должна быть больше, чем всего страниц у книги? А количество страниц часто меняется? А что случится, если устанавливаемая страница будет больше, чем страниц у книги?

Alexander
Ну до того как пользователь сможет читать книгу, е...

мысленно представь что когда бизнес говорит "у книги есть ISBN и заголовок" это не значит что у тебя есть сразу сущность книга с полем isbn и title, это так же может значить что у нас есть сущность BookID и сущность ISBN и какой BookDescription.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта