Negli ultimi mesi ho imparato molto nella progettazione e nelle pratiche del software in diverse lingue e strutture. Per me, i modelli di design più attraenti e utili sono quelli che seguono un approccio orientato agli oggetti. In particolare, sono attratto da un approccio che promuova la riusabilità, la modulazione, la comprensione (riutilizzo del codice capito) e altro ancora.
L'approccio generale che mi trovo spesso ad usare è quello che incapsula la funzionalità del programma in componenti separati con un accoppiamento minimo. Quando visualizzo questo disegno, spesso immagino una struttura gerarchica di oggetti e sottooggetti, in cui ognuno è solo consapevole della propria interfaccia e di quelli dei suoi membri. Come ho capito, quest'ultima parte è essenziale per raggiungere le caratteristiche ricercate che ho citato sopra.
Tenendo presente questo, per i vari progetti sui quali ho lavorato negli ultimi due mesi mi sono trovato a colpire i blocchi stradali del design. In che modo esattamente definisco un oggetto tale che sia in grado di soddisfare le sue funzionalità previste all'interno della mia applicazione pur avendo anche un'interfaccia semplice e intuitiva? Più specificamente (e forse in parole più semplici), come posso implementare la funzionalità necessaria in un oggetto, che non è troppo specifico per le applicazioni comuni?
Descriverò un caso in cui sto affrontando questo problema:
Lavorare con il framework Java Server Faces (JSF) per creare un'applicazione web, quindi il mio design è incentrato sul template di pagina. Ciò comporta la scrittura di modelli XHTML che possono essere riutilizzati quando necessario.
Voglio creare un modello di intestazione che contenga tutto il margine di intestazione che userò in tutto il mio sito web. Ecco un esempio:
<!-- header.xhtml -->
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html />
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets">
<body>
<div class="title">My Website</div>
</body>
</html>
Ora, se voglio aggiungere un po 'di flessibilità per servire diversi titoli di intestazione, posso aggiungere un tag insert in questo modo:
<body>
<div class="title">
<ui:insert name="insertTitle">My Website</ui:insert>
</div>
</body>
I dettagli non sono importanti per questa discussione, ma il tag insert consente alle pagine che utilizzano questo modello di aggiungere un titolo personalizzato al posto del My Website
predefinito.
Questa funzionalità aggiunta al modello sembra appropriata e potrebbe sicuramente ricevere un uso comune.
Che cosa succede se, tuttavia, ho una singola pagina sul mio sito web che necessita di un pulsante nell'intestazione? Devo aggiungere un altro tag di inserimento per questo scopo, anche se ha un singolo utilizzo? In tutti gli altri usi del modello questa funzionalità viene ignorata e quindi potrebbe essere considerata spreco di codice.
Questo mio problema non si presenta solo quando si lavora con il template HTML, ma per qualsiasi approccio che implichi la progettazione di sottocomponenti riutilizzabili. Qualsiasi suggerimento o idea di progettazione per la scelta della funzionalità sarebbe molto apprezzato.