Programmazione Funzionale: gestione dei side-effect

Durante la serata formativa sulla Programmazione Funzionale tenutasi in Giuneco (trovate i materiali utilizzati qui) abbiamo affrontato temi importanti della programmazione funzionale, come:

  • Funzioni pure
  • Immutabilità
  • Funzioni di Ordine Superiore (Higher-Order functions)
  • Currying
  • Composizione

Tuttavia ci eravamo lasciati con una domanda fondamentale: come gestire i side-effects.
In generale, i side-effects sono tutto ciò che rende o potrebbe rendere impredicibile il flusso del nostro codice, come accessi al DB o al File System, ma anche le Exception ne fanno parte.
In questo articolo cercheremo di capire come gestire questi aspetti in maniera funzionale.

Container

In un mondo utopico, tutto il software scritto in un linguaggio funzionale dovrebbe essere puro. Poiché questo è impossibile, si cercano di segregare tutte quelle parti di codice considerate impure.
Per farlo usiamo dei container che non faranno altro che custodire i nostri dati e gestirli nel modo più corretto.
Iniziamo con il Container più semplice:

class Container:

  def __init__(self, value):
    self._value = value

  @staticmethod  def of(value):
    return Container(value)

  def __str__(self):
    return "Container({})".format(self._value)

Container.of(3)
 # Container(3)

Container.of("hello")
 # Container("hello")

Container.of(Container.of({"name": "solo"}))
 # Container(Container({"name": "solo"}))

Questo container presenta delle proprietà comuni a tutti gli altri container:

  1. Ogni container contiene un solo attributo, ovvero il valore che wrappa
  2. L’attributo _value non può essere tipizzato (ovvio in Python, ma importante se usato in altri linguaggi)
  3. Una volta che i dati entrano in un container, non ne possono più uscire

Pagina successiva: Functor e Maybe

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *