Почему для Python нет среды Spring DI (компонент жизненного цикла)? - PullRequest
1 голос
/ 19 сентября 2011

Этот вопрос касается не DAO, MVC, Messaging и других компонентов, которые известны в Spring, а только ядра.

Насколько я понимаю, более ранним преимуществом Spring было то, что он управлял жизненным циклом компонента, предоставляя Singleton Factory, который создает объекты в файле конфигурации, считываемом при запуске.

Затем фабрика-одиночка создает все служебные бины по запросу как синглтоны.Это одно из главных преимуществ Spring, так как он использует меньше памяти и намного меньше собирает мусор в JVM.С другой стороны, объекты данных все еще создаются и уничтожаются, часто не как одиночные.

Почему внедрение зависимостей не имеет таких больших преимуществ для python или других языков?Или они используются как таковые?

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

У Python другая относительная стоимость операций. Вместо сборки мусора он использует подсчет ссылок, что означает, что освобождение объектов не так дорого, как в Java. Использование синглетонов только для ускорения, на мой взгляд, не очень хороший дизайн, так как обеспечивает большую взаимозависимость между различными частями системы.

С другой стороны, конструктивные преимущества внедрения зависимостей (более четкий код, лучшая инкапсуляция) применимы также к Python, и существуют такие платформы: Платформа внедрения зависимостей Python

0 голосов
/ 19 сентября 2011

Ну, я никогда не чувствовал необходимости использовать такую ​​вещь в Python - и большинство знакомых мне программистов Python тоже не искали что-то подобное. У меня сложилось впечатление, что объекты Python в целом легкие, и было бы лучше создать их много и избежать врожденных проблем с изменяемыми объектами, чем использовать синглтоны для оптимизации.

В любом случае, если кто-то действительно хочет какой-то синглтон, обычным способом является создание значения в модуле:

# Module stuff.py
class Stuff(object):
     # ....
     pass

singleton = new Stuff()

Тогда вы используете это:

import stuff
stuff.singleton.do_something()

Вы можете даже, скажем, заменить значение в модуле, как если бы вы поменяли местами applicationContext.xml файлы Spring. Это может быть полезно в тестах, например:

import stuff
stuff.singleton = MockedStuff()

class MyTestCase(TestCase):
    def testMockStuff(self):
        # Component can be a class which uses the singleton
        component = Component()
        # Proceed with tests

На самом деле, вы можете издеваться даже над всем классом:

import stuff
stuff.Stuff = MockedStuff

class MyTestCase(TestCase):
    def testMockStuff(self):
        # Component creates some instance of stuff.Stuff, which is mocked now
        component = Component()
        # Proceed with tests

Подводя итог: ИМХО, программисты на Python не чувствуют необходимости чего-то вроде Spring DI. Если кому-то нужна функциональность Spring DI, его легко реализовать с помощью чистого кода Python.

(Есть пункты, основанные на моем опыте. Я уверен, что больше людей могут указать другие причины.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...