aprile 2004 Blog Posts
Per chi non vuole chiamare MS PSS per risolvere KB 818803 in .NET 1.1. le patch si possono scaricare da InstantASP per Windows 2000 e per Windows 2003 Server
1. Grab the nearest book.Building An ASP.NET Intranet2. Open the book to page 23.Eccola qui...3. Find the fifth sentence. unu, doi, trei, patru, cinci... conto più veloce in romeno :-)4. Post the text of the sentence in your journal along with these instructions."The most basic requirement here is having the .NET Framework installed."E sì, eh... :-)
Per chi non lo sapesse ancora, dal dicembre scorso un altro peso massimo, Ward Cunningham, ha deciso di lavorare per la Microsoft come architect nel gruppo PAG (Prescriptive Architecture Guidance). Chi manca ancora? :-)
Per chi lavora con Infragistics NetAdvantage 2004 Volume 1 e vuole utilizzare Infragistics.WebUI.UltraWebNavigator.UltraWebMenu non solo in maniera drag-and-drop del componente, un workaround per evitare System.NullReferenceException è questo:
sostituire la riga: string appDir = Page.Request.ServerVariables["APPL_PHYSICAL_PATH"];nel metodo: public int ReadXmlFile(string, bool, bool)della classe: Infragistics.WebUI.UltraWebNavigator.UltraWebMenu ("UltraMenu.cs")con: string appDir = System.Web.HttpContext.Current.Request.ServerVariables["APPL_PHYSICAL_PATH"];
Tante volte forse avete associato l'eredità con la flessibilità. Qui di seguito un punto di vista diverso ma altrettanto interessante:"Sealing members or leaving them non-virtual also allows you more flexibility in changing your class's implementation in the future, by limiting users' points of customization."(Brian Grunkemeyer, SLAR p. 72)
E se vi chiedete cosa vuol dire "begrudgingly" in inglese (nella stessa p. 72) , eccola qui spiegata :-) Pensavo che fosse una parola un po' begrunkemeyeriana... :-)
Continuo la serie con un esempio di uno Strategy (pp. 315-323 in GoF):8. la classe astratta System.Array, l'interfaccia System.Collections.IComparer e le classi che implementano questa interfaccia fanno lo Strategy dove:- System.Array fa la Context;- System.Collections.IComparer fa la Strategy;- le classi che implementano System.Collections.IComparer fanno le ConcreteStrategy;- il metodo Compare fa l'AlgorithmInterface;- i metodi BinarySearch e Sort fanno il ContextInterface.
Joel Marcey, che firma la prefazione del libro di Brad Abrams, è anche l'autore di questo piccolo e simpatico tool di cui racconta nella prefazione, scritto in C# (un'unica classe, Intel.DSL.ECMA.DocGen) per trasformare le specifiche CLI da XML a Word. Adesso si chiama, un po' pomposo :-), ECMA TR/84 e lo trovate qui (20,2 MB), sorgenti compresi (31,1 KB) :-)
Gianluca segnalava qui oggi le prime quattro parti della serie di post "On Designing Good Libraries" di Brad Abrams. La serie completa però finora comprende anche due post di commenti per le parti II e III. I post di questa serie sono in realtà appunti di un corso interno che Brad tiene agli sviluppatori del framework. L'archivio completo delle sue linee guida (non solo di questa serie) qui. Tanto che ci siamo date un occhio anche su FxCop Design Rules Index
"Patterns are discovered rather than written" - dice James W. Cooper nel suo libro (pag. 6) - una frase che mi piace molto. Perché infatti così è nato quell'all-time bestseller che ormai tutti chiamiamo GoF: dalla tesi di dottorato di ricerca di Gamma, tesi in cui analizzava dei pattern all'interno di un framework (ET++). C'è un articolo classico di Ralph Johnson (il terzo del Gang) "Documenting Frameworks using Patterns" pubblicato in quei primissimi tempi (1992) che vede i pattern come un mezzo importante per la documentazione di un framework. Lo trovate qua.
Il mese scorso avevo iniziato una serie di post dove individuavo (non in modo automatico) delle classi che implementano dei pattern (alcuni presi da GoF, altri da Fowler). Poi ho pubblicato un articolo che individua in modo automatico le classi singleton e sto lavorando ad un altro per l'individuazione di quelle che implementano il pattern Strategy. Fin quando non avremo metodi automatici per queste individuazioni, ci accontenteremo di scoprirle ad occhio.C'è un articolo di cui vi ho parlato (ieri e oggi) per niente male. Quello che vi presento qui di seguito è solo per fare un po' di ordine negli...
Nell'articolo su cui ho postato ieri, che individua alcune classi che implementano il pattern Factory Method all'interno del Framework .NET, c'è un errore: il FactoryMethod di cui parla non è GetApplicationInstance bensì GetNormalApplicationInstance. Comunque sia, non aspettatevi in questo caso un pattern Factory Method tanto classico.Sto organizzando gli esempi dell'articolo (togliendone alcuni e aggiungendone altri) in una tabella, spero più chiara, che la posterò stasera :-)
Per essere ancora più dottori in dotcctor (.cctor è l'abbreviazione di costruttore di classe), a parte la lettura del post di Brad Abrams segnalato oggi da Corrado e degli articoli di Jon Skeet e Satya Komatineni, otterrete un'immagine completa su questo argomento leggendo 4 pagine (pp. 187-190) nel libro di Richter e 3 (pp. 60-62) nel libro di Box e Sells. E se dopo ne avete ancora voglia e desiderate andare veramente fino in fondo, leggete per ultimo questo post del micidiale Chris Brumme.
Molto interessante una delle proposte di Jon Skeet alla fine del suo articolo:"An attribute would be a perfectly reasonable solution...
Bella notizia sul concorso di PC Professionale con dei premi veramente interessanti. Peccato però che su UGIdotNET è apparsa solo oggi (18/04/04) e l'applicazione con qui partecipare doveva essere inviata più di un mese fa (15/03/04)...
La regola "Type name acronyms of three or more characters are Pascal-cased" già esiste nell'FxCop. Cercherò allora un'altra per iniziare a giocare con Reflection Engine SDK.In un post precedente, segnalavo una trentina di classi che non rispettano questa regola.
Michael Fanning risponde così:"The MS Design Guidelines were developed concurrently with the framework"alla domanda:"Why analysis of a Microsoft assembly such as System.dll results in 1161 violations of which over half are errors. Do Microsoft not use this tool or consult their own guidelines internally?"
Farò per l'ennesima volta il pignolo (Uuuhhh...) ma ieri sul treno leggo il post di Brad Abrams "On Designing Good Libraries" dove nella sezione "Naming Patterns" trovo:"Abbreviations of more than 2 letters are cased as words, otherwise ALLUPPER (IO vs. Html)"e oggi incontro nel Framework un sacco di classi che non rispettano questo pattern - solo se ci limitiamo al namespace System.Security.Cryptography guardate quante sono:
CryptoAPITransform, DES, DESCryptoServiceProvider, DSA, DSACryptoServiceProvider, DSASignatureDeformatter, DSASignatureFormatter, HMACSHA1, MACTripleDES, PKCS1MaskGenerationMethod, RNGCryptoServiceProvider, RSA, RSACryptoServiceProvider, RSAOAEPKeyExchangeDeformatter, RSAOAEPKeyExchangeFormatter, RSAPKCS1KeyExchangeDeformatter, RSAPKCS1KeyExchangeFormatter, RSAPKCS1SignatureDeformatter, RSAPKCS1SignatureFormatter, SHA1, SHA1CryptoServiceProvider, SHA1Managed, SHA256, SHA256Managed, SHA384, SHA384Managed, SHA512, SHA512Managed, TripleDES, TripleDESCryptoServiceProvider, DSAParameters, RSAParameters.
Viva l'IntelliSense!!! :-)Se non vi...
Nell'articolo "The Factory Design Pattern", Amit Goel individua all'interno del Framework .NET delle classi che implementano il pattern Factory Method (GoF, pp. 107-116). Uno dei suoi esempi riguarda le classi del namespace System.Security.Cryptography. Se si analizza con attenzione, per esempio il "ramo" SymmetricAlgorithm-DES-DESCryptoServiceProvider, si trova il pattern in una variante non molto ortodossa. L'abbiamo chiamata Factory EndoMethod per il fatto che il FactoryMethod della classe Creator restituisce sempre Creator e non Product come nella variante originale del pattern e il FactoryMethod della classe ConcreteCreator restituisce a sua volta ConcreteCreator e non Product (mi sono ispirato al termine endomorfismo che i...
Nel commento della classe interna System.__Filters si può leggere:
"The following are the built in filters defined for this class. These should really be defined as static methods. They are used in as delegates which currently doesn't support static methods. We will change this once the compiler supports delegates."
o in quello del costruttore static della classe System.Type:
"Because the current compiler doesn't support static delegates the _Filters object is an object that we create to contain all of the filters."
Lo so, è un'osservazione un po' da pignolo :-) ma i metodi di questa classe (System.__Filters) sono ancora instance (dal luglio 1998...) e...
Essere direttore worldwide del programma MVP a volte vuol dire fare la danza del drago - non era il drago, simbolo di forza e benevolenza, così come lo sono gli MVP? :-)
In VJ# è possibile tramite VS passare /win32res al compilatore. In VC#, proprio no...
Per chi, come me, deve utilizzare file di risorse unmanaged (Win32) in applicazioni .NET, questo articolo di Kenny Kerr, "Icon Browser: An Exercise in Resource Management" sarà di grande aiuto.Nel mio progetto, un porting di un prodotto client/server scritto in VB6 in un'applicazione web scritta in ASP.NET e C#, devo utilizzare le icone di un file .RES (non è proprio banale)
Per vedere se un tipo t è delegate o no, basta verificare se deriva da System.MulticastDelegate:
t.BaseType != null && t.BaseType.Equals(typeof(System.MulticastDelegate))
cioè non è necessaria la verifica singlecast (System.Delegate). La storia strana che spiega tutto ciò la potete leggere nel libro di Richter (pp. 375-376 per la traduzione italiana) e nel post di Brad Abrams.
Appena uscito il mio articolo sui singleton all'interno di .NET, ecco che ne ho trovato un altro: si chiama Greg - Greg Singleton :-) - ed è PM nel CLR Team for the .NET runtime's configuration infrastructure and administration tools.A parte gli scherzi, sono contento che ad alcuni è piaciuta l'idea dell'articolo e spero che verso la fine di questo mese ne sarà pubblicato un altro (sempre qua)