domenica 29 aprile 2007

Lasciare che si verifichi l'errore e poi intercettarlo o verificare prima?

A volte capita di porsi il problema se sia più performante intercettare l'errore oppure realizzare una verifica personalizzata.

La migliore soluzione credo dipenda da molte cose, se ad esempio il verificarsi dell'errore non influisce sulle prestazioni del programma e si sta interagendo con l'utente è perfettamente plausibile lasciare che l'eccezione abbia luogo.
Invece se si è all'interno di un blocco / ciclo, e cioè quando il programma sta svolgendo del lavoro su molti dati (magari l'operatore viene tentato di premere il famigerato bottone "stop") allora la domanda "intercetto o verifico l'errore?" comincia ad avere senso.

Ho trovato in rete questo frammento relativo allo stesso controllo di validità di una data, frammento che propongo:

Verifica dei dati e dell'errore prima dell'eccezione.

C#

GregorianCalendar calendar = new GregorianCalendar();
Regex verify = new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])/(0[1-9]|1[0-2])/(\d\d\d\d)$",RegexOptions.Compiled);
for (int i = 0; i < 1000000; i++) {
     string date = "14/12/2006"
     Match match = verify.Match(date);
     if (match.Groups.Count == 4) {
        int year = int.Parse(match.Groups[3].Value);
        int month = int.Parse(match.Groups[2].Value);
        int day = int.Parse(match.Groups[1].Value);
        if (day <= calendar.GetDaysInMonth(year, month)) {
           DateTime theDate = new DateTime(year, month, day);
       }
   }
}

VB.NET
Dim calendar As New GregorianCalendar()
Dim verify As New Regex("^(0[1-9]|[1-2]\d|3[0-1])/(0[1-9]|1[0-2])/(\d\d\d\d)$", RegexOptions.Compiled)
For i As Integer = 0 To 999999
   Dim [date] As String = "14/12/2006"
   Dim match As Match = verify.Match([date])
   If match.Groups.Count = 4 Then
       Dim year As Integer = Integer.Parse(match.Groups(3).Value)
       Dim month As Integer = Integer.Parse(match.Groups(2).Value)
       Dim day As Integer = Integer.Parse(match.Groups(1).Value)
      If day <= calendar.GetDaysInMonth(year, month) Then
          Dim theDate As New DateTime(year, month, day)
      End If
   End If
Next

Con questo metodo si processano un milione di date in circa tre secondi e si "spende" un secondo per intercettare un milione di date errate in meno di un secondo (ovviamente questo va ricondotto alla propria installazione)

Si lascia che l'errore avvenga e si intercetta l'eccezione

C#

for (int i = 0; i < 1000000; i++) {
   string date = "12/13/2006"
   try {
       DateTime theDate = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture);
   }
   catch (Exception ex)
   {
   }
}

 

VB.NET

For i As Integer = 0 To 999999
    Dim [date] As String = "12/13/2006"
    Try
       Dim theDate As DateTime = DateTime.ParseExact([date], "dd/MM/yyyy", CultureInfo.InvariantCulture)
    Catch
   End Try
Next

 

Con questa seconda strategia vengono analizzate un milione di date corrette in meno di un secondo però ... ad intercettare un milione di date errate intercettando l'errore ci mette 60 secondi!.

Con il framework 2.0 sono stati introdotti alcuni TryParse che sono sicuramente da preferire rispetto all'intercettazione dell'errore.

In conclusione: qualsiasi test precedente è migliore di lasciare che si verifichi l'errore.

sabato 28 aprile 2007

Microsoft Office Compatibility Pack per formati di file Word, Excel e PowerPoint 2007

Da qualche tempo ho installato Office 2007, mi piacciono le sue nuove features come l'interfaccia "ribbon" che trovo molto più funzionale rispetto alle versioni precedententi.

Come credo sia noto a tutti la versione 2007 di Office introduce dei nuovi formati di files per Word, Excel e Powerpoint, formato che risulta indigesto (illeggibile) alle versioni precedenti.

Invito quanti hanno una versione precedente di Office (XP e 2003 perchè le altre Microsoft neanche le considera!) ad installare il Compatibility Pack.

Per chi non ha Office installato e comunque vuole aprire documenti Office 2007 e precedenti ricordo che esistono i visualizzatori di Office scaricabili gratuitamente, per il 2007 esiste un'aggiunta da installare.

mercoledì 25 aprile 2007

Aggiunta di una colonna calcolata ad un DataSet tipizzato

 

L'aggiunta di una colonna calcolata ad un DataSet tipizzato è una operazione che a prima vista potrebbe spaventare ma non è per niente complicata.

Gli steps per ottenere il risultato (chi fa da se senza copiare "vince"):

  1. Creazione di un nuovo progetto
  2. L'aggiunta di una fonte dati, nel mio caso ho utilizzato un database di access generato allo scopo con i campi: ID, Descrizione, Quantità (senza l'accento sulla a per non complicarmi la vita!) , Prezzo
  3. Si edita la definizione del dataset tipizzato, si aggiunge la colonna e si imposta sulle proprietà l'espressione, nel mio caso Quantita * Prezzo (è sempre buona norma mettere i nomi dei campi con le maiuscole/minuscole al loro posto, nel caso di nomi di campi con caratteri non ammessi come spazi o altro è necessario mettere le parentesi [] a circoscrivere il nome del campo)
  4. Si aggiunge un BindingSource e lo si collega al dataset
  5. Si aggiunge un DatagridView e lo si collega al BindingSource
  6. Si personalizza la posizione dei campi sull'insieme "columns" del DataGridView
  7. Les Voilà

Esempio con C#
Esempio con VB.NET

Ricerca e sostituzione di testo con C# e VB.NET uso di GetTempFileName

 

Questo esempio disponibile in C# ed in VB.NET dimostra come utilizzare il metodo Replace per realizzare la sostituzione del testo di una o più righe in un file.

Il comportamento tra C# e VB.NET è diverso, di default infatti la ricerca sulle stringhe da C# è Case Sensitive, viceversa VB.NET NON è Case Sensitive di default, lo diventa solo se si aggiunge "Option Compare Binary" nelle dichiarazioni del modulo.

Inoltre viene dimostrato l'utilizzo di using (C#) e Using su VB.NET in modo tale da effettuare la Dispose automaticamente all'end of scope del blocco Using.

I tags per questo post sono: GetTempFileName, Using, Case Sensitive, Replace

Esempio in C#
Esempio in VB.NET

 Mi accorgo ora di un piccolo errore nel formato per la definizione del nome del file di backup:
System.DateTime.Now.ToString("HHmmSS")
Deve diventare
System.DateTime.Now.ToString("HHmmss")

martedì 24 aprile 2007

Ordinare un DataView scegliendo i campi a video

 

Questo frammento di codice preso da un mio programma mostra come ordinare in modo variabile un dataview prendendo l'ordine da una combo presente nella form

private void ScriviFileBollette(string NomeFile)
{
     DataTable Testata = GeneraDataSet.Struttura.Tables["Testata"];
     DataTable Dati = GeneraDataSet.Struttura.Tables["Dati"];
     DataView dv = new DataView(Testata);
     string sortOrder = dv.Sort;
     switch(this.cmbOrdine.SelectedIndex)
     {
        case 0:
              sortOrder = "Cap, Localita, Indirizzo";
              break;
        case 1:
              sortOrder = "Cap, Indirizzo";
              break;
        case 2:
              sortOrder = "Cap, Destinatario";
              break;
        case 3:
             sortOrder = "Destinatario";
             break;
        case 4:
             sortOrder = "Numero";
             break;
      }
      dv.Sort = sortOrder;
}

sabato 21 aprile 2007

Windows Live Writer funziona su questo blog

Questo post per confermare  la funzionalità di gestione del blog fatta con Windows Live Writer uno strumento gratuito fornito da microsoft per la gestione dei blogs.

Ciao e buon lavoro a tutti!

venerdì 20 aprile 2007

Connettività Tramite Impianto Elettrico

 

Visto che non ero contento delle prestazioni del mio WI-FI / Alice ho preso una coppia di apparecchi NetGear XE104.
Il montaggio è stato molto facile e semplice, ho collegato i due apparecchi alla rete elettrica e questi al pc e allo Switch.

La velocità nominale è di 85 Mbps, ciascun dispositivo è equipaggiato con 4 porte Ethernet.

Ho provato a visualizzare un filmato è la velocità mi sembra molto buona.

Certamente che attaccare il pc alla rete elettrica tramite la porta Ethernet mi ha dato sempre da pensare!