Newsgroup: it.comp.lang.delphi
Titolo: Come scrivere questo codice in maniera più elegante

Sto lavorando ancora con quelle classi in cui tratto un pseudo-filesystem.
Ora, in un treeview e in una listview (a proposito, per voi sono maschi o
femmine?) per ogni nodo/item al campo Data ho associato un puntatore alla
classe che rappresenta. Questa classe può rappresentare un File o un Folder,
entrambi derivati da un generico TFsItem. All'interno del treeview o della
listview possono comparire contemporaneamente oggetti di tipo File e Folder.
Il problema, che è un problema solo di 'stile' di scrittura del codice è
questo:
ogni item/nodo ha associato un oggetto di tipo TFsItem o derivato (TfsFile e
TFsFolder), per cui quando analizzo la proprietà data non so a priori con
che tipo di oggetto avrò a che fare.
Per esempio nell'evento OnCustomItemDraw del treeview ho inserito questo
codice:
if TFsItem(Node.Data) is TFsFolder then
  if TFsFolder(Node.Data).NameFormatError then begin
    //fai qualcosa
  end;
if TFsItem(Node.Data).Imported then begin
  //fai qualcosa
end;
Secondo voi può essere scritto diversamente? Così mi sembra che ci siano un
pò troppi Cast...
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://lis77.bravepages.com
 (aggiornato *con foto*: 16/06/03)

 siano un pò troppi Cast...
Direi che potresti semplicemente aggiungere un'ulteriore classe
(TFsItemDrawer) in grado di prendere un TFsItem e disegnarlo
opportunamente sul tuo TreeView; nel CustomDrawItem chiamerai una
istanza (probabilmente singola) di tale classe passando l'item da
disegnare.
L'handler di OnCustomDrawItem diventerebbe:
  TheFsItemDrawer.DrawItemOnTree(Sender, TFsItem(Node.Data));
L'idea e' che aggiungere-testare una classe a volte e' piu'
semplice-efficace-rapido che aggiungere codice ad una form. Potrebbe
sembrare uno spazzare lo sporco sotto il tappeto, ma anche avere una
apparenza di pulito, per cominciare, e' importante.
Alternativamente, potresti aggiungere un metodo (virtuale) a TFsItem da
implementare opportunamente nelle due classi concrete
(HandleTreeViewDrawRequest(Source: TTreeView)), anche se questo tende a
inserire in FsItem roba che non compete strettamente alla classe.
Saluti
Paolo Arosio

 pň troppi Cast...
Ciao.
Potresti:
Var
Item: tFsItem;
begin
Item:= tFsItem(node.data);
if Item...
Per riconoscere il tipo di Item, potresti nell'oggetto base tFsItem
istanziare una variabile identificativa:
tITemId= (Fs_Folder, FS_File, Fs_Virtual);
...
Private
fItemId: tItemId;
PUblic
Property ItemId: tItemId read fItemId write fItemID;
end;
Nei costruttori degli oggetti che lo ereditano imposti il tipo di
identificativo.
Ciao
Giuseppe

 tITemId= (Fs_Folder, FS_File, Fs_Virtual);
mettere una proprietà apposita oppure fare un If .... is TFsXXXX mi sembra
la stessa cosa, no? Anzi, così risparmi anche spazio in memoria


 inserire in FsItem roba che non compete strettamente alla classe.
Questo invece lo scarterei a priori perchè preferisco tenere separata le
classi dei dati dalla gestione dell'interfaccia
grazie


 la stessa cosa, no? Anzi, così risparmi anche spazio in memoria
Beh, dicevi di volere un codice elegante...
Ciao

pò troppi Cast...
Io le chiamerei seghe mentali ;-)
Il codice funziona? SI  e' leggibile? SI
Sei a posto.
C'e' qualche regola che vieta di usare i cast?
Ciao :)
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 C'e' qualche regola che vieta di usare i cast?
Ok, ok, mi tengo quello che ho fatto che evidentemente non č poi cosě male
come credevo ;-)


Cosě mi sembra che ci siano un pň troppi Cast...
Ci sarebbe la direttiva absolute (che se non sbaglio ho visto usare anche a
Paolo A. tempo fa):
var
  Item: TFsItem;
  FileItem: TFsFile absolute Item;
  FolderItem: TFsFolder absolute Item;
begin
  Item := TObject(TreeNode.Data) as TFsItem;
  if Item is TFsFolder then
  if FolderItem.NameFormatError then begin
    // fai qualcosa
  end;
if Item.Imported then begin
  // fai qualcosa
end;
HTH, Ciao
--
Andrea /\/\agni
ICQ#: 174108000

 Paolo A. tempo fa):
Mmm...interessante, mi ricordavo che ci fosse nel vecchio turbo pascal e non
mi aspettavo di ritrovarla anche in delphi ;-)
