lezione 10

design di api e pattern moderni

interfacce pulite, pimpl e architetture componibili.

livello: avanzato durata: 45 min output: api stabile badge: api design

principi di design

una buona api è minimale, esplicita e difficile da usare in modo sbagliato.

  • riduci dipendenze in header
  • nascondi dettagli implementativi
  • evita copying costoso

pattern pimpl

pimpl separa interfaccia e implementazione, stabilizza abi e riduce rebuild.

// header
class renderer {
public:
    renderer();
    ~renderer();
    void draw();
private:
    struct impl;
    std::unique_ptr<impl> p;
};

interfacce e dependency inversion

definisci interfacce pure e usa dependency injection per testabilità.

struct storage {
    virtual ~storage() = default;
    virtual void save(const std::string& data) = 0;
};

versioning e compatibilità

usa semantic versioning e documenta breaking changes. evita modifiche alle firme pubbliche senza versione major.

una api stabile riduce bug nei client e migliora la manutenzione.

esercizi

rifattorizza una classe con implementazione pesante usando pimpl.

definisci un'interfaccia per storage e implementa file + memoria.

checklist

  • interfacce piccole e stabili
  • nascondi implementazioni private
  • documenta versioni e breaking
  • aggiungi test di integrazione

panoramica

In questo capitolo su design di api e pattern moderni, interfacce pulite, pimpl e architetture componibili. L'obiettivo è trasformare i concetti in micro-pattern riutilizzabili con esempi piccoli e verificabili.

Lavora in sequenza: leggi, prova, modifica gli snippet e annota i trade-off principali (performance, leggibilità, manutenzione).

badge: api design

obiettivi

  • capire e applicare principi in uno scenario reale
  • capire e applicare pimpl in uno scenario reale
  • capire e applicare interfacce in uno scenario reale
  • capire e applicare versioning in uno scenario reale

scheda rapida

#include <iostream>
#include <vector>

int main() {
  std::vector<int> dati{1, 2, 3};
  for (auto &v : dati) {
    v *= 2;
  }
  for (const auto &v : dati) {
    std::cout << v << " ";
  }
  std::cout << "\n";
  return 0;
}

Adatta questo scheletro agli esempi della lezione e sostituisci i dati con il tuo dominio.

tips

  • compila con warning elevati
  • preferisci RAII
  • usa const ovunque possibile
  • evita includere troppo
  • usa pimpl per stabilità ABI
  • documenta ownership

tip: Un'API pubblica vive a lungo: progetta per compatibilità.

mini progetto

Disegna un'API per un modulo di rendering.

  • definisci header pubblico
  • separa implementazione
  • aggiungi error codes
  • scrivi esempi d'uso

output atteso: uno script o query ripetibile con risultati verificabili.

start a brief