Iniezione di dipendenza in un ciclo?

1

Supponiamo che abbia un ciclo (in sintassi Python):

xml = "<x>...</x>"
for i in arr:
    j = f(x)  # some complex computation
    obj = Class(i, j)
    xml = obj.run(xml)

Ha senso utilizzare l'iniezione di dipendenza per Class in questa situazione? Se sì, qual è il modo corretto di usare DI in questo contesto? Si prega di fornire un esempio.

Forse dovrei sostituire Class con un factory che crea questa classe?

O non dovrei usare l'iniezione di dipendenza in questa situazione, ma lasciare Class(i, j) così com'è?

    
posta porton 24.11.2018 - 20:12
fonte

2 risposte

4

Probabilmente, non hai davvero bisogno di un'iniezione di dipendenza qui. Ma se lo fai, quindi semplicemente iniettare tramite un parametro di funzione è il modo più semplice per andare in Python. Ricorda: in Python, tutte le variabili incl. i nomi delle classi vengono risolti in fase di esecuzione, quindi è possibile passare oggetti di classe in giro come variabili ordinarie. Ad esempio:

def transform_the_xml(xml, arr, StepClass=DefaultClass):
    for i in arr:
        j = f(x)  # some complex computation
        obj = StepClass(i, j)
        xml = obj.run(xml)

In alternativa, è possibile "iniettare" una funzione factory che crea un oggetto, ma che non ha un aspetto diverso dal caso precedente (si userebbe solo una convenzione di denominazione diversa per l'argomento).

Si noti che un oggetto con un singolo metodo è solo un modo complicato per scrivere una funzione. Potremmo scrivere in modo equivalente:

def transform_the_xml(xml, arr, step=None):

    if step is None:
        def step(i, j, xml):
            return DefaultClass(i, j).run(xml)

    for i in arr:
        j = f(x)  # some complex computation
        xml = step(i, j, xml)

Quindi, puoi facilmente iniettare qualsiasi implementazione di step desiderata durante il test dell'unità.

    
risposta data 24.11.2018 - 23:35
fonte
-2

Ha sicuramente un senso (si pensi ai test unitari, tra le altre ragioni). Il controargomento potrebbe esporre la dipendenza può esporre dettagli di implementazione. L'esposizione può essere mitigata fornendo un valore sensato predefinito (imposta valori di campo predefiniti all'interno dei costruttori o argomenti predefiniti a metodi / funzioni, a seconda delle capacità linguistiche, fortunatamente con Python puoi fare entrambi).

    
risposta data 24.11.2018 - 21:53
fonte

Leggi altre domande sui tag