Il problema della coerenza.
Uno strumento didattico numerico può sembrare convincente mentre due implementazioni divergono silenziosamente sul numero di intervalli, sull’area con segno o sulle funzioni non valide. IntegraDraw aveva una storia desktop in Java e necessitava di una versione browser moderna, senza trasformarsi in due calcolatori scollegati.
La ricostruzione rende esplicito il contratto matematico: esattamente il numero di intervalli richiesto, risultati con segno, errore di approssimazione visibile e rifiuto chiaro degli input non finiti.
Su cosa devono concordare i due runtime.
L’interfaccia è utile soltanto se le regole numeriche restano stabili:
- I metodi del punto medio e dei trapezi usano esattamente il numero di segmenti inserito dall’utente.
- L’area negativa resta negativa, invece di essere convertita silenziosamente in area geometrica.
- Il valore di confronto è indicato come riferimento Simpson, mai come risultato simbolico esatto.
- Il parser delle espressioni nel browser non deve usare eval o Function.
Un contratto al di sopra dell’implementazione.
Condividere codice sorgente tra Java e TypeScript creerebbe un ponte scomodo tra i runtime senza dimostrare molto. Condividere il comportamento atteso è il confine più utile.
Ho introdotto un corpus golden versionato usato da JUnit e Vitest. Tolleranze e limiti specifici dei runtime restano espliciti, così una divergenza non può sparire dietro un generico helper di uguaglianza approssimata.
Due interfacce, un unico riferimento numerico.
L’applicazione Java racchiude un’interfaccia Swing e il core numerico in un JAR eseguibile. L’applicazione web usa un parser di espressioni senza dipendenze, routine di integrazione TypeScript e un grafico Canvas responsive. Entrambe si verificano sul corpus condiviso.
Le scelte che migliorano la chiarezza matematica.
L’ambiente chiama l’approssimazione con il suo nome.
Usare un linguaggio di espressioni limitato
Il browser accetta x, costanti, operazioni aritmetiche, parentesi e un insieme documentato di funzioni tramite un parser proprio.
È più sicuro e comprensibile di JavaScript arbitrario, ma volutamente meno espressivo.
Dare al riferimento il nome corretto
Il confronto web usa la regola composita di Simpson con 8.192 sottointervalli e lo definisce riferimento, non risultato esatto.
Alcune funzioni discontinue o non finite vengono rifiutate; il progetto non è un sistema di dimostrazione simbolica.
Confrontare il comportamento osservabile
I test Java e TypeScript usano gli stessi casi versionati mantenendo visibili le rispettive tolleranze numeriche.
Il corpus deve evolvere in modo deliberato ogni volta che cambia il contratto matematico supportato.
Distribuire entrambe le applicazioni.
La CI compila Java 17, esegue JUnit, crea e sottopone a smoke test il JAR eseguibile, quindi verifica i tipi, testa e compila l’applicazione TypeScript. I candidati al rilascio includono anche il bundle web e gli SBOM di entrambi i runtime.
La pubblicazione confronta build indipendenti, valida gli inventari delle dipendenze e controlla manifesti SHA-256 e attestazioni GitHub prima di rendere visibile un rilascio stabile.
Cosa rende visibile l’ambiente.
Gli utenti possono cambiare funzione, intervallo e numero di segmenti, quindi vedere come le stime del punto medio e dei trapezi si rapportano alla curva tracciata e al riferimento Simpson.
Le applicazioni desktop e web restano utili autonomamente, mentre il corpus condiviso offre ai maintainer un solo punto in cui verificare il comportamento numerico promesso.
Registro delle evidenze.
Il contratto numerico è abbastanza piccolo da poter essere elencato:
- Corpus golden
- Sei casi di integrali, tre casi di espressioni non valide e sette casi di validazione nello schema versione 1.
- Verifica
- 22 dichiarazioni di test JUnit e 80 TypeScript nel rilascio sottoposto ad audit.
- Riferimento
- Il confronto Simpson composito nel browser usa 8.192 sottointervalli.
- Limite
- Il riferimento non è esatto; discontinuità ed espressioni non finite possono essere rifiutate e i limiti dei runtime differiscono intenzionalmente.