Size: a a a

Software Design/Architecture/Zen

2021 March 15

HH

Human Human in Software Design/Architecture/Zen
Max Grom
Если маленький проект, то почему нет?
Ну я больше про то, что нельзя точно сказать выполнен SRP принцип или нет
источник

MG

Max Grom in Software Design/Architecture/Zen
Human Human
Ну я больше про то, что нельзя точно сказать выполнен SRP принцип или нет
Ну если вы определили весьма точно грань детализации и весьма четко расставили обязанности - то опять таки, почему нет?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Human Human
Мне один чел затирал, что SRP это очень однозначный и прямой принцип, где код можно на 100% разделить как “единичные отвественности”
Врали ему
источник

DK

Daniil Kostin in Software Design/Architecture/Zen
Sergey Protko
да, для соблюдения OCP на этапе проектирования нужно знать будущее. Можно пробовать "придумать будущее" - это в целом работает но скорее всего рано или поздно этот принцип будет нарушен. С SRP похожая история - что бы хорошо понимать соблюдает твой код SRP или нет нужно оч хорошо понимать откуда изменения приходят, почему они приходят и кто от них блага получает. Эти принципы больше подходят для того что бы драйвить рефакторинг. Тот рефактоинг который "пописал код часик - посмотрел что написал отрефактоил" а не "переебашить пол проекта"
Будущее, к сожалению, експоненциально увеличивает число вариантов с каждой итерацией дальше.... что приводит к невозможности его угадать в относительной перспективе.
Про логику в коде я встречал, что часто выбирается компромис для бизнеса в ущерб разработке, чтобы бизнес видел свою модель более ясно. Видимо в данном случае это ближе к этому.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Daniil Kostin
SRP тоже не однозначно понимается разными людьми и имеет не одну грань понимания. Недавно встретил заметку о не единственной ответственности, а о единственности обслуживания, но сейчас найти не могу.
Зато нашел это, где тоже специфическое понимание, на примере класса контекста, котрый может разростись до god объекта...
https://medium.com/android-news/single-responsibility-principle-and-context-60e39a28e5bd#:~:text=Single%20Responsibility%20Principle%20(SRP)%3A,only%20one%2C%20reason%20to%20change.&text=Following%20SRP%20is%20difficult%20because,future%2C%20when%20requirements%20actually%20change.
Что такое класс context?)
источник

DK

Daniil Kostin in Software Design/Architecture/Zen
Human Human
Мне один чел затирал, что SRP это очень однозначный и прямой принцип, где код можно на 100% разделить как “единичные отвественности”
На хабре штук 10 статей и каждая не маленькая...
источник

DK

Daniil Kostin in Software Design/Architecture/Zen
Sergey Protko
Что такое класс context?)
который передает состояние системы, ее связей. Как я это понимаю.
источник

HH

Human Human in Software Design/Architecture/Zen
Max Grom
Ну если вы определили весьма точно грань детализации и весьма четко расставили обязанности - то опять таки, почему нет?
Ну вот только к тому же излишнее разделение тоже портит код. Зачем дробить то, что меняться скорее всего будет только одним образом и вместе. Это только ухудшит читаемость и займет время. Поэтому это правило полезно, когда уже интуитивно понимаешь что лучше.
источник

MG

Max Grom in Software Design/Architecture/Zen
Human Human
Ну вот только к тому же излишнее разделение тоже портит код. Зачем дробить то, что меняться скорее всего будет только одним образом и вместе. Это только ухудшит читаемость и займет время. Поэтому это правило полезно, когда уже интуитивно понимаешь что лучше.
Так я и не говорю излишне разделять. Я про достаточный уровень детализации
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Daniil Kostin
который передает состояние системы, ее связей. Как я это понимаю.
Шо за херня)
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Штука которая все связывает ВНЕЗАПНО может стать год обджектом
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Жаль лень читать статью что б разобраться что это за треш
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Sergey Protko
цель у SOLID какая? Уменьшить каскад изменений. То есть по факту добиться OCP. Ну или как минимум если уж изменения случилось что бы затронуло что-то одно - SRP. Как этого добиться? Можно под клиентский код специализированные интерфейсы делать (ISP) и менять направления зависимостей так что бы оно всегда указывало от менее стабильных к более стабильным модулям (DIP). Ну и если ты начала обмазываться интерфейсами то LSP поможет убедиться что контракты выбраны правильно.
😂👍
источник

DK

Daniil Kostin in Software Design/Architecture/Zen
Sergey Protko
Жаль лень читать статью что б разобраться что это за треш
Я это привел не как пример хорошего чтива, а скорее, что у каждого свое недопонимание одного, как-бы простого принципа.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Human Human
Ну вот только к тому же излишнее разделение тоже портит код. Зачем дробить то, что меняться скорее всего будет только одним образом и вместе. Это только ухудшит читаемость и займет время. Поэтому это правило полезно, когда уже интуитивно понимаешь что лучше.
В целом так, но лучше раздробить и склеить если неудобно
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Sergey Protko
В целом так, но лучше раздробить и склеить если неудобно
Всегда был вопрос: вот есть мелкие агрегаты. Тут приходит заказчик и накидывает инвариант, который захватывает 2 агрегата (т.е. если он был один - было бы лучше под новый кейс) . Перепиливается полсистемы под новый склеенный агрегат или что?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Павел Г.
Всегда был вопрос: вот есть мелкие агрегаты. Тут приходит заказчик и накидывает инвариант, который захватывает 2 агрегата (т.е. если он был один - было бы лучше под новый кейс) . Перепиливается полсистемы под новый склеенный агрегат или что?
Тру инварианты которые должны форситься на уровне агрегата так просто не возникают
источник
2021 March 16

SP

Sergey Protko in Software Design/Architecture/Zen
Павел Г.
Всегда был вопрос: вот есть мелкие агрегаты. Тут приходит заказчик и накидывает инвариант, который захватывает 2 агрегата (т.е. если он был один - было бы лучше под новый кейс) . Перепиливается полсистемы под новый склеенный агрегат или что?
вот давай я тебе приведу пример который вот у меня сча перед глазами. У тебя есть пациенты. У них есть номера (чет типа номера карточки). Номера должны быть уникальными, так? Как проверить что это true invariant?

Для этого стоит придумать или найти кейс когда инвариант в целом не соблюдается. В нашем случае это может быть интеграция с каким-нибудь кол центром или еще какой вариант при котором учетный номер вводят руками а значит мы не можем только по нему искать. Мол для бизнеса дубли лучше чем слинковать не с тем человеком. В этом случае мы можем спокойно применить действие к агрегату, транзакция в этом случае может даже упасть по констрейнту в базе, но мы в этом случае должны это дело захэндлить, добавить какой суфикс к идентификатору и записать информацию о конфликте в отдельную табличку что бы потом администратор руками разрулил конфликт.

Или другой пример - есть система которая позволяет тебе продавать вещи со склада. Вроде есть инвариант что количество проданных айтемов не может быть больше количества айтемов на складе - но для бизнеса внезапно важно трекать ситуации когда "яблок было 10 а продали 11" потому что это хороший индикатор что кто-то ворует.

Мы просто привыкли что можно ебнуть везде констрейтны в базе и вжух все красиво и консистентно. На самом деле реальность куда интереснее и сложнее
источник

ПГ

Павел Г. in Software Design/Architecture/Zen
Sergey Protko
вот давай я тебе приведу пример который вот у меня сча перед глазами. У тебя есть пациенты. У них есть номера (чет типа номера карточки). Номера должны быть уникальными, так? Как проверить что это true invariant?

Для этого стоит придумать или найти кейс когда инвариант в целом не соблюдается. В нашем случае это может быть интеграция с каким-нибудь кол центром или еще какой вариант при котором учетный номер вводят руками а значит мы не можем только по нему искать. Мол для бизнеса дубли лучше чем слинковать не с тем человеком. В этом случае мы можем спокойно применить действие к агрегату, транзакция в этом случае может даже упасть по констрейнту в базе, но мы в этом случае должны это дело захэндлить, добавить какой суфикс к идентификатору и записать информацию о конфликте в отдельную табличку что бы потом администратор руками разрулил конфликт.

Или другой пример - есть система которая позволяет тебе продавать вещи со склада. Вроде есть инвариант что количество проданных айтемов не может быть больше количества айтемов на складе - но для бизнеса внезапно важно трекать ситуации когда "яблок было 10 а продали 11" потому что это хороший индикатор что кто-то ворует.

Мы просто привыкли что можно ебнуть везде констрейтны в базе и вжух все красиво и консистентно. На самом деле реальность куда интереснее и сложнее
Спасибо за развернутые примеры! Но они покрывают кейс, когда инвариант - "не" инвариант, а не про объединение агрегатов. Хотя я что-то не могу придумать пример, когда дейсвтительно надо объединять :)
источник

EE

Evgenii Evgenivich in Software Design/Architecture/Zen
Могу ли 2 агрегата менять одну рид-модель?
источник