powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring. Начало. Наверно будет холивар...
25 сообщений из 159, страница 2 из 7
Spring. Начало. Наверно будет холивар...
    #38186697
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищущий Знания,
Совершенно верно. Перекрестные ссылки надо минимизировать. В этом очень помогает IDE контролируя область видимости классов.
В веб парадигма программирования другая). .Сервлеты это не ООП).
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186709
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищущий Знания,
Совершенно верно. Избавлятся от большого количества перекрестных ссылок на классы надо. И IDE в этом помогает областью видимости. Уж не знаю, понимает ли Оно так же хорошо аннотации.
Но! Десктоп и Веб 2-е большие разницы). В вебе парадигма другая. Сервлет это не ООП. Это короткоживущий код за 0000.1 секунды. Поэтому инжекция как наркотик)
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186711
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс)))). Сам сделал такую ссылку)
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186713
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шарик, поздравляю тебя, ты - балбес. Видимо завести notificationservice избавившись от зависимости от статического EmailUtils (с небось тоже гвоздями прибытыми настройками и темплейтами сообщений) видимо не судьба. ну-ну.
Пример, разумеется, упрощенный.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186714
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищущий ЗнанияАбсолютно везде в инете говорят, что надо использовать спринг как клей для модулей проекта. Но я сколько примеров не видел, они все притянуты за уши и не объясняют а в чем собственно цимес
В чем цимес конкретно спринга или ioc в целом? Если ioc, то хороший пример как не надо привел вумник парой постов выше - в этом примере прекрасно все: и статический метод трансфера средств, делающий невозможным существование более одной реализации, и статический же способ оповещения, так же не дающий никакой возможности в другом месте посылать например вместо мыла смс. К тому же пациент тщетно бьется с проблемой затрудненного тестирования подобного говнокода, при этом авторитетно заявляя, что в ява все равно никто ничего не тестит, проверки на этапе компиляции должно хватить всем, а моки и прочую херню слишком сложно осилить.



Если говорить конкретно о спринге - то тут скорее дела вкуса, почти. Отвлекаясь от того, что в спринге существует огромная инфраструктура по интеграции большинства мыслимых mainstream фреймворков и прочие плюшки, все сводится к тому, нравится ли тебе конфигурация в xml или ты предпочитаешь конфигурацию в коде (тот же спринг, guice, tapestry-ioc). Только под конфигурацией в коде подразумевается нечто вида bind(Service.class).to(MyServiceImpl.class) не new MyServiceImpl() в 10 местах.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186716
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪПример, разумеется, упрощенный.
разумеется
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186720
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в этом примере прекрасно все: и статический метод трансфера средств, делающий невозможным существование более одной реализации, и статический же способ оповещения
Прочитайте пожалуйста мой пост внимательно. Он не о трансфере средств. Это предложение язковой фичи. Пример, иллюстрирующий фичу, надуманный.
и статический же способ оповещения, так же не дающий никакой возможности в другом месте посылать например вместо мыла смс
Все равно придется передавать параметр, как именно слать оповещение, по мылу или по смс. Не вижу разницы между статик и виртуальным методом.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186723
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ведь попытки все и везде в коде сделать динамическим, настраиваемым, подменяемым и есть самое большое зло).
Взять тот же ЕАV .... рефлексию и т.д.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186726
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что в ява все равно никто ничего не тестит, проверки на этапе компиляции должно хватить всем, а моки и прочую херню слишком сложно осилить.

Боюсь, что я не очень понятно изложил свою точку зрения.
что в ява все равно никто ничего не тестит

Я там писал о тестах, в которых класс тестится в полной изоляции. По моим наблюдениям, в яве такое тестирование применяется редко, чаще тестирование делается на уровне полноценных сценариев.
а моки и прочую херню слишком сложно осилить

Так на самом деле сложно. Есть JMock, есть EasyMock, у всех разное API, не особо интуитивное.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186733
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪПрочитайте пожалуйста мой пост внимательно. Он не о трансфере средств. Это предложение язковой фичи.
я понял, к чему был пост. проблема в том, что он является хорошим примером того, как можно было сделать по-другому, чтобы вопроса о тестировании статического метода просто не возникло.


Йуный джавистЪи статический же способ оповещения, так же не дающий никакой возможности в другом месте посылать например вместо мыла смс
Все равно придется передавать параметр, как именно слать оповещение, по мылу или по смс. Не вижу разницы между статик и виртуальным методом.
а она есть. потому что идея не в переопределении метода transfer, а в поручении рассылки отдельному сервису (SRP). будь у нас AccountHelper не статический, и имей он интерфейс NotificationService в качестве зависимости, мы бы поимели кучу профитов, как то:
1) легко делается заглушка для тестирования
2) легко подменяется реализация на рассылку по смс, рассылку на jabber, рассылку на что угодно еще или на все вместе. причем не надо передавать никаких "параметров".
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<!-- код (почти)условный  -->

<!-- определяем базовый тип с некими общими настройками -->
<bean id="abstractNotificationService"/>

<bean id="email" parent="abstractNotificationService">
  <property name="templateEngine" value="htmlEngine/>
</bean>

<bean id="sms" parent="abstractNotificationService">
  <property name="templateEngine" value="plainTextEngine/>
</bean>

<!-- или даже так -->
<bean id="mass" parent="abstractNotificationService">
  <property name="notificationServices">
     <list>
        <value ref="email"/>
        <value ref="sms"/>
     </list>
  </property>
</bean>



далее суем нужные реализации туда куда надо. ЕСЛИ ДАЖЕ у нас например тяжелый случай, когда в одном и том же месте нужно одному клиенту послать смс, а другому мыло (а третий ваще не хочет, чтоб его спамили), то как один из вариантов - сохраняем в настройках для клиента (бд, xml, whatever) имя бина и инстанциируем его по имени (да, здесь является недостатком хранение бина в виде текста, НО это место легко контролируется тестами, т.е. если мы опечатались в имени, на этапе теста мы отловим исключение). После этого оповещение при трансфере РЕАЛЬНО легко меняется извне без модификации кода - просто говорим, что у клиента 234646 при трансфере использовать оповещение jabber. И да, нам для этого нужна другая зависимость, что-то типа NotificationServiceProvider , которая опять же таки в зависимости от реализации может доставать настройки клиента из базы, файла или еще откуда и отдавать нашему AccountHelper ту реализацию нотификаций, что требуется.

3) в сервисе рассылки в свою очередь можно легко обеспечить всевозможную кучу (в том числе локализованных) темплейтов сообщений, тоже например по принципу у каждого клиента свой темплейт.

Да, все тоже самое, можно тем или иным способом реализовать в коде, с большей или меньшей степенью гибкости. именно по-этому - это лишь вопрос предпочтения, где конфигурировать. Ну и естественно, подобное мы наворачиваем только если нам подобная гибкость нужна. Но как минимум - это независимость от реализации как перевода денег, так и оповещений.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186741
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После этого оповещение при трансфере РЕАЛЬНО легко меняется извне без модификации кода - просто говорим, что у клиента 234646 при трансфере использовать оповещение jabber. И да, нам для этого нужна другая зависимость, что-то типа NotificationServiceProvider
Так значит все же с модификацией - новый класс NotificationServiceProvider понадобился. Также хочу отметить, что конфиг спринга - тоже код.
Не понимаю, почему я не могу из статик метода залезть в базу, посмотреть как клиент хочет получить оповещение и в зависимости от этого отправить его по смс или емейлом.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186745
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪЯ там писал о тестах, в которых класс тестится в полной изоляции. По моим наблюдениям, в яве такое тестирование применяется редко, чаще тестирование делается на уровне полноценных сценариев.
т.е. unittest :) . мягко говоря странное наблюдение. ну и собственно говоря, само обобщение довольно смелое. я например довольно часто пишу тесты именно для конкретных классов, потому что тестирование целого тандема часто гораздо более затруднительно, особенно когда веб вовлечен - гораздо проще потестировать дао, чем поднимать джетти и генерить клики в селениуме, хотя естественно одно не заменяет другого полностью.

собственно коль скоро речь пошла про тестирование, то здесь конфигурация в xml очень сильно помогает, потому что можно по тому же принципу, что и организация пакетов в ява, подключить различные комбинации "подмодулей", подсунув например пачке дао ссылку на коннект к тестовой базе. да, с помощью кода можно достигнуть схожего эффекта, если взять за основу понятие модуля, существующee в guice и в tapestry-ioc, ну соответственно разбивать конфигурацию на логические модули и подключать те, что надо.


Йуный джавистЪа моки и прочую херню слишком сложно осилить

Так на самом деле сложно. Есть JMock, есть EasyMock, у всех разное API, не особо интуитивное.
да блин, ну фигли сложного? лично я в свое время взял первое попавшееся (EasyMock) и в 20 минут разобрался с минимумом, необходимым, чтобы тесты работали. главное что выбор есть, а разбираться приходится с чем-то так или иначе. когда нету желания разобраться, все кончается тем, что тестов в итоге просто нет.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186758
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪТак значит все же с модификацией - новый класс NotificationServiceProvider понадобился

вообще-то он понадобился еще в тот момент, когда у нас возникла сама постановка задачи - оповещение настраиваемо под клиента. кроме того, когда подобная гибкость не нужна, а нужно разные реализации в разных местах (ну например мобильные клиенты получают смс, веб-клиенты мыло) - нам бы просто хватило двух реализаций NotificationService, клиентский код бы выглядел едино (зависимость от accounthelper), а сам accounthelper имел мы две "конфигурации". А как тоже самое со статическим методом разрулить, если он у тебя повсюду в коде натыкан? А никак. Search&Replace + Find Usages в руки. Оно понятно, что упорство и труд все переколбасят.

Йуный джавистЪ. Также хочу отметить, что конфиг спринга - тоже код.
в некотором смысле. я предпочитаю "конфигурация". если ты о том, что его придется время от времени модифицировать, то да - придется. но не в том дело. вопрос в том, во скольких местах код/конфигурацию придется модифицировать при каждом изменении задачи.

Йуный джавистЪНе понимаю, почему я не могу из статик метода залезть в базу, посмотреть как клиент хочет получить оповещение и в зависимости от этого отправить его по смс или емейлом.
Хехе...если у тебя в статик методах при вызове происходит поностью "динамическая реконфигурация" (а не то, как это было в примере) - то ты просто сделал аналог предложенной мной системы в коде. Т.е. если у тебя статик метод допускает любое количество внутренних реализаций одновременно. Тогда дело упирается просто в то, кому что удобней. Ну отвлекаясь от очевидных проблем с тестированием (и thread safety до кучи). Разве нет?
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186760
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. unittest :) . мягко говоря странное наблюдение.

В 90% случаев вообще нет никаких тестов. Это понятно - если проект активно развивается, то нет времени писать тесты, все фигачат чтобы как можно скорее выдать новую версию. Если есть время писать тесты, то значит проект вяло идет, и кодовая база медленно прирастает. Так оказывается, что большинство кода без тестов.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186762
Йуный джавистЪ Не понимаю, почему я не могу из статик метода залезть в базу, посмотреть как клиент хочет получить оповещение и в зависимости от этого отправить его по смс или емейлом.

В целом конечно можно. Но ИМХО логичнее и удобнее делать 1 класс = 1 действие.
Да и тестить и править такой код проще.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186769
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪт.е. unittest :) . мягко говоря странное наблюдение.

В 90% случаев вообще нет никаких тестов. Это понятно - если проект активно развивается, то нет времени писать тесты, все фигачат чтобы как можно скорее выдать новую версию.
бывает. лично я тоже часто дописываю тесты уже потом, когда есть время, или наступил в каком-то месте на грабли. Если честно, я уже перестал даже считать, сколько раз они меня выручали. а есть пару мест, в которых без тестов вообще нереально проверить правильность работы. оно понятно, что обстоятельства часто сильнее нас. просто некоторые как-то пытаются с этим бороться, а другие прячутся за "у нас не было времени". а чаще всего просто лень.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186770
chpashaДа, все тоже самое, можно тем или иным способом реализовать в коде, с большей или меньшей степенью гибкости. именно по-этому - это лишь вопрос предпочтения, где конфигурировать. Ну и естественно, подобное мы наворачиваем только если нам подобная гибкость нужна. Но как минимум - это независимость от реализации как перевода денег, так и оповещений.

Вот спасибо. Отличный пример. Хоть какая-то приближенность к реальности.
Что-то начало в голове "щелкать" по поводу применения спринга...
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186775
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищущий ЗнанияХоть какая-то приближенность к реальности
что значит хоть какая-то? основано на реальных событиях ;)
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186776
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторкроме того, когда подобная гибкость не нужна, а нужно разные реализации в разных местах (ну например мобильные клиенты получают смс, веб-клиенты мыло)
А откуда берется признак того, мобильный это клиент или веб? Если признак приходит как аргумент в AccountHelper, то AccountHelper может просто передать этот аргумент в статик функцию оповещения.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186782
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то начало в голове "щелкать" по поводу применения спринга...
Доказательство что спринг не нужен:
1)Берете свой application.xml
2)Объявляете класс с названием Application.java. Для каждого бина в application.xml создаете одноименное поле в этом классе и инициализируете его вызовом конструктора с теми же параметрами как в application.xml
3)Другие классы не меняются.
4)Удаляете спринг из проекта.
Таким образом проведен рефакторинг, который доказывает ненужность спринга.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186787
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪавторкроме того, когда подобная гибкость не нужна, а нужно разные реализации в разных местах (ну например мобильные клиенты получают смс, веб-клиенты мыло)
А откуда берется признак того, мобильный это клиент или веб? Если признак приходит как аргумент в AccountHelper, то AccountHelper может просто передать этот аргумент в статик функцию оповещения.
та не, забудь ты про признаки, флаги и параметры. accounthelper это сервис, который делегирует две "ответственности" двум другим сервисам, и оперирует он только теми данными, что нужны непосредственно для выполнения операций. Дальше мы в коде мобильного клиента или вебе или еще где инжектируем (уж как хотите, через код или спринг) разные конфигурации того же самого accounthelper, только в одной рассылкой занимается смс, а другой мыло.
пример для понимания
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
опять таки условный, без привязки к ioc

public WebPage {
   
   @Inject
   private AccountHelper accountHelper;

}

public MobilePage {
  
   @Inject
   private AccountHelper accountHelper;

}

public CronJob {

   @Inject
   private AccountHelper accountHelper;

}



конфигурация

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<bean id="accountHelper" p:accountTransfer="someImpl"/>

<bean id="accountHelperForWeb" parent="accountHelper"
         p:notificationService="sms"/>

<bean id="accountHelperForMobile" parent="accountHelper"
         p:notificationService="email"/>

<bean id="accountHelperForCron" parent="accountHelper"
         p:notificationService="jabber"/>



далее тем или иным удобным для нас способом подсовываем клиентскому коду одну из конфигураций. нетрудно догадаться, что в некоторых из них можно подменить не только реализацию нотификации, но и реализацию трансфера. это способ организации "динамического" поведения, когда имеем конечное количество комбинаций, и нет привязки к каким-то настройкам. Впрочем позже можно будет легко переставить на настройки.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186790
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем спор епта?
ТС просто пока не разобрался чем ему поможет Ioc, как только он это сделает, все вопросы отпадут. Будь то спринг джус и т.п.
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186791
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
<bean id="accountHelperForWeb" parent="accountHelper"
         p:notificationService="sms"/>

<bean id="accountHelperForMobile" parent="accountHelper"
         p:notificationService="email"/>

<bean id="accountHelperForCron" parent="accountHelper"
         p:notificationService="jabber"/>


Смотри, account helper скорее всего нужен как часть какого нибудь TransactionHelper. TransactionHelper тоже будет существовать в трех ипостасях: transactionHelperForWeb, transactionHelperForCron, accountHelperForMobile?
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186794
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪТаким образом проведен рефакторинг
и мы написали свой google guice, с чем всех и поздравляю (правда куча вопросов осталась за бортом, например scope создаваемых объектов, и как эту конфигурацию частично переиспользовать в тестах, заменив во всех созданных дао один коннект другим. но в конце концов пофиг - первый блин комом).

пора определиться, либо мы в принципе против ioc, либо нам конкретно спринг не нравится. Вот Петру например конкретно спринг не нравится, он на него как красная тряпка действует, даже сильней чем hibernate. в остальном это чисто дело вкуса - вот я когда-то с леонидом спорил, ему описание интерфейса в ява коде нравится, а я предпочитаю xml/html
...
Рейтинг: 0 / 0
Spring. Начало. Наверно будет холивар...
    #38186796
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В больших проектах спринг-конфигурация ещё позволяет создать отдельный тип должности и область ответственности, кстати.
...
Рейтинг: 0 / 0
25 сообщений из 159, страница 2 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring. Начало. Наверно будет холивар...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]