Aspect Oriented Programming - PostSharp e altri framework


Mi collego al post di Antonio di Motta per segnalare questo framework, una serie di link e fare il punto di quanto ne so su AOP.

Per dare una definizione breve (Wikipedia):

Aspect-oriented programming (AOP) is a programming paradigm that increases modularity by allowing the separation of cross-cutting concerns.
Separation of concerns entails breaking down a program into distinct parts (so-called concerns, cohesive areas of functionality). All programming paradigms support some level of grouping and encapsulation of concerns into separate, independent entities by providing new abstractions (e.g. procedures, modules, classes, methods) that can be used to represent these concerns. But some concerns defy these forms of encapsulation and are called crosscutting concerns because they "cut across" multiple abstractions in a program.

In pratica è una modalità differente di concepire la struttura del software. Esistono dei concetti (aspetti) molto trasversali, rispetto al dominio applicativo. Mi vengono in mente tracing, logging, gestione delle eccezioni, gestione della sicurezza... solo per citarne alcuni.
In un classico approccio OO prevederemmo le nostre classi (o componenti/servizi se volessimo riutilizzare quanto già sviluppato) e, ovunque volessimo "curare" questi aspetti, inseriremmo chiamate a metodi di questi oggetti. Seguendo questo approccio si "sporcherebbe" la logica applicativa del nostro dominio con aspetti che non c'entrano molto con esso.

La programmazione orientata agli aspetti serve a separare maggiormente i concetti cross-cutting dal dominio applicativo, semplificando l'ancoraggio di questi aspetti al dominio in modo molto discreto e poco invasivo. Mi vengono in mente, per parlare di .Net, gli attributi custom o inversione di controllo; le modalità di inserimento di queste ancore potrebbero essere molteplici. Dipende tutto dal framework utilizzato o dalla propria fantasia.

PostSharp è proprio un framework implementato allo scopo di supportare AOP in .Net. Mentre nel modo Java i framework sono molteplici ma credo vada per la maggiore AspectJ, in .Net non c'era molta scelta. Io avevo sentito parlare di NAspect:

NAspect is an Aspect Oriented Programming (AOP) framework, which uses runtime subclassing in order to inject interceptors and mixins into your classes. It supports method, property and constructor interception.

Non credo sia molto manutenuto. O almeno non ne ho notizia. Per quanto riguarda PostSharp, consiglio di dare un'occhiata al video. Fantastico! Non sono mai stato così tentato dal riscrivere un'applicazione in produzione da 0 come adesso! :)

Cercando informazioni utili per questo post su NAspect, ho trovato questo link, un post in cui si elogiano le caratteristiche di debugging di NAspect.

Qualche altro link utile:

HTH

author: Antonio Santise | posted @ giovedì 25 settembre 2008 23.12 | Feedback (1)

Deadlock e Profiler di SQL Server 2005


Segnalo questo interessantissimo articolo su come individuare/monitorare un deadlock con il profiler di Sql Server 2005.
La cosa interessante è il grafo: graficamente dà subito l'idea di cosa è successo.

Anche SqlExpressProfiler offre la possibilità di monitorare, tra gli altri eventi, i deadlock e disegna anche un grafo!. Niente male per un tool completamnete free. L'interfaccia è un po' più spartana e la ricerca lascia un po' a desiderare, ma se non potete permettervi una licenza standard o developer di Sql Server, questo tool va benissimo.

HTH

author: Antonio Santise | posted @ giovedì 25 settembre 2008 17.56 | Feedback (0)

Il ruolo di un Architetto


Mi convinco sempre di più che da grande voglio fare questo, anche se il titolo di sw architect mi piace meno di sw engineer:p
Scherzi e definizioni a parte, segnalo un articolo interessante sul ruolo che l'architetto (quello serio) dovrebbe avere all'interno di un team e le motivazioni che possono spingere ad essere dei bravi architetti.

L'articolo è su The Architecture Journal
Altre risorse utili su MSDN.

author: Antonio Santise | posted @ venerdì 2 maggio 2008 11.35 | Feedback (0)

Paginazione lato server con Sql 2005 - 3 tecniche differenti


Avevo già postato sulla paginazione lato server (da db) per paginare i dati su una web form.

Nei giorni scorsi ho avuto modo di rileggere un paio di articoli interessanti e ho cercato di fare il punto e confrontare diverse soluzioni.
In pratica ho confrontato le seguenti 3 tecniche:
  • utilizzo di una Common Table Expression (CTE) + funzione RowNumber()
  • utilizzo di una tabella di appoggio temporanea (#tmp, quindi tempdb)
  • utilizzo di una variabile di tipo table (@tmp, quindi memoria)
Con Sql 2k si possono usare solo le ultime 2.

Di seguito lo pseudo-code (di pseudo c'è solo il nome dei campi e delle tabelle). Ho assunto che la tabella abbia una primary key key identity(1,1) e che i field da estrarre siano field_1... field_n. Spero di essere stato chiaro ;)
Provatelo voi stessi su una tabella con qualche milione di righe e vedrete: la soluzione MSSql 2k5 + CTE + ROW_NUMBER() è la migliore. Buon test.

Link utili:

L'esempio:

DECLARE @PageNumber int
DECLARE @PageSize int
SET @PageNumber = 1;
SET @PageSize = 100;

declare @t1 datetime
declare @t2 datetime
set @t1=getdate();
set @t2=getdate();

 WITH Paged AS
(
SELECT key, field_1,field_2, ... field_n, ROW_NUMBER() OVER (ORDER BY clausola_order) AS RowNumber
FROM table
WHERE (le_nostre_clausole_di_selezione)
)
SELECT key, field_1,field_2, ... field_n, BET
FROM Paged
WHERE RowNumber > ((@PageNumber - 1) * @PageSize) AND RowNumber <= (@PageNumber * @PageSize)
ORDER BY clausola_order

set @t2=getdate()
print (datediff(ms,@t1,@t2))
set @t1=getdate()

declare @tmp table (id int identity(1,1), key int, ...)
insert into @tmp
SELECT key, field_1,field_2, ... field_n
FROM table
WHERE (le_nostre_clausole_di_selezione)
ORDER BY clausola_order

SELECT key, field_1,field_2, ... field_n
FROM @tmp
WHERE id > ((@PageNumber - 1) * @PageSize) AND id <= (@PageNumber * @PageSize)

--drop table @tmp

set @t2=getdate()
print (datediff(ms,@t1,@t2))
set @t1=getdate()

create table #tmp (id int identity(1,1), key int, ...)
insert into #tmp
SELECT key, field_1,field_2, ... field_n
FROM table
WHERE (le_nostre_clausole_di_selezione)
ORDER BY clausola_order

SELECT key, field_1,field_2, ... field_n
FROM #tmp
WHERE id > ((@PageNumber - 1) * @PageSize) AND id <= (@PageNumber * @PageSize)

--drop table #tmp

set @t2=getdate()
print (datediff(ms,@t1,@t2))
set @t1=getdate()


Della prima esiste anche la variante senza CTE, ma il risultato non cambia:

SELECT key, field_1,field_2, ... field_n
FROM
(
    SELECT key, field_1,field_2, ... field_n, ROW_NUMBER() OVER (ORDER BY BET DESC) AS RowNumber
    FROM table
    WHERE (le_nostre_clausole_di_selezione)
    ORDER BY clausola_order
) a
WHERE RowNumber > ((@PageNumber - 1) * @PageSize) AND RowNumber <= (@PageNumber * @PageSize)

set @t2=getdate()
print (datediff(ms,@t1,@t2))
set @t1=getdate()

Ricordiamoci che la CTE è solo un alias per usare una stessa query in più punti: al posto di replicae del codice T-Sql, lo si scrive una volta per tutte. E' sempra la solita vecchia query innestata, in fondo.

author: Antonio Santise | posted @ martedì 22 aprile 2008 17.57 | Feedback (0)

OOXML (forse) standard, polemiche e pregiudizi


Dopo il post di Raffaele sulla standardizzazione ISO di OOXML, ho letto qualche nota non proprio altrettanto entusiasta.
Il post di Raffaele lodava i meriti della standardizzazione del formato (minore libertà di modificare a piacimento il formato std) ma soprattutto esprimeva il concetto "tutto è migliorabile, adesso cominciamo".
Di oggi è la notizia che da diversi fronti stanno sollevando polemiche per la standardizzazione.
IBM, RedHat ed altri stanno contestando vivacemente il consorzio... mentre la commissione europea ha aperto un'inchiesta per verificare eventuali "influenze" di MS nelle decisioni dello stesso consorzio.
Certo che di MS si potrebbe dire tutto e l'esatto contrario, ma alcuni pregiudizi (o luoghi comuni) non moriranno mai! :(
E se lo dico io...

author: Antonio Santise | posted @ venerdì 4 aprile 2008 11.25 | Feedback (6)

Silverlight - Applicazione HardRock


Bellissimo: http://memorabilia.hardrock.com/
Davvero una bellissima applicazione... la velocità, i dettagli... lo scroll del mouse!
Fantastico!

author: Antonio Santise | posted @ giovedì 3 aprile 2008 0.14 | Feedback (1)

Gestione delle identità con Higgins


Da DataBusiness:

Higgins, che conta Ibm e Novell fra gli sviluppatori, ha l’intento di fornire agli sviluppatori un quadro applicativo che consenta loro di integrare l’insieme delle informazioni legate alla gestione delle identità e ricavati da fonti eterogenee, quindi basati su diversi standard, come Ws-Trust, OpenId o Saml. Una delle particolarità di Higgins è di fornire uno strato di astrazione per favorire la portabilità dei dati sulle identità. Questo, in un ambiente middleware, garantisce, soprattutto grazie all’integrazione di Higgins Identity Attribute Service, un livello dedicato alle identità messo sopra quello dei dati.

Higgins è interoperabille con CardSpace e come questo propone un selettore di identità che si basa su un sistema di i-card. Entrambe le soluzioni partono dal principio che ogni applicazione ha necessità differenti in termini di autenticazione, Il selettore di identità, dunque, consente di scegliere un’identità integrata al browser in funzione dell’autenticazione da fornire a un sito.

Mi sembra un'ottima premessa per leggere il resto: http://www.eclipse.org/higgins/about.php

author: Antonio Santise | posted @ venerdì 7 marzo 2008 11.54 | Feedback (0)

Asynchronous Method Invocation


Interessante ed esauriente articolo di mikeperetz sull'invocazione di metodi in modo asincrono (Asynchronous Method Invocation: How to use .NET to call methods in a non-blocking mode).
Risale al luglio 2006, ma lo considero il mio bigino.
Contiene interessanti spunti per la gestione delle eccezioni, il passaggio parametri (by val, ref e out), e anche un cenno al pattern Command.

author: Antonio Santise | posted @ martedì 18 dicembre 2007 10.36 | Feedback (2)

Object-Relational Mapping Tool for .NET


Già segnalato da Matteo, lo inserisco anche io a futura (mia) memoria: Object-Relational Mapping Tool for .NET

author: Antonio Santise | posted @ lunedì 17 dicembre 2007 16.04 | Feedback (0)

[OT] A botta sicura! :)


Nessun commento, solo mi chiedo (due punti e accapo):
1) ho sbagliato lavoro
oppure
2) certa gente non ha nulla da fare tutto il giorno?

:D

Argomento: prostituzione a Milano
Mappa
Fonte

author: Antonio Santise | posted @ mercoledì 12 dicembre 2007 14.51 | Feedback (1)