1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем hyndorik, 8 май 2018.

  1. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

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

    Ну да - все правильно, проект не обязан соблюдать эти принципы, но без них архитектура говно получается(
     
  2. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Ты хочешь сказать, что у тебя все 26 классов связаны логически между собой? SessionResolver <-> ItemStackBuilder - какая между ними связь?

    В целом, я присмотрелся, а оказалось, что у тебя просто почти на каждый класс существует интерфейс, который используется 1 раз. Если закинуть все интерфейсы в пакет impl, а билдеры в builders/соответствующие классы (хз), то все-бы сразу стало видным :/
     
  3. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну интерфейсы если че много используются) И как ты представляешь себе делать нормальную инкапсуляцию при таком разделение на пакеты?)
     
  4. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Хз, хз... Смотря о чем ты говоришь)
     
  5. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну например MenuItemBuilder и SessionResolverImpl имеют конструктор package private и инициализируются через фактори обджект MenuApiInstance, если я запихну MenuItemBuilder в отдельный пекедж типо builder, ему придется делать паблик конструктор, а я в своем апи хочу иметь на будущее прослойку через MenuApiInstance, так что такое разделение хреновенько будет
     
  6. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Хорошо сказано. Не могу больше придраться к структуре. Ну ок!
     
  7. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Вся соль вообще в том что сам по себе JavaPlugin - синглтон, потому вполне логично для него иметь метод getInstance(). И этот getInstance() нужен как раз-таки для взаимодействия с Bukkit API в некоторых местах.
    Да, передавать через DI инстанс текущего плагина удобно для шаринга кода между проектами, когда у тебя есть общяя кодовая база, но на самом деле таких плагинов меньшинство. С другой стороны обычно тогда общее ядро выделяют в отдельный плагин со своим API. (MinigamesLib, MassiveCore, ProtocolLib, etc...).
     
  8. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Честно говоря не совсем понимаю смысловую нагрузку от твоего комента. Что ты призываешь использовать? Со стороны TDD подход через getInstance всегда плох. DI всегда значительно облегчает поддержку кода. Ну и тут вообще не понятно в каком контексте ты говоришь об синглтоне. Имея ioc container метод инстенса иметь совсем не обязательно, при этом он будет оставаться синглтоном, ну кнч со своими особенностями взависимости от контейнера
     
  9. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    Не всегда.
     
  10. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну слушай, если ты отрицаешь мое утверждение, которое полностью расписано в статье, то хотя бы приведи примеры затруднения поддержки кода при использовании DI. А то немного смешно получается, если читать твое сообщение
     
  11. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Смысловая нагрузка простая - если весь плагин это 1000 строк, то смысла от всех этих энтерпрайзных методов разработки никакого. Для плагина такого размера и тесты то не пишут, и тз зачастую существует на уровне головы одного человека. Потратишь больше времени на написание обвязки чем на сам плагин. А таких плагинов 99% от всех плагинов.
    А для автоинъекции надо контейнер для начала иметь, а его внезапно в бакките нет, а тащить с собой - тебя за 10мб библиотек с говном сожрут.
     
  12. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну необязательно же спринг тащить) Есть guice - он весит около 0.7мб. Да и был еще вообще ультра легковесный какой-то около 0.2мб. Ну кнч на хеллоу ворлд контейнеры тащить смысла нет. Ну а если вообще в коде больше 1000 строк, то толк от юзания TDD подхода будет, так как проект скорее всего хоть как-то вырастет. Ну и вообще для меня даже мелкие плагины приятнее и быстрее писать с DI, ну и с подходом TDD. Да и DI так-то не энтерпрайзная фича, а юзается везде) Написание конструктора вместо создания статической ссылки почти никакого времени при разработке не отнимает, но сразу приучает правильно думать. А то человек постепенно пишет проекты больше чем хелоу ворлды, а архитектура остается на уровне хелоу ворлдов. Ну и я вообще для большинства своих проектов пишу тесты, банально даже из-за того, что лень сервер запускать, финальный тест в майне и он почти всегда корректно работает с первого раза
     
  13. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    1000 строк может быть и вполне законченным плагином, у меня на гитхабе таких вагон и маленькая тележка.
    Так то да, при написании большого проекта нормальное ТЗ, тесты, билдсистема, конвенкция кода и форматирования мастхэв. Но тут бы для начала людей бы просто отучить абсолютно всё в статики засовывать, и вообще чтобы хоть какое-то понятие ООП было.

    Вообще ноги getInstance() в бакките растут из-за того что для шедулера и регистрации эвентов нужна ссылка на плагин, и зачастую тащить ссылки через череду объектов вообще не сдалось, а автоинжект будет тормозить ибо рефлексия.
     
  14. MrMagaChannel

    MrMagaChannel Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mrmagachannel
    При правильной архитектуре объектам редко будет нужно запускать шедуляр, а только каким-то управляющим классам.
    А вообще уж лучше сделать:
    public static Plugin asPlugin() {
    return instance;
    }
    И тем самым передавать только Plugin, а не MyCustomPlugin в котором много лишнего, что не нужно знать этому объекту. В любом случае и этот способ параша, но получше, чем getInstance().
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Вот даже шечик, топовый кодер понимает какой бред в этой теме пишут. Геймовер.
     
  16. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    А что сам шевчик может сказать по этой теме?
     
  17. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Да вроде все сказал выше он.
     
  18. Автор темы
    hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну контейнер и на асм может быть, тем более в пепере сразу ведь асм зашарен. Ну и вот насчет отучить людей, здесь как раз таки в теме приводятся минусы заюзывания такого. Тащить через череду объектов в большинстве случаев не надо, если нормально реализованы фабрики, да и уж создать конструктор нажав реальную одну кнопку в интелии не так уж и сложно, потратив на это на 1мс больше.
    Ну ты походу тему вообще не читал)
     
  19. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    а, я прост не читал всю тему
     
  20. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Тут не бред написан в общем-то. Очень даже полезные советы, но очень плохо расписаны плюсы и минусы такого подхода. Написанное здесь стоит взять на заметку людям которые пишут огромные плагины. У меня тоже есть некоторые плагины в которых бы контейнер с депенденси менеджментом ой как бы пригодился, но так как я уже сделал всё херово, то перепысывать ни сил ни времени.
     

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