@jvmchat

Страница 2604 из 2890
Андрей
28.06.2018
12:10:20
и это не вещь в себе

это тупо набор правил, которые помогают поддерживать enterprise проекты

которые появились в результате познания боли от их невыполнения

Диоген
28.06.2018
12:11:14
Ну то есть что - SOLID не нужен, да?
ваш SOLID нарушает мой YAGNI

Google
Tolegen
28.06.2018
12:11:28
Это о том, что писать надо вдумчиво. Нужно уметь видеть, где какой принцип нарушается и осознавать ради чего. Хорошо ещё коммент добавлять, что сделано именно таким образом потому, что так выгоднее в производительности или есть такое-то ограничение в текущей архитектуре.

Sergey
28.06.2018
12:12:02
не нужно доводить до абсурда эти понятия
Не нужно врать. SOLID по "Clean architecture" описан совершенно не так как его описывают левые люди цитируя википедию. В википедии эти пять букв оторваны от реальности и перевраны сообществом, в книге четко изложено что такое SOLID и почему неследование SOLIDу ведет к болям в поддержке. Иньекции через autowired - не SOLID. В итоге мы и лабаем не солид - редко когда контракт сервиса имеет более одной имплементации. Редко когда сервис действительно сингл-респонсибл. Со временем это почти всегда вырождается в говнище по 100500 строк, когда заказчики начинают менять требования и внезапно абстракции теряют стабильность. И я бы рад увидеть исключение из правил, но не вижу нигде.

Диоген
28.06.2018
12:14:12
Почему?
Ну это была полушутка, но с долей правды.

Вот если бы чел щас привел пример, где сприговское нарушение солида усадиживает людей на бутылку, было бы другое дело

Tolegen
28.06.2018
12:16:04
Ну и не нужно воспринимать эти рекомендации как абсолют. Всегда будут трейдоффы. Где какой трейдофф делать и когда приходит с опытом. В любом случае полезно прикидывать свой код на эти принципы и понимать, почему делается именно так и почему делать так не стоит и какие последствия каждое решение будет иметь.

Sergey
28.06.2018
12:16:13
Какой именно пункт SOLID нарушает иъекции autowired через конструктор?
Ну че мне - весь тред заново пересказывать? я процитировал свой мессаг, от него вверх можно пойти.

Tolegen
28.06.2018
12:17:27
Вот если бы чел щас привел пример, где сприговское нарушение солида усадиживает людей на бутылку, было бы другое дело
Примеры спрятаны в куча корпоративного приватного кода) вообще тяжело приводить их, так как каждая ситуация по своему уникальна. Где-то одно, где-то другое. Вырвешь из контекста и пример уже не будет иметь смысл.

Sergey
28.06.2018
12:17:29
зачем, просто букву назови
Называл уже, повторяться не буду. Не надо на меня тут этих демагогских приемов.

Tolegen
28.06.2018
12:18:13
По моему опыту класс с именем Service в том или ином виде обычно превращается в солянку из процедур.

Google
Tolegen
28.06.2018
12:18:29
С ифами и запутанной логикой

Sergey
28.06.2018
12:18:58
С ифами и запутанной логикой
И тут самое время позвать на помощь капитана рефакторинг!

Таир
28.06.2018
12:19:20
вообще, этот СОЛИД и понимание его вызывают много споров, что уже само по себе вызывает сомнения

Sergey
28.06.2018
12:19:33
If-метрика тут отлично работает кстати

Таир
28.06.2018
12:20:14
пока СОЛИДность нельзя оценить программно, споры не прекратятся

Tolegen
28.06.2018
12:20:21
И тут самое время позвать на помощь капитана рефакторинг!
Ну да) мы все себе так и говорим, что потом зарефакторим. А потом оказывается, что это не так просто и уже многие вещи завязались именно на имплементацию именно в таком виде.

Диоген
28.06.2018
12:20:27
Таир
28.06.2018
12:21:03
ты написал 79 символов, а мог бы написать 1.
там выше по треду O, L и D кажется упоминались

Sergey
28.06.2018
12:21:19
Ну да) мы все себе так и говорим, что потом зарефакторим. А потом оказывается, что это не так просто и уже многие вещи завязались именно на имплементацию именно в таком виде.
Ну хотя бы подробный комментарий надо оставить))) вообще конечно без покрытия хорошего тестами что то очень сложно

Sergey
28.06.2018
12:21:28
ты написал 79 символов, а мог бы написать 1.
В исходном мессаге я писал 3 буквы - редко вообще можно увидеть наршения солид поодиночке. Без аргументации эти буквы не значат ничего, поэтому ответ прежний - повторяться не буду

Sergey
28.06.2018
12:21:53
Слава богу у нас покрытие позволяет и никто не рвет глотку в погоне за скоростью.

Митко Соловец?
28.06.2018
12:23:00
ребят

срач ни о чем

@skapral тебе бан в следующий раз за разжигание на пустом месте

Shumilin
28.06.2018
12:23:32
Больше 1к сообщений за сутки не прочитанных)) =

Vit
28.06.2018
12:24:00
Вчера эклипс фотон выпустили

Oleksandr
28.06.2018
12:25:04
а обсудили уже, с какого конца яйца разбивать?

1337
28.06.2018
12:25:26
а обсудили уже, с какого конца яйца разбивать?
разве не ножом по середине? (я серьезно)

Google
Tolegen
28.06.2018
12:26:23
Хайлатни сообщение, про нарушение LSP. Я ваш срач пропустил, но мне правда интересно прочитать.
Оно нарушается тем, что по дефолту спрингом предполагается только один класс, имплементирующий интерфейс. Получается, что интерфейс используется просто чтобы он был. Отсюда растут ноги у названий классов типа SomeServiceImpl.

Sergey
28.06.2018
12:26:28
Хайлатни сообщение, про нарушение LSP. Я ваш срач пропустил, но мне правда интересно прочитать.
Ладно, хрен с ним. LSP утверждает что если компонент использует базовый тип S, то он должен работать as-designed со всеми подтипами T от S. Но так как autowiredу у спринга надо знать что конкрентно нужно инжектить в конструктор, просто оставить аргумент базового типа в конструкторе не получится. Это агитирует к двум вещам - либо завязать конструктор на имплементацию и/или дав ему конкретное имя и тип - что херит LSP (мы не можем больше реюзать сервис с произвольными подтипами), либо держать в контексте всегда одну имплементацию, чтоб уж спринг точно ничего не попутал. Доходит до того что некоторые блоггеры утверждают что интерфейсы не нужны. Один хер - больше одной имплементации никогда не будет

Oleksandr
28.06.2018
12:26:54
разве не ножом по середине? (я серьезно)
это сложный вопрос согласно докрине CLEAN, это может привести к неподдерживемому состоянию яйца, и, как следствие, повышает риск провала проекта

Берял
28.06.2018
12:27:27
Денис
28.06.2018
12:27:53
и вареное тоже?
Смотря насколько солидно варёное

Берял
28.06.2018
12:28:13
1337
28.06.2018
12:28:47
и вареное тоже?
нет, у меня не меняется состояние объекта Яйцо со скорлупой

Берял
28.06.2018
12:29:22
нет, у меня не меняется состояние объекта Яйцо со скорлупой
так это другой объект, Вареное Яйцо со скорлупой

Oleksandr
28.06.2018
12:29:26
Cargeh
28.06.2018
12:30:36
так это другой объект, Вареное Яйцо со скорлупой
Ребята, это разные объекты. new Boiled( new Shell( new Egg( ) ) )

Денис
28.06.2018
12:31:00
Konstantin
28.06.2018
12:31:21
вам за это наверное еще по 5+к бачей в месяц платят

)))

Денис
28.06.2018
12:31:40
)))
Лиспер в чате, расходимся.

Берял
28.06.2018
12:31:42
Зачем ты варишь скорлупу?
а по солиду какая хрен разница что варить

Oleksandr
28.06.2018
12:31:57
вам за это наверное еще по 5+к бачей в месяц платят
у меня отмазка — скала компилится

Sergey
28.06.2018
12:31:58
Интерфейс же Boilable

Берял
28.06.2018
12:32:07
у меня отмазка — скала компилится
сбт резолвит зависимости

Oleksandr
28.06.2018
12:32:17
сбт резолвит зависимости
это следующий прием

Google
Диоген
28.06.2018
12:32:46
Ладно, хрен с ним. LSP утверждает что если компонент использует базовый тип S, то он должен работать as-designed со всеми подтипами T от S. Но так как autowiredу у спринга надо знать что конкрентно нужно инжектить в конструктор, просто оставить аргумент базового типа в конструкторе не получится. Это агитирует к двум вещам - либо завязать конструктор на имплементацию и/или дав ему конкретное имя и тип - что херит LSP (мы не можем больше реюзать сервис с произвольными подтипами), либо держать в контексте всегда одну имплементацию, чтоб уж спринг точно ничего не попутал. Доходит до того что некоторые блоггеры утверждают что интерфейсы не нужны. Один хер - больше одной имплементации никогда не будет
Лан, я мб тупой, но принцип говорит только о том, шо везде где ждут батю, можно отправить сыну-корзину. И вы действительно можете подсунуть туда любую имплементацию. А то как спринг уже их подсовывает туда и то шо их там больше, чем один - это уже другое дело.

Не увидел нарушения принципа, в общем, соре.

Берял
28.06.2018
12:34:14
а аннотации это просто метаинформация

Sergey
28.06.2018
12:36:38
Лан, я мб тупой, но принцип говорит только о том, шо везде где ждут батю, можно отправить сыну-корзину. И вы действительно можете подсунуть туда любую имплементацию. А то как спринг уже их подсовывает туда и то шо их там больше, чем один - это уже другое дело.
Проводя вашу аналогию дальше, спринг в autowired конструктор будет инжектить только если 1) Сын один 2) Вместо бати в объявлении конструктора будет сын 3) Аттрибут типа батя будет аннотирован какими нибудь квалифаерами, которые скажут спрингу - кто конкретно сын. И говорить, что это вовсе не каплинг одной конкретики (сервиса куда инжектят) на другую (сыновей) - врать самому себе.

Tolegen
28.06.2018
12:37:17
вот именно, мало ли что там в аннотации написано, если по факту туда можно подсунуть любую имплементацию интерфейса и код будет работать. значит ничего не нарушено
Он нарушается косвенно. В спринге интерфейс для галочки из-за того, что ему нужно знать, какую именно имплементацию вставлять. И зачастую имплементация только одна. Получается жесткая связность компонентов. Ты прав, можно иметь несколько имплементаций, но большой шанс того, что компонент завязан на одну конкретную имплементацию.

Admin
ERROR: S client not available

Oleg
28.06.2018
12:37:57
Отец - сын - это не очень метафора, потмоу что class Batja extends Son, а интуитивно кажется по-другому

Tolegen
28.06.2018
12:38:15
То есть тот факт, что вы объявили интерфейс и зависите от него не значит, что вы уменьшили связность.

Sergey
28.06.2018
12:38:23
Вы забыли про @Primary
Та же проблема что и с квалифаерами

Oleg
28.06.2018
12:38:43
ваще наоборот
почему? сын шире и умеет больше чем отец?

Диоген
28.06.2018
12:39:10
почему? сын шире и умеет больше чем отец?
Ну, ваще эволюционно предполагается, шо да. Но давайте хотя бы об этом не будем спорить.

Sergey
28.06.2018
12:40:48
почему? сын шире и умеет больше чем отец?
Чисто из предметной логики

Vit
28.06.2018
12:41:41
Почему молчат спрингосиляторы ?

Диоген
28.06.2018
12:42:11
Проводя вашу аналогию дальше, спринг в autowired конструктор будет инжектить только если 1) Сын один 2) Вместо бати в объявлении конструктора будет сын 3) Аттрибут типа батя будет аннотирован какими нибудь квалифаерами, которые скажут спрингу - кто конкретно сын. И говорить, что это вовсе не каплинг одной конкретики (сервиса куда инжектят) на другую (сыновей) - врать самому себе.
Вообще, нет. У спринга в кунтейнере много подвидов бати. И любой из подвидов он может подставить туда, где ожидают батю. Это соблюдение лсп. А то шо спринг для определения, которого из батиных отпрысков куда отпавить, использует метаинформацию, это уже не связано с ЛСП.

Sergey
28.06.2018
12:42:19
Почему молчат спрингосиляторы ?
Они спорят что первично - сын или отец

Google
Диоген
28.06.2018
12:42:39
О чем молчат спрингоосиляторы?

1337
28.06.2018
12:43:10
О чем молчат спрингоосиляторы?
нет времени на болтовню, аннотировать нужно

1337
28.06.2018
12:43:59
пропустишь аннотацию, бин не провалидируется – лишат дневного пайка

Диоген
28.06.2018
12:44:11
Просто по вашей же логике, Сергей, явная передача любого настоящего аргумента в любой конструктор это нарушение ЛСП, так как туда в конечном итоге передается какая-то конкретная сущность. >И говорить, что это вовсе не каплинг одной конкретики (сервиса куда инжектят) на другую (сыновей) - врать самому себе.

Собственно, чтобы не нарушать ЛСП, лучше не использовать.. конструкторы?

Диоген
28.06.2018
12:44:41
Или джява? Или ди?

Денис
28.06.2018
12:44:46
Еще как связано. Или как вы будете реюзать сервис с разными подбатями в спринге, если метаинфа в аннотациях как правило статична?
Если вам нужно реюзать сервис с разными подбатями, вы напишете джава-конфиг, который умеет выбирать бины в зависимости от конфигурации, нет?

Диоген
28.06.2018
12:45:46
Не передача. А указание деталей "что конкретно инжектить" в декларации.
Относитесь к декларации как к коду, не относящему с реализации, коим он и не является.

Денис
28.06.2018
12:46:03
Супер. Но зачем мне для этого спринг если я могу просто юзать new?
Потому что зависимостей может быть больше, чем одна, а спринг в общем-то на DI не заканчивается?

Диоген
28.06.2018
12:46:06
Вы в любом случае хоть спрингом, хоть еще как будете эти сущности создавать.

зачем такие сложности? есть же оператор new
Ну ваще предполагается, шо это наоборот упрощение

Sergey
28.06.2018
12:47:15
Относитесь к декларации как к коду, не относящему с реализации, коим он и не является.
И что мне это даст с практической точки зрения? Без спринга я могу реюзать один раз написанный конструктор до посинения, со спрингом мне придется писать больше кода "не относящегося к реализации".

Ilia
28.06.2018
12:47:20
я думал этот спор вчера угас...

Sergey
28.06.2018
12:47:54
Вы в любом случае хоть спрингом, хоть еще как будете эти сущности создавать.
Буду. Но без спринга я буду делать это в клиенте, а не в оунере. Оунер останется чист.

Денис
28.06.2018
12:48:23
И что мне это даст с практической точки зрения? Без спринга я могу реюзать один раз написанный конструктор до посинения, со спрингом мне придется писать больше кода "не относящегося к реализации".
А без спринга придётся прописать всё, что относится к исходной инициализации, и сложность расширения этой конфигурации будет, как по мне, расти куда быстрее при разрастании проекта, нежели чем со спрингом.

Tolegen
28.06.2018
12:50:01

Страница 2604 из 2890