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.
Perché queste tecnologie.
Le scelte mantengono autonome le due applicazioni e condividono soltanto ciò che deve davvero coincidere.
Implementazioni Java e TypeScript separate.
- Perché
- Ogni interfaccia usa il proprio runtime naturale mentre un contratto esterno confronta lo stesso comportamento numerico.
- Cosa ho escluso
- Un bridge tra linguaggi o la condivisione artificiale del sorgente aggiungerebbero accoppiamento senza dimostrare la parità osservabile.
- Quanto è costata
- Accettiamo di mantenere due implementazioni degli algoritmi.
Un parser matematico limitato.
- Perché
- Offre le espressioni necessarie all’ambiente mantenendo grammatica, funzioni e fallimenti controllabili.
- Cosa ho escluso
- eval o Function eseguirebbero JavaScript arbitrario e renderebbero il confine di sicurezza non verificabile.
- Quanto è costata
- Accettiamo una lingua più piccola, funzioni enumerate ed errori espliciti per input non supportati.
Canvas per il grafico web.
- Perché
- Permette un tracciato responsive, leggero e senza dipendenze con controllo diretto di scala e pixel.
- Cosa ho escluso
- Una libreria di grafici o un grande albero SVG introdurrebbero dipendenze e complessità DOM non necessarie per una sola curva.
- Quanto è costata
- Accettiamo di implementare assi, scaling, ridisegno e supporti di accessibilità attorno al Canvas.
Un corpus golden condiviso.
- Perché
- Casi e tolleranze versionati confrontano l’output reale dei due runtime indipendenti.
- Cosa ho escluso
- Condividere codice non sarebbe naturale tra Java e TypeScript e potrebbe propagare lo stesso errore in entrambe le interfacce.
- Quanto è costata
- Accettiamo di curare casi, tolleranze e versioni; il corpus resta un test, non una prova formale.
Le scelte che migliorano la chiarezza matematica.
L’ambiente chiama l’approssimazione con il suo nome.
Conservare il segno dell’integrale
I metodi del punto medio e dei trapezi restituiscono area orientata: invertire i limiti o integrare una funzione negativa mantiene un risultato negativo invece di convertirlo in area geometrica.
Il compromessoIl valore può sorprendere chi si aspetta sempre un’area positiva, ma rispetta il significato matematico dell’integrale definito.
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.
Il compromessoAlcune funzioni discontinue o non finite vengono rifiutate; il progetto non è un sistema di dimostrazione simbolica.
Rispettare esattamente la partizione richiesta
Valore numerico e grafico usano il numero di segmenti inserito dall’utente. Nessun runtime aumenta, riduce o adatta silenziosamente la discretizzazione.
Il compromessoScelte molto grossolane producono approssimazioni visibilmente grossolane; il prodotto le mostra invece di correggerle di nascosto.
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.
Release verificata v1.1.2 Verifica del
IntegraDraw è uno strumento didattico esplorativo. Non offre integrazione simbolica, dimostrazioni, gestione garantita delle discontinuità né risultati esatti per funzioni arbitrarie.