ReBitting

Blog ecologico. Sono stati usati solamente bytes riciclati
posts - 138, comments - 197, trackbacks - 1

venerdì 3 luglio 2009

System.Collections: ArrayList

Implementa l’interfaccia IList, usa un array che dinamicamente aumenta la sua dimensione se richiesto.

Implementazioni:

IList

Osservazioni:

Non è garantito che gli elementi nell’ArrayList siano ordinati.
La capacità dell’ArrayList è in numero degli elementi che può tenere in memoria.
Se il numero di elementi aumenta, anche la dimensione dell’ArrayList aumenterà.
Se il numero degli elementi diminuisce, per ridimensionare l’ArrayList bisognerà chiamare il metodo TrimToSize o settando
la proprietà Capacity.

Possiamo accedere agli elementi dell’ArrayList tramite un’indice. L’indice parte da 0.

L’ArrayList accetta elementi null e due elementi possono essere uguali.

Thread Safety:

I members public static sono thread safe.
Per garantire le operazioni multi-thread, bisogna istanziare un array tramite il metodo ArrayList.Synchronized

Code Snippet
  1.             // Creates and initializes a new ArrayList.
  2.             ArrayList myAL = new ArrayList();
  3.             myAL.Add("The");
  4.             myAL.Add("quick");
  5.             myAL.Add("brown");
  6.             myAL.Add("fox");
  7.             // Creates a synchronized wrapper around the ArrayList.
  8.             ArrayList mySyncdAL = ArrayList.Synchronized(myAL);
  9.             // Displays the sychronization status of both ArrayLists.
  10.             Console.WriteLine("myAL is {0}.", myAL.IsSynchronized ? "synchronized" : "not synchronized");
  11.             Console.WriteLine("mySyncdAL is {0}.", mySyncdAL.IsSynchronized ? "synchronized" : "not synchronized");

 

Durante l’enumerazione degli oggetti nella collection potremmo comunque incappare in un’eccezzione se altri thread modificano la collezione anche se questa è sincronizzata.
Per garantire anche l’accesso durante l’enumerazione bisogna lockare la collection durante l’operazione o catchare l’eccezione per notificare il cambio anche agli altri threads.

posted @ venerdì 3 luglio 2009 23.53 | Feedback (0) |

WCF: Encoding e Serializzazione – Parte 1 - Introduzione

Questo è un post introduttivo per i post seguenti questo argomento.

DataContract - Serializzazione

L’attributo DataContract è uno dei primi con cui si ha a che fare nel momento in cui si inizierà a scrivere un servizio WCF.
All’interno di un servizio WCF i dati possono avere una certa complessità; quando, gli stessi, vengono spediti vengono rappresentati
tramite un XML Schema Definition (XSD).

DataContract è il mezzo usato da WCF per mappare i tipi .NET CLR con le loro rappresentazioni XSD.

Il decoratore [DataContract] è usato per specificare quale classe deve essere specificata nell’XSD e esposto nell’WSDL esposto dal servizio.

Il decoratore [DataMember] è usato invece per specificare quali membri della classe devono essere specificati nell’XSD.

A runtime la classe DataContractSerializer serializza l’oggetto in XML usanto le regole specificate con gli attributi [DataContract] e [DataMember].

Ecco un esempio, questa è la nostra classe:

Code Snippet
  1.     [DataContract]
  2.     public class CompositeType
  3.     {
  4.         bool boolValue = true;
  5.         string stringValue = "Hello ";
  6.         [DataMember]
  7.         public bool BoolValue
  8.         {
  9.             get { return boolValue; }
  10.             set { boolValue = value; }
  11.         }
  12.         [DataMember]
  13.         public string StringValue
  14.         {
  15.             get { return stringValue; }
  16.             set { stringValue = value; }
  17.         }
  18.     }

 

Questo l’WSDL ottenuto:

Code Snippet
  1. <GetDataUsingDataContractResponse xmlns="http://tempuri.org/">
  2.   < GetDataUsingDataContractResult xmlns:a="http://schemas.datacontract.org/2004/07/WcfService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  3.     < a:BoolValue>false</a:BoolValue>
  4.     < a:StringValue>Hello </a:StringValue>
  5.   </ GetDataUsingDataContractResult>
  6. </ GetDataUsingDataContractResponse>

 

In definitiva, la classe DataContractAttribute == [DataContract] specifica o implementa il tipo dei dati da serializzare tramite un serializer, ad esempio tramite la classe DataContractSerializer.

Per Serializzazione solitamente si descrive il processo di conversione di un oggetto in un array di bytes; tale processo viene usato per salvare lo stato di un oggetto su un file o su un database,
copiare lo stato sul clipboard, per trasferire l’oggetto tra un’applicazione ad un’altra tramire un network e per migliorarne la mantenibilità.

Con WCF, serializzare, si intende come un oggetto .NET e mappato nell’XML Infosets.

WCF supporta 3 serializer: XmlSerializer, DataContractSerializer e NetDataContractSerializer.

Tutte e 3 hanno possiedono un algoritmo di mapping diverso, ma lo scopo è sempre lo stesso: mappare gli oggetti .NET in XML Infosets.

Encoding

Abbiamo appena finito di descrivere la Serializzazione ed adesso possiamo capire che distinzione fa WCF con l’Encoding.

Encoding è il termine usato per descrivere il processo di conversione di un messaggio in un array di bytes.

WCF supporta cinque tipi di formati di encoding:

  • binary
  • text
  • Message Transmission Optimization Mechanism (MTOM)
  • JavaScript Objeect Notation
  • Plain-Old-XML (POX)

Quale di questi formati usare, dipende dal tipo di applicazione che stiamo sviluppando.

Ad esempio vorremmo usare il BinaryMessageEncoder per ottimizzare le performance tra le applicazioni, oppure usare TextMessageEncoder o MtomMessageEncoder per mantenere
l’interoperabilità basata sui vecchi servizi WS-* Web Services, o usare JsonMessageEncoder per AJAX

Se provaste a usare encodings diversi per scrivere lo stesso XML Infosets, otterrete N differenti byte streams, comunque rappresenterebbero gli stessi dati.

L’encoding non è considerato parte del contratto del servizio, ma piuttosto una configurazione dell’endpoint.

Conclusione

La separazione tra Serializzazione e Encoding rende possibile la creazione di applicazioni molto flessibili.
Questo è un cavallo di battaglia di WCF, perchè gli da la possibilità di configurarsi con qualsiasi scenario.

Se abbiamo bisogno di performance allora possiamo usare un encoder se invece necessitiamo di interoperabilità allora sceglieremo un formato testuale.

Tags:

posted @ venerdì 3 luglio 2009 22.34 | Feedback (0) |

OrangeDotNet

Gli amici sono arrivati.
Arance, cannoli, arancine, mozzarelle in carrozza, caponatina, pani ca mivusa, cazzilli, mussu, pani e panelle, cassata, cannolo africano, iris con nutella e con ricotta,
pasta al forno, pasta tinnirumi e zucchina, parmigiana, gelsi, fichi, fichi d’india, limoni e stigghiola.

E’ realmente tutto pronto, forse mancano ancora un paio di sedie e le tovaglie di lino.
Ma le otri son piene del vino buono (Nero d’Avola, ovvio).

Adesso tocca a noi, bavaglini al collo e via di coltello e forchetta.

Buon appetito!!!

http://www.orangedotnet.org/

Tags:

posted @ venerdì 3 luglio 2009 10.22 | Feedback (0) |

giovedì 2 luglio 2009

System.Collections: Generic.IList<T>

 

Rappresenta una lista di oggetti accessibile tramite un indice.

Implementazioni:

ICollection<T>
IEnumerable<T>
IEnumerable

Osservazioni:

Implementa l’interfaccia generica ICollection<T>.

Thread Safety:

 

posted @ giovedì 2 luglio 2009 22.04 | Feedback (0) |

System.Collections: Generic.ICollection<T>

 

Definisce i metodi per manipola le collezioni generiche.

Implementazioni:

IEnumerable<T>
IEnumerable

Osservazioni:

La versione non generica ICollection definisce dimensioni, enumeratore e i metodi di sincronizzazione.
Le interfacce quali IDictionary<TKey, TValue> e IList<T> sono interfacce specializzate che implementano ICollection<T> e poi le rispettive classi
ne implementano la logica.
Mentre le classi come Queue<T> e Stack<T> implementano direttamente la ICollection<T>.

Thread Safety:

 

posted @ giovedì 2 luglio 2009 21.44 | Feedback (0) |

mercoledì 1 luglio 2009

System.Collections: Generic.IEnumerable<T>

 

Espone l’enumeratore che supporta un semplice iteratore su una collezione del tipo specificato.

Implementazioni:

 

Osservazioni:

Il metodo che verrà chiesto di implementare è GetEnumerator il quale ritornerà l’enumeratore implementato.

Thread Safety:

posted @ mercoledì 1 luglio 2009 23.11 | Feedback (0) |

System.Collections: Generic.IEnumerator<T>

 

Supporta un semplicissimo iteratore della collezione generica.
E’ l’interfaccia base per tutti gli enumeratori generici.

Implementazioni:

IEnumerator
IDisposable

Osservazioni:

Implementare questa interfaccia richiede l’implementazione della IEnumerator.
Ciò significa implementare i metodi MoveNext e Reset che non dipendono dal tipo dell’oggetto.
La proprietà Current è presente in entrambe le interfacce, generica e non.

Thread Safety:

Di default le collection implementate nel namespace System.Collections.Generic non sono sincronizzate.

posted @ mercoledì 1 luglio 2009 13.28 | Feedback (0) |

venerdì 26 giugno 2009

Visualizzare una “M” nei vostri programmi

http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=2284

Tags: |

posted @ venerdì 26 giugno 2009 13.56 | Feedback (0) |

martedì 23 giugno 2009

System.Collections

Tramite un consiglio di un amico, a causa della mia attuale mancaza di ispirazione, vi domando:

chi conosce tutte queste classi e quando è corretto usare una piuttosto che un’altra?

System.Collections

System.Collections.Generic 

System.Collections.ObjectModel

System.Collections.Specialized

posted @ martedì 23 giugno 2009 21.54 | Feedback (9) |

sabato 20 giugno 2009

Duplicated Code: Form template method

Continuiamo con lo smell: Duplicated Code

noclone

Problema:

Abbiamo 2 o più metodi che eseguono lo stesso codice anche se con una sequenza logica diversa.

Un esempio di logica errata:

  Immagine

Code Snippet
  1.     class Employee
  2.     {
  3.         public int EmpID { get; set; }
  4.         public string EmpName { get; set; }
  5.         public string Salary { get; set; }
  6.         public Employee(int empID, string empName, string sal)
  7.         {
  8.             this.EmpID = empID;
  9.             this.EmpName = empName;
  10.             this.Salary = sal;
  11.         }
  12.         public string Display()
  13.         {
  14.             string s;
  15.             s = "$" + Salary;
  16.             //Display all Employees Details.
  17.             s += "Employee ID: " + EmpID;
  18.             s += "Employee Name: " + EmpName;
  19.             s += "Employee Salary: " + Salary;
  20.             s += "-------------------";
  21.             return s;
  22.         }
  23.     }
  24.     class Department
  25.     {
  26.         public int DeptID { get; set; }
  27.         public string DeptName { get; set; }
  28.         public string Location { get; set; }
  29.         public Department(int deptID, string deptName, string loc)
  30.         {
  31.             this.DeptID = deptID;
  32.             this.DeptName = deptName;
  33.             this.Location = loc;
  34.         }
  35.         public string Display()
  36.         {
  37.             if (Location == "BLORE")
  38.             {
  39.                 Location = "BANGALORE";
  40.             }
  41.             else if (Location == "HYD")
  42.             {
  43.                 Location = "HYDERABAD";
  44.             }
  45.             else
  46.             {
  47.                 Location = "DELHI";
  48.             }
  49.             //Display all Departments Details.
  50.            
  51.             string s = "Department ID: " + DeptID;
  52.             s += "Department Name: " + DeptName;
  53.             s += "Department Location: " + Location;
  54.             s += "-------------------";
  55.             return s;
  56.         }
  57.     \


Motivazione:

Il polimorfismo viene in aiuto per eliminare il codice duplicato. Quando abbiamo due subclasses con lo stesso metodo portiamo tutto nella classe base e abbiamo risolto.
Ma quando i due metodo non sono esattamente gli stessi, cosa possiamo fare?

Soluzione:

 refactored

Code Snippet
  1.     abstract class AbstractDAO
  2.     {
  3.         public abstract void LoadDetails();
  4.         public abstract void FormatAndDisplayDetails();
  5.         public virtual void StartUp()
  6.         {
  7.             Console.WriteLine("Start of Processing");
  8.             Console.WriteLine("-------------------");
  9.         }
  10.         public virtual void Dispose()
  11.         {
  12.             Console.WriteLine("End of Processing");
  13.         }
  14.         public void Display()
  15.         {
  16.             StartUp();
  17.             LoadDetails();
  18.             FormatAndDisplayDetails();
  19.             Dispose();
  20.         }
  21.     }
  22.     class Employees : AbstractDAO
  23.     {
  24.         private List<Employee> empList = new List<Employee>();
  25.         public override void LoadDetails()
  26.         {
  27.             //Get Data From Database.
  28.             empList.Add(new Employee(10, "TEST", "2000"));
  29.             empList.Add(new Employee(20, "TEST1", "3000"));
  30.             empList.Add(new Employee(30, "TEST2", "4000"));
  31.         }
  32.         public override void FormatAndDisplayDetails()
  33.         {
  34.             //Add $ to Salary
  35.             foreach (Employee emp in empList)
  36.             {
  37.                 emp.Salary = "$" + emp.Salary;
  38.                 //Display all Employees Details.
  39.                 Console.WriteLine("Employee ID: " + emp.EmpID);
  40.                 Console.WriteLine("Employee Name: " + emp.EmpName);
  41.                 Console.WriteLine("Employee Salary: " + emp.Salary);
  42.                 Console.WriteLine("-------------------");
  43.             }
  44.         }
  45.     }
  46.     class Departments : AbstractDAO
  47.     {
  48.         private List<Department> deptList = new List<Department>();
  49.         public override void LoadDetails()
  50.         {
  51.             //Get Data From Database.
  52.             deptList.Add(new Department(1000, "HRA", "BLORE"));
  53.             deptList.Add(new Department(2000, "FIN", "HYD"));
  54.             deptList.Add(new Department(3000, "MARKETING", "DEL"));
  55.         }
  56.         public override void FormatAndDisplayDetails()
  57.         {
  58.             //Expand Location.
  59.             foreach (Department dept in deptList)
  60.             {
  61.                 if (dept.Location == "BLORE")
  62.                 {
  63.                     dept.Location = "BANGALORE";
  64.                 }
  65.                 else if (dept.Location == "HYD")
  66.                 {
  67.                     dept.Location = "HYDERABAD";
  68.                 }
  69.                 else
  70.                 {
  71.                     dept.Location = "DELHI";
  72.                 }
  73.                 //Display all Departments Details.
  74.                 Console.WriteLine("Department ID: " + dept.DeptID);
  75.                 Console.WriteLine("Department Name: " + dept.DeptName);
  76.                 Console.WriteLine("Department Location: " + dept.Location);
  77.                 Console.WriteLine("-------------------");
  78.             }
  79.         }
  80.     \

 

Benefici e non
+ Rimuove il codice duplicato.
+ Nasconde come si comporta l’algoritmo a seconda dell’oggetto.
+ Permette alle sottoclassi di customizzare l’algoritmo.

- Complica il design.

E non prendete come scusa: “il mio sistema ormai è troppo evoluto per poterne apportare queste migliorie. E’ troppo tardi.”

Se fosse realmente così non esisterebbe il Refactoring :)

posted @ sabato 20 giugno 2009 17.00 | Feedback (0) |

Powered by: