Usare il Builder Pattern in Python

Mattepuffo's logo
Usare il Builder Pattern in Python

Usare il Builder Pattern in Python

Il pattern Builder è uno dei pattern "fondamentali", utilizzato in alternativa all'utilizzo dei costruttori in overloading.

L'obiettivo è quello di rimpiazzare costruttori poco leggibili e poco flessibili, con classi che siano pronte a creare oggetti più complessi.

Oggi ne vediamo un esempio in Python.

Partiamo dalla classe base:

class Anagrafica:
    def __init__(self, ragsoc, breve, via, cap, localita, provincia, nazione, codifiscale):
        self.ragsoc = ragsoc
        self.breve = breve
        self.via = via
        self.cap = cap
        self.localita = localita
        self.provincia = provincia
        self.nazione = nazione
        self.codifiscale = codifiscale

In questo caso i parametri non tantissimi, ma neanche pochi; quindi già qui può avere un senso usare il pattern.

Vi metto qui sotto un esempio:

class Anagrafica:
    def __init__(self, ragsoc, breve, via, cap, localita, provincia, nazione, codifiscale):
        self.ragsoc = ragsoc
        self.breve = breve
        self.via = via
        self.cap = cap
        self.localita = localita
        self.provincia = provincia
        self.nazione = nazione
        self.codifiscale = codifiscale

    def __str__(self):
        return f"Anagrafica di: {self.ragsoc} ({self.codifiscale}) - {self.via}, {self.localita}"

class AnagraficaBuilder:
    def __init__(self):
        self.ragsoc = None
        self.breve = None
        self.via = None
        self.cap = None
        self.localita = None
        self.provincia = None
        self.nazione = "Italia"
        self.codifiscale = None

    def set_ragione_sociale(self, ragsoc):
        self.ragsoc = ragsoc
        return self

    def set_nome_breve(self, breve):
        self.breve = breve
        return self

    def set_indirizzo(self, via, cap, localita, provincia, nazione="Italia"):
        self.via = via
        self.cap = cap
        self.localita = localita
        self.provincia = provincia
        self.nazione = nazione
        return self

    def set_codice_fiscale(self, codifiscale):
        self.codifiscale = codifiscale
        return self

    def build(self):
        # ALTRE VALIDAZIONI
        if not self.ragsoc or not self.codifiscale:
            raise ValueError("Ragione Sociale e Codice Fiscale sono obbligatori!")

        return Anagrafica(
            self.ragsoc, self.breve, self.via, self.cap,
            self.localita, self.provincia, self.nazione, self.codifiscale
        )

builder = AnagraficaBuilder()

cliente = (builder
           .set_ragione_sociale("Piping S.p.A.")
           .set_codice_fiscale("12345678901")
           .set_indirizzo("Via Roma 10", "10100", "Torino", "TO")
           .build())

print(cliente)

Enjoy!


Condividi

Commentami!