mercoledì, maggio 16, 2007

Classi Java, singleton ed Objective C

Le classi java non sono un oggetto. Si, esistono le istanze di Class, ma queste sono una supporto per l'accesso alle proprietà delle classi sottostanti (relazioni con altre classi, membri privati, metodi, annotation...). L'interfaccia esposta da Class facilita l'ispezione della classe ma non facilita l'uso di questa classe come componente applicativo. Per spiegare meglio questo concetto farò un esempio che prende spunto dal seguente problema: è meglio usare un singleton o una classe con i suoi metodi statici? Vediamo un attimo le due situazioni:

// definizione classe con metodi statici


class MiaClasse {
public static void metodo1() { ... }
public static Object metodo2(int valore) { ... }
}

// utilizzo classe con metodi statici

MiaClasse.metodo1();
...
Object r = MiaClasse.metodo2(10);

// classe singleton

class MiaClasse {
private MiaClasse() { ... }
private static MiaClasse instance = null;
public static getInstance() {
if (instance == null) instance = new MiaClasse();
return instance;
}
public void metodo1() { ... }
public Object metodo2(int valore) { ... }
}

// utilizzo classe singleton

MiaClasse.getInstance().metodo1();
...
Object r = MiaClasse.getInstance().metodo2(10);


Il singleton è indubbiamente una soluzione che aggiunge complessità, almeno in un primo momento. Però ha un vantaggio: permette di trattare il componente funzionale come un oggetto, con tutto quello che ne consegue. Ad esempio, se il singleton implementa una certa interfaccia M, è possibile passare il singleton ad un metodo che accetta un parametro di tipo M.


class MiaClasse implements M {
...
}

class AltraClasse {
public void metodoM(M param) { ... }
...
}

AltraClasse a = ...;

a.metodoM(MiaClasse.getInstance());


E' possibile fare la stessa cosa utilizzando l'oggetto Class?

La risposta è... forse... penso di si, ma in modo più complicato, così complicato che il singleton alla fine sarebbe la soluzione migliore.

Queste considerazioni mi fanno venire in mente un fatto: in Objective C le classi sono oggetti al pari di altri e potete permettervi di passarle come parametri ad un metodo ed usarle per richiamare i metodi della classe come si fa con i metodi delle istanze. Ad esempio:


@interface ClasseA
{
...
}
+ (int) metodo1: (int) valore;

...

@interface ClasseB
{
...
}
- (void) metodo2: (id) oggetto;

...

@interface ClasseC
{
...
}
- (int) metodo1: (int) valore;

...

@implementation ClasseB
- (void) metodo2: (id) oggetto
{
int y = ... ;
....
int x = [oggetto metodo1: y]
...
}

...

// utilizzo ClasseA come parametro metodo2
ClasseB* b = ... ;
[b metodo2: ClasseA];

// utilizzo istanza di ClasseC come parametro di metodo2.

ClasseC* c = ...;
[b metodo2: c];


Insomma, se Java fosse come l'Objective C, probabilmente si potrebbe evitare il ricorso ai singleton tutte quelle volte che vorrebbe trattare la classe come un oggetto. Il problema è capire quando questo è, più che necessario, possibile. Cioè, che probabilità ci sia che questo prima o poi diventi una necessità.

sabato, maggio 05, 2007

A proposito di numeri...

Su internet si trova di tutto, come ad esempio The On-Line Encyclopedia of Integer Sequences (Enciclopedia Online delle Sequenze di Numeri Interi), un sito sponsorizzato dagli AT&T Labs.

giovedì, maggio 03, 2007

Vietato pubblicare questi numeri

09 f9 11 02 9d 74 e3 5b d8 41-56 c5 63 56 88 c0

mercoledì, maggio 02, 2007

Questione di millimetri

Supponiamo che il vostro compito sia quello di realizzare un documento in html di cui sia prevista la stampa in un foglio A4. Nel foglio di stile è possibile specificate le misure in millimetri così che quando ad esempio dobbiate specificare le dimensioni dell'area contenente il documento, possiate prendere in considerazione le misure standard del foglio A4, cioè 210x297 millimetri, e quindi ad esse togliere un margine previsto di circa 10 millimetri per ogni lato. Potete realizzare il vostro layout della pagina in html usando sia una tabella contenente una cella a cui sia stato applicato un padding di 10mm oppure usare un div a cui è applicato lo stile:

.test_cover {
position: relative; top: 10mm; left: 10mm;

width: 190mm; height: 277mm; background-color: #F0F0F0;

}


Ora supponiamo che nel documento ci sia un svg contenete del testo (avete deciso di mettere nel documento un testo in verticale e l'unico modo che avete per farlo è quello di metterlo dentro un text svg ruotato di 90 gradi). Mettete il codice svg nel codice html e grazie al fatto che avete realizzato una pagina xhtml riconosciuta come tale dal browser vi aspettate che il documento sia presentato correttamente con l'immagine svg renderizzata correttamente col testo in verticale.

Sicuri?

Si, se nell'immagine contiene solo cerchi, quadrati, figure geometriche più o meno complesse l'immagine viene presentata correttamente. Però se provate a mostrare del testo in una immagine svg collocata dentro un documento realizzato come sopra, cioè in cui la view che contiene l'immagine sia stata traslata di una misura espressa in millimetri, il testo magicamente scompare.

Strano, no?

Soluzioni? Si, ci sono: non usare alcuna traslazione o esprimerla in pixel.

Quindi, in attesa che esca FF3.0 e che (forse) il problema scompaia... chi mi dice a quanti pixel corrispondono 10mm?

p.s.: ho provat con Gran Paradiso Alpha 4 e il bug non si ripresenta. In compenso non mi funzionano più altre cose.