Sobes.tech
Middle

Cos'è un decoratore nel contesto della programmazione?

sobes.tech AI

Risposta dell'AI

Il decoratore è un pattern di progettazione strutturale che consente di aggiungere dinamicamente nuove responsabilità agli oggetti, avvolgendoli in oggetti decoratori speciali. Offre un'alternativa più flessibile all'ereditarietà per espandere le funzionalità.

Idee chiave:

  • Avvolgimento: Il decoratore contiene un riferimento all'oggetto avvolto.
  • Delegazione: Il decoratore delega le chiamate ai metodi all'oggetto avvolto, potendo eseguire logica aggiuntiva prima o dopo la chiamata.
  • Estensione delle funzionalità: Permette di aggiungere comportamenti agli oggetti senza modificare la loro struttura o usare sottoclassi.

Applicazione in QA Automation:

  • Logging delle azioni: Aggiunta di logging ai metodi di interazione con gli elementi della pagina.
  • Gestione delle eccezioni: Aggiunta di gestione universale delle eccezioni alle chiamate di funzione.
  • Tentativi ripetuti: Implementazione di un meccanismo di retry per eseguire test flaky o azioni.
  • Iniezione di pre/post-condizioni: Esecuzione di azioni specifiche prima o dopo il passo principale del test.

Esempio in Python:

def log_method_call(func):
    # Decoratore che registra la chiamata alla funzione
    def wrapper(*args, **kwargs):
        print(f"Chiamata funzione: {func.__name__} con args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"La funzione {func.__name__} ha restituito: {result}")
        return result
    return wrapper

class PageObject:
    def __init__(self, driver):
        self.driver = driver

    @log_method_call
    def click_button(self, locator):
        # Metodo che utilizza il decoratore
        print(f"Cliccando elemento localizzato da: {locator}")
        # Simulazione dell'azione del driver
        # self.driver.find_element(*locator).click()
        return "Pulsante cliccato"

# Utilizzo
# driver = ... # Inizializzazione del driver
# page = PageObject(driver)
# page.click_button(("ID", "submit_button"))