Passa al contenuto principale

Roman Numeral Converter

Roman Numeral Converter Project Mobile UI Preview Figma vs Visual Studio Code Roman Numeral Converter Project Desktop UI Preview Figma vs Visual Studio Code

Il Progetto

Convertitore da numeri arabi a numeri romani sviluppato con JavaScript vanilla, validazione avanzata degli input e architettura basata su componenti. Un'applicazione completa con design Material Design 3 e sistema di commenti professionale.

Codice Sorgente

<!-- DESIGN 
------
* This HTML is characterized by:
* - importing Roboto Slab and Roboto fonts from Google Fonts.
* I chose these fonts because Roboto Slab has classic shapes
* that evoke ancient Rome,
* Roboto (for input and button) provides modernity,
* readability and consistency with Material Design 3
* - a div structure with exception of the card container, where
* I chose <main> for semantic purposes
-->

<!DOCTYPE html>
<html lang="en">
<head>
<title>Roman Numeral Converter</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="styles.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@100..900&family=Roboto:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
</head>

<body>

<!-- * freeCodeCamp instructions:
* - You should have an input element with an id of "number".
* - You should have a button element with an id of "convert-btn".
* - You should have a div, span or p element with an id of output.

* I'll create separate divs to allow me in CSS phase to position
* each component exactly as in Figma

* I must remember to write "number" for type of input to restrict
* input to numeric characters, which is more efficient than using
* regex in JavaScript
* I did some research and found out that input type="number" uses
* browser native validation operating with an underlying C/C++ engine,
* while regex is executed by the JavaScript interpreter.
* However, I still need to use JavaScript to avoid "e" and ","
-->

<main id="card-container">
<div id="title-container">
<h1 id="first-h1">Roman Numeral <span id="second-h1">Converter</span></h1>
</div>
<div id="output-container">
<p id="output"></p>
</div>

<!-- * Adding min/max attributes provides defense in depth.
* Although this approach is typically used in more complex,
* cybersecurity scenarios, it provides a fallback in case JavaScript
* rule validation fails or is disabled.
-->

<div id="input-container">
<input value="" type="number" name="arabic-number-input" class="number" id="number" placeholder="Enter a Number" min="1" max="3999" autocomplete="off">
</div>
<div id="convert-btn-container">
<button id="convert-btn">Convert</button>
</div>
</main>

<script src="script.js"></script>
</body>

</html>

L'Arte dei Commenti

Incredibilmente ho pochissime cose da dire in merito a questo progetto, perché ho detto tutto nei commenti. Ciononostante, quei commenti sono per i programmatori che leggono, questi README sono per tutti.
Dopo aver interiorizzato l'articolo di Salvatore Sanfilippo (https://antirez.com/news/124) è come se in questo progetto avessi scritto i commenti per la prima volta. Precedentemente li utilizzavo soltanto nel CSS per suddividere i diversi componenti. Questa volta ho integrato i commenti di design (design comments) nonché il lungo commento introduttivo che spiega l'architettura del file, in modo tale da permettere a chi lo leggerà di avere fin da subito un'infarinatura generale. Questo è utile in progetti lunghi, nel mio caso ho aggiunto questo tipo di commento anche nell'HTML ma riconosco che per file così piccoli sia alquanto inutile, nonostante ciò, dato che voglio esercitarmi fin da subito, ho deciso di aggiungerlo.

I "Why Comments"

Ho trovato strabilianti i "why comments" nonché tutti quei commenti che spiegano le ragioni per le quali si è optato per una scelta piuttosto che l'altra e se questa è molto banale allora spiegare il perché è stata la scelta migliore in quel momento. Dico strabilianti perché mi hanno costretto a riflettere e documentarmi molto per poter affermare certe scelte. Questo mi ha dato una comprensione che non avrei mai potuto ricevere scrivendo solo codice.

I "Trivial Comments" con Cultura

Poi arrivano i trivial comments, che dovrebbero essere tutti quei commenti dedicati a concetti che qualsiasi programmatore dà per scontato, ma che Salvatore Sanfilippo dice comunque di amare. Ho voluto aggiungere un pizzico di cultura all'interno.
Ad esempio nell'HTML a un certo punto affermo: "I did some research and found out that input type="number" uses browser native validation operating with an underlying C/C++ engine, while regex is executed by the JavaScript interpreter."
O ancora: "Adding min/max attributes provides defense in depth. Although this approach is typically used in more complex, cybersecurity scenarios, it provides a fallback in case JavaScript rule validation fails or is disabled."
Due concetti del tutto inutili da includere per un qualsiasi programmatore, ma pur sempre concetti che vale la pena rileggere. Per esempio io, assoluto principiante, sarei felicissimo di trovare commenti simili nel progetto di qualcun altro.

I "Checklist Comments"

Successivamente ho aggiunto dei commenti di monito, Salvatore li chiama "checklist comments" ovvero commenti che mi sono serviti per ricordare esattamente cosa diceva nelle istruzioni freeCodeCamp e non esagero se affermo che è proprio grazie a questi se sono riuscito per la prima volta a passare al primo tentativo un certification project.

Il Design: Material Design 3

Parliamo ora del design di questo progetto. Questa volta ho scelto di addentrarmi nel mondo del Material Design 3.
Mi sono ispirato dall'applicazione Google Translate del mio smartphone, mi è sempre piaciuto lo stile, seppur "acido" trovo il suo stile unico. Ho iniziato a studiare questa corrente di design e dopo aver ottenuto un'infarinatura generale da un video YouTube, mi sono dedicato all'esplorazione del sito ufficiale. Qui ho ottenuto tutte le risposte, dallo stile e scelte stilistiche a un file Figma con tutti i componenti principali. Ho preso da questo le varie "shapes", ovvero tutte le forme del Material Design 3 e le ho sparse sullo sfondo, aggiungendoci un emoji che raffigura Android, anche quest'ultima presa dal sito Material.

Un Nuovo Approccio: Note a Fianco

In seguito, un'immagine delle note che ho scritto a fianco al progetto per aiutarmi. Non avevo mai adottato questo approccio. Salvatore è persino riuscito a cambiare il mio modo di usare Figma?

Approccio Notes in Figma

Reinterpretazione Personale dello Stile

Mi sono preso la libertà di reinterpretare questo stile. Infatti al box dell'input ho deciso di posizionare il placeholder centrato orizzontalmente anziché allineato a sinistra, con un'opacità leggermente più alta di come avrebbe fatto Google ed allo stesso tempo di un colore analogo al tema complessivo. Inoltre ho inserito dei trattini, per la precisione 6, che vengono mostrati all'apertura dell'applicazione, prima di ottenere l'output. Google non l'avrebbe mai fatto, l'avrebbe piuttosto lasciato vuoto per sottolineare che quel campo si sarebbe riempito con la call to action da parte dell'utente (la pressione del pulsante "Convert").

Tutte queste scelte le ho fatte per una mera questione estetica, mi hanno portato alla sensazione che così fosse tutto al posto giusto.

Tipografia: Roboto Slab e Roboto

Al di là dello stile, ho anche conservato il tipico pattern di coerenza che Google dedica agli elementi interattivi (input, pulsanti) i quali devono essere immediatamente riconoscibili. Per questo motivo ho optato per il font Roboto Slab per il titolo e per l'output, che ha avuto come obiettivo quello di invocare caratteri classici, affini all'antica Roma, una sorta di "accento tematico". Mentre per input e button il font Roboto che segue modernità, ha ottima leggibilità e segue pattern consolidati che l'utente conosce, caratteristiche centrali nella filosofia di Google.

Cosa Ho Imparato

Architettura CSS Avanzata:

  • Component-Based Architecture per organizzazione in componenti (card, title, output, input, button)
  • Utility-First Variables con centralizzazione in :root
  • Flat Component Hierarchy con selettori basati su ID
  • Media queries responsive per mobile

Algoritmo di Conversione:

  • Array map con coppie arabo-romano [[1000, "M"], [900, "CM"]...]
  • .reduce() per accumulazione risultati
  • While loop per iterazione sui valori romani
  • Destructuring array per codice conciso

Input Validation Professionale:

  • type="number" per validazione nativa del browser (C/C++ engine)
  • min/max attributes per defense in depth
  • e.preventDefault() per bloccare caratteri non numerici
  • Gestione casi edge: valori vuoti, NaN, range non validi

Event Handling:

  • addEventListener("keydown") per controllo caratteri
  • Enter key per submit alternativo
  • .includes() per blocco caratteri specifici (["e", "E", "+", "-"])

Best Practice Commenti:

  • Design comments per architettura generale
  • Why comments per spiegare scelte tecniche
  • Trivial comments con approfondimenti culturali
  • Checklist comments per requisiti freeCodeCamp

Material Design 3:

  • Shapes e componenti Material
  • Color system con palette tematiche
  • Typography hierarchy (Roboto Slab + Roboto)
  • Interactive states e transitions

Principi di Programmazione:

  • SRP (Single Responsibility Principle)
  • DRY (Don't Repeat Yourself)
  • Defense in depth approach
  • Semantic HTML

Riflessione

Salvatore Sanfilippo mi ha insegnato che i commenti non sono un peso, ma un'arte. Ogni scelta tecnica ha una ragione, ogni alternativa scartata ha un perché. Documentare questo processo non è perdere tempo, d'altronde mi ha portato a superare per la prima volta un certification project al primo tentativo.


Prossimo Progetto: Imparare le espressioni regolari costruendo uno Spam Filter