Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Почему надо использовать DI вместо статической ссылки на Main класс ?

Какие-то вы слишком глупые. Я вам одно - вы (hyndorik, MrMagaChannel, ты) мне другое; я отрицаю, что обязательно проект должен соблюдать эти принципы, но не говорю, что это плохо;

Я абсолютно нейтрален к тому, что на некоторых проектах требуется соблюдения некоторых принципов; форматирования кода.

По себе людей не судят. Тебя же я лицом тыкал в то, что у тебя все главное в одном пекейдже .-.
Псс, братишь, инкапсуляция, да, слышал? На пакеты раскладывают все по логическим составляющим проекта. Походу вообще никогда на нормальные проекты не смотрел. Советую тебе открыть хотя бы guava какой-нибудь и заглянуть в какой-нибудь из пекейджов например - com.google.common.collect, инкапсуляции принцип даже не понимаешь.

я отрицаю, что обязательно проект должен соблюдать эти принципы, но не говорю, что это плохо
Ну да - все правильно, проект не обязан соблюдать эти принципы, но без них архитектура говно получается(
 
Псс, братишь, инкапсуляция, да, слышал? На пакеты раскладывают все по логическим составляющим проекта. Походу вообще никогда на нормальные проекты не смотрел. Советую тебе открыть хотя бы guava какой-нибудь и заглянуть в какой-нибудь из пекейджов например - com.google.common.collect, инкапсуляции принцип даже не понимаешь.
Ты хочешь сказать, что у тебя все 26 классов связаны логически между собой? SessionResolver <-> ItemStackBuilder - какая между ними связь?

В целом, я присмотрелся, а оказалось, что у тебя просто почти на каждый класс существует интерфейс, который используется 1 раз. Если закинуть все интерфейсы в пакет impl, а билдеры в builders/соответствующие классы (хз), то все-бы сразу стало видным :/
 
Ты хочешь сказать, что у тебя все 26 классов связаны логически между собой? SessionResolver <-> ItemStackBuilder - какая между ними связь?

В целом, я присмотрелся, а оказалось, что у тебя просто почти на каждый класс существует интерфейс, который используется 1 раз. Если закинуть все интерфейсы в пакет impl, а билдеры в builders/соответствующие классы (хз), то все-бы сразу стало видным :/
Ну интерфейсы если че много используются) И как ты представляешь себе делать нормальную инкапсуляцию при таком разделение на пакеты?)
 
Хз, хз... Смотря о чем ты говоришь)
Ну например MenuItemBuilder и SessionResolverImpl имеют конструктор package private и инициализируются через фактори обджект MenuApiInstance, если я запихну MenuItemBuilder в отдельный пекедж типо builder, ему придется делать паблик конструктор, а я в своем апи хочу иметь на будущее прослойку через MenuApiInstance, так что такое разделение хреновенько будет
 
Вся соль вообще в том что сам по себе JavaPlugin - синглтон, потому вполне логично для него иметь метод getInstance(). И этот getInstance() нужен как раз-таки для взаимодействия с Bukkit API в некоторых местах.
Да, передавать через DI инстанс текущего плагина удобно для шаринга кода между проектами, когда у тебя есть общяя кодовая база, но на самом деле таких плагинов меньшинство. С другой стороны обычно тогда общее ядро выделяют в отдельный плагин со своим API. (MinigamesLib, MassiveCore, ProtocolLib, etc...).
 
Вся соль вообще в том что сам по себе JavaPlugin - синглтон, потому вполне логично для него иметь метод getInstance(). И этот getInstance() нужен как раз-таки для взаимодействия с Bukkit API в некоторых местах.
Да, передавать через DI инстанс текущего плагина удобно для шаринга кода между проектами, когда у тебя есть общяя кодовая база, но на самом деле таких плагинов меньшинство. С другой стороны обычно тогда общее ядро выделяют в отдельный плагин со своим API. (MinigamesLib, MassiveCore, ProtocolLib, etc...).
Честно говоря не совсем понимаю смысловую нагрузку от твоего комента. Что ты призываешь использовать? Со стороны TDD подход через getInstance всегда плох. DI всегда значительно облегчает поддержку кода. Ну и тут вообще не понятно в каком контексте ты говоришь об синглтоне. Имея ioc container метод инстенса иметь совсем не обязательно, при этом он будет оставаться синглтоном, ну кнч со своими особенностями взависимости от контейнера
 
Ну слушай, если ты отрицаешь мое утверждение, которое полностью расписано в статье, то хотя бы приведи примеры затруднения поддержки кода при использовании DI. А то немного смешно получается, если читать твое сообщение
 
Честно говоря не совсем понимаю смысловую нагрузку от твоего комента. Что ты призываешь использовать? Со стороны TDD подход через getInstance всегда плох. DI всегда значительно облегчает поддержку кода. Ну и тут вообще не понятно в каком контексте ты говоришь об синглтоне. Имея ioc container метод инстенса иметь совсем не обязательно, при этом он будет оставаться синглтоном, ну кнч со своими особенностями взависимости от контейнера
Смысловая нагрузка простая - если весь плагин это 1000 строк, то смысла от всех этих энтерпрайзных методов разработки никакого. Для плагина такого размера и тесты то не пишут, и тз зачастую существует на уровне головы одного человека. Потратишь больше времени на написание обвязки чем на сам плагин. А таких плагинов 99% от всех плагинов.
А для автоинъекции надо контейнер для начала иметь, а его внезапно в бакките нет, а тащить с собой - тебя за 10мб библиотек с говном сожрут.
 
Смысловая нагрузка простая - если весь плагин это 1000 строк, то смысла от всех этих энтерпрайзных методов разработки никакого. Для плагина такого размера и тесты то не пишут, и тз зачастую существует на уровне головы одного человека. Потратишь больше времени на написание обвязки чем на сам плагин. А таких плагинов 99% от всех плагинов.
А для автоинъекции надо контейнер для начала иметь, а его внезапно в бакките нет, а тащить с собой - тебя за 10мб библиотек с говном сожрут.
Ну необязательно же спринг тащить) Есть guice - он весит около 0.7мб. Да и был еще вообще ультра легковесный какой-то около 0.2мб. Ну кнч на хеллоу ворлд контейнеры тащить смысла нет. Ну а если вообще в коде больше 1000 строк, то толк от юзания TDD подхода будет, так как проект скорее всего хоть как-то вырастет. Ну и вообще для меня даже мелкие плагины приятнее и быстрее писать с DI, ну и с подходом TDD. Да и DI так-то не энтерпрайзная фича, а юзается везде) Написание конструктора вместо создания статической ссылки почти никакого времени при разработке не отнимает, но сразу приучает правильно думать. А то человек постепенно пишет проекты больше чем хелоу ворлды, а архитектура остается на уровне хелоу ворлдов. Ну и я вообще для большинства своих проектов пишу тесты, банально даже из-за того, что лень сервер запускать, финальный тест в майне и он почти всегда корректно работает с первого раза
 
Ну необязательно же спринг тащить) Есть guice - он весит около 0.7мб. Да и был еще вообще ультра легковесный какой-то около 0.2мб. Ну кнч на хеллоу ворлд контейнеры тащить смысла нет. Ну а если вообще в коде больше 1000 строк, то толк от юзания TDD подхода будет, так как проект скорее всего хоть как-то вырастет. Ну и вообще для меня даже мелкие плагины приятнее и быстрее писать с DI, ну и с подходом TDD. Да и DI так-то не энтерпрайзная фича, а юзается везде) Написание конструктора вместо создания статической ссылки почти никакого времени при разработке не отнимает, но сразу приучает правильно думать. А то человек постепенно пишет проекты больше чем хелоу ворлды, а архитектура остается на уровне хелоу ворлдов. Ну и я вообще для большинства своих проектов пишу тесты, банально даже из-за того, что лень сервер запускать, финальный тест в майне и он почти всегда корректно работает с первого раза
1000 строк может быть и вполне законченным плагином, у меня на гитхабе таких вагон и маленькая тележка.
Так то да, при написании большого проекта нормальное ТЗ, тесты, билдсистема, конвенкция кода и форматирования мастхэв. Но тут бы для начала людей бы просто отучить абсолютно всё в статики засовывать, и вообще чтобы хоть какое-то понятие ООП было.

Вообще ноги getInstance() в бакките растут из-за того что для шедулера и регистрации эвентов нужна ссылка на плагин, и зачастую тащить ссылки через череду объектов вообще не сдалось, а автоинжект будет тормозить ибо рефлексия.
 
Вообще ноги getInstance() в бакките растут из-за того что для шедулера и регистрации эвентов нужна ссылка на плагин, и зачастую тащить ссылки через череду объектов вообще не сдалось, а автоинжект будет тормозить ибо рефлексия.
При правильной архитектуре объектам редко будет нужно запускать шедуляр, а только каким-то управляющим классам.
А вообще уж лучше сделать:
public static Plugin asPlugin() {
return instance;
}
И тем самым передавать только Plugin, а не MyCustomPlugin в котором много лишнего, что не нужно знать этому объекту. В любом случае и этот способ параша, но получше, чем getInstance().
 
Вот даже шечик, топовый кодер понимает какой бред в этой теме пишут. Геймовер.
 
1000 строк может быть и вполне законченным плагином, у меня на гитхабе таких вагон и маленькая тележка.
Так то да, при написании большого проекта нормальное ТЗ, тесты, билдсистема, конвенкция кода и форматирования мастхэв. Но тут бы для начала людей бы просто отучить абсолютно всё в статики засовывать, и вообще чтобы хоть какое-то понятие ООП было.

Вообще ноги getInstance() в бакките растут из-за того что для шедулера и регистрации эвентов нужна ссылка на плагин, и зачастую тащить ссылки через череду объектов вообще не сдалось, а автоинжект будет тормозить ибо рефлексия.
Ну контейнер и на асм может быть, тем более в пепере сразу ведь асм зашарен. Ну и вот насчет отучить людей, здесь как раз таки в теме приводятся минусы заюзывания такого. Тащить через череду объектов в большинстве случаев не надо, если нормально реализованы фабрики, да и уж создать конструктор нажав реальную одну кнопку в интелии не так уж и сложно, потратив на это на 1мс больше.
Вот даже шечик, топовый кодер понимает какой бред в этой теме пишут. Геймовер.
Ну ты походу тему вообще не читал)
 
Вот даже шечик, топовый кодер понимает какой бред в этой теме пишут. Геймовер.
Тут не бред написан в общем-то. Очень даже полезные советы, но очень плохо расписаны плюсы и минусы такого подхода. Написанное здесь стоит взять на заметку людям которые пишут огромные плагины. У меня тоже есть некоторые плагины в которых бы контейнер с депенденси менеджментом ой как бы пригодился, но так как я уже сделал всё херово, то перепысывать ни сил ни времени.
 

Поделиться этой страницей

Назад
Верх