1. Java / Говнокод #21908

    +2

    1. 1
    this.network = new Network(this);

    Я ниасилил DI.

    Запостил: хуита, 28 Декабря 2016

    Комментарии (25) RSS

    • Даже так:
      public Controller(){
      this.network = new Network(this);
      }
      Ответить
      • И Network получает недоконструированный Controller...
        Ответить
        • нет, все норм будет.
          http://ideone.com/AuZBDE
          Ответить
          • > http://ideone.com/AuZBDE

            Код не компилируется. Да и не будет всё норм: объект в жавке не стоит публиковать до завершения конструктора. Вдруг network стартует в конструкторе тред, в котором вызывает методы Controller. Читай про безопасную публикацию объектов в жаве.http://vlkan.com/blog/post/2014/02/14/java-safe-publication/
            Ответить
    • боюсь даже предположить, чем занимается Network
      Ответить
    • Че не так?
      Ответить
    • Асилил за тебя DI, проверь:
      controller = new Controller();
      controller.network = new Network(controller);
      Ответить
      • Network netowork = di.getService(Network.class);
        Ответить
        • Это внутри Controller'а или снаружи? Если внутри - то это уже говнолокатор сервисов, а не DI получается.
          Ответить
          • между типизированным говнолокатором и DI разница не велика

            но лучше конечно автоинжект в конструктор
            Ответить
            • Велика. Говнолокатор не знает, кому он возвращает текущий объект интерфейс.
              Ответить
              • DI тоже пофиг кому он что возвращает

                Важно что он собирает тебе всю деревяшку объектов
                Внутри Network может еще 140 инжектов быть, и 3 из них в конструктор
                Ответить
                • > DI тоже пофиг кому он что возвращает
                  DI может одному объекту заинжектить SimpleNetwork, второму - AdvancedNetwork, а третьему - вообще NetworkMock. Локатор так не сможет, т.к. он не знает, куда пойдёт Network о котором его попросили.
                  Ответить
                  • > Локатор так не сможет

                    Он может посмотреть в Thread.currentThread().getStackTrace() и решить
                    Ответить
                    • А самое ужасное - конструктор Network'а в общем-то тоже может это сделать...
                      Ответить
                    • >>Thread.currentThread().getStackTrace ()
                      Фу, нет.

                      надо кинуть эксепшен, сразу жего поймать, и посмотреть стек трейс
                      Ответить
      • Проверил, JDK распидорасило, пишу спитона.
        Ответить
    • вот правильный код на Java
      factory = NetworkFactory.getInstance();
      connector= factory.getNeworkConnector();
      this.network = connector.connect();
      Ответить
      • Что-то не слишком ынтырпрайзно. Не все паттерны использованы.
        Ответить
        • > Не все паттерны использованы
          Надо в статический анализатор правило такое добавить.
          Ответить
          • Продай эту идею разработчикам пивас-студии. Представляю их следующую статью про ядро...
            Ответить

    Добавить комментарий