Newsgroup: it.comp.lang.c++
Titolo: Suddivisione in classi - fino a che punto?

Progettando le classi che mi servono per un progetto, mi sto chiedendo:
quanto atomica deve essere una classe? :) Ad esempio, diciamo che io
voglia realizzare la mia "famosa" :) classe data: e' logico (in C++)
creare una classe anno (ad esempio con metodo isleap), una annomese
(con funzione DaysInMonth) derivata dalla prima e alla fine quella data
che aggiunge il giorno?
-- 
Saluti,
 Francesco Cipriani

Francesco Cipriani <f...@news.localhost> wrote in message
news:c1.2b8.2Twj4W$1...@news.nwobbs...

Non sono, in generale, domande a cui sia semplice rispondere (cosi`
come non e` in generale semplice fare le scelte relative ad un progetto).
Progetta il tuo sistema di classi pensando anzitutto, non a come lo
implementerai (considerazione non trascurabile ma secondaria), ma
a come _verra` usato_.  Considera i vari *casi d'uso*.  Questo e`
particolarmente difficile per un sottosistema che vuole offrire una
funzionalita` riusabile da altri, _futuri_ sottosistemi, piuttosto che
non una "funzionalita` applicativa" direttamente disponibile all'utente
finale -- ma e` almeno altrettanto necessario.
Cosa, dunque, *faranno*, i "clienti" della tua libreria "gestione date",
con la libreria stessa?  Quale *granularita` di ri-uso* ti servira`
davvero?
Riesci a pensare a casi abbastanza tipici in cui il codice-cliente
vuole solo modellare un "anno" e sapere se esso sia bisestile,
senza essere interessato ai mesi di quell'anno?  Se cosi` e`,
PUO` forse valer la pena di "scorporarne" l'interfaccia -- se no,
sarebbe ovviamente fuori luogo.
Inoltre, considera il numero magico "sette piu` o meno due".
La mente umana sembra fatta per essere in grado di "afferrare"
in modo unitario e agevole una molteplicita` di, appunto, circa
sette "cose".  Se le "cose" sono molte di piu`, lo sforzo mentale
fa un salto verso l'alto; ma se si riducono sostanzialmente sotto
le sette, non e` che ci sia una grossa semplificazione.
Questo non vuol dire di cacciare dentro OGNI classe che progetti
circa 7 metodi:-), vuol dire pero` che, se hai una semantica
semplice e naturale per una classe che appunto presenta circa
questa varieta` di funzioni, forse non vale la pena di analizzare
in estremo dettaglio se meriti "frammentarla" ulteriormente.  Ci
sono eccezioni, e hanno a che vedere con l'uso di una interfaccia
astratta che puo` avere _molteplici_ implementazioni alternative,
ad esempio; in questo caso, devi considerare se SIA semplice e
naturale per ciascuna implementazione alternativa fornire tutti i
metodi che l'interfaccia la obbliga a fornire.
Nel tuo caso specifico, "a intuito" direi che probabilmente una
classe "data" ha circa la granularita` giusta e soddisfa i tipici
casi d'uso che mi vengono in mente, mentre frammentarla in
modo ulteriore mi sembra un esercizio un poco sterile.  Ma non
ho speso il tempo e l'attenzione necessaria a stendere in modo
_formale_ la use-case analysis...
Alex

>che aggiunge il giorno?
Rispetto al tuo esempio direi di considerare la data come atomica e di inserire i metodi che ti servono.
Secondo me, sempre ad esempio, e' difficile che tu abbia un anno e ti serva sapere se e' bisestile; e' piu' facile che tu abbia una data e ti interessa sapere se il relativo anno e' bisestile. Oppure addirittura non ti interessa saperre se e' bisestile perche' la classe Data ti da' l'operazione di somma di giorni ad una data e quindi l'informazione diventa inutile.
Rispetto alla domanda in generale... dipende. La progettazione delle classi dipende dal dominio del problema e quindi dipende dal problema.
Una buona indicazione secondo me e' quella di creare classi che servono al problema senza cercare di generalizzare a tutti i costi altrimenti si arriva a modelizzare il mondo intero. Naturalmente bisogna avere la capacita' di riconoscere le classi che sono generali e quindi renderle tali.
Antonio

 che aggiunge il giorno?
Tutto dipende dall'uso che vuoi fare per le applicazioni che dovranno essere
scritte in futuro con quelle classi.
Se non hai una necessità di fare operare l'utilizzatore della anno, potresti
"saltarla" e integrare tutto in una classe data più specifica...
In casi estremi dove sai che userai la data solo come numero di secondi che
passano da una certa data puoi creare una sola classe che fa le conversioni
al volo del tipo di data che vuoi mediante classi handler (questa è stata
una delle cose che abbiamo provato con il prof)...
--
| /
| \Byte - Andrea Briganti
E-Mail 
kbyt...@freemail.it
ICQ 40872731