Constructor Injection și Null Object, modele de proiectare

  • 1 minute de citit
  • 4 exemple de cod
  • 1 imagine

Disponibil și în English

Modelul Constructor Injection este un model care te ajută să declari toate dependențele necesare unei clase în constructorul ei.

Acest lucru este util deoarece te ajută să decuplezi codul: poți specifica o interfață în loc de un tip concret. Ține minte, programează pentru o interfață.

De asemenea, în constructor este mai ușor să te protejezi împotriva obiectelor null. Codul apelant nu trebuie să se îngrijoreze de excepții null de fiecare dată când folosește o dependență.

Evită furnizarea de valori implicite când folosești acest model, deoarece asta ar cupla codul cu un tip concret. Când o dependență nu este necesară, folosește modelul Null Object.

Vom continua de unde am rămas în articolul anterior și îți vom arăta cum poți modifica aplicația pentru a folosi modelele de proiectare constructor injection și null object.

Graful claselor va arăta astfel:

Pentru a demonstra acest model voi introduce o clasă nouă, MessageTranslator.

class MessageTranslator:    def __init__(self, translator: Translator, printer: Printer):        if not translator:            raise ValueError("Translator cannot be None.")        if not printer:            raise ValueError("Printer cannot be None.")        self._translator = translator        self._printer = printer    def translate(self, message):        return self._translator.translate(message)    def print(self, message):        self._printer.print(message)

Și modifică codul aplicației ca să o folosească:

class Application:    def __init__(self):        self._input_listener: InputListener = ConsoleInputListener("< ")    def start(self):        print("starting application.")        message_translator = MessageTranslator(RomanianTranslator(), ConsolePrinter(">"))        while True:            user_in = Message(self._input_listener.get_input())            if str(user_in) == "exit":                exit(0)            translated_message = message_translator.translate(user_in)            message_translator.print(translated_message)

Gata! Ai folosit modelul constructor injection.

Acum, dacă nu vrem să afișăm mesajul tradus în consolă, nu putem pur și simplu să transmitem un Printer null, deoarece asta ar genera o excepție.

Trebuie să folosim modelul null object pentru a implementa un Printer care nu face nimic.

class VoidPrinter(Printer):    def print(self, message):        pass

Dacă modificăm codul aplicației ca să folosească VoidPrinter, rezultatul ar fi:

starting application. < hello Dev < 

Mulțumesc pentru lectură! Ca de obicei, codul complet poate fi găsit pe Github.