Insane C# Development

Freitag, November 23, 2007

Why I hate VBA

VBA

Wer auch immer Funktionen mit [Arg1], [Arg2], [Arg3], [Arg4], [Arg5], [Arg6], [Arg7], [Arg8], [Arg9], ..., [Arg30] definiert hat gehört wirklich verprügelt. Wenn man diese API nun mit C# aufrufen würde, man würde folgendes schreiben müssen:

object oAddress = "nikole123@bla.com";
object oMissing;
oMissing = Type.Missing;
Dialog(xyz).Show(ref oAddress, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

Labels: ,

Mittwoch, November 21, 2007

Phase Oriented Programming

Heute bin ich über Jon Skeets Blog gestolpert und auf eine Interessante Idee zu "Phase-Oriented-Programming" gestoßen.

http://msmvps.com/blogs/jon.skeet/archive/2007/02/28/wacky-ideas-3-object-life-cycle-support.aspx

Es geht im Prinzip darum die Initialisierung-, Verwendungs- und Dekompositionsphasen eines Objektes festzulegen und Methodenaufrufe nur in denjenigen Phasen zuzulassen für die diese designed wurden.

So entfallen dauernde Überprüfungen ob das Objekt bereits initialisiert ist, dies wird automatisch durch ein AOP-Framework durchgeführt. So spart man sich viel Code und viele potentielle Fehler in Situationen in denen ein Objekt beispielsweise nicht benutzt werden darf bevor Connect() aufgerufen wurde, oder nicht mehr nach Dispose() verwendet werden darf.

Ihr werde dies mal ein wenig weiterverfolgen und mit PostSharp implementieren. Scheint ein interessanter Aspekt zu sein, könnte Super-Statefull-Klassen in Zukunft einfacher zu entwickeln machen.

Hier der interessante Codeausschnitt aus seinem Blog: Es geht darum eine Klasse zu designen in welcher "normale" public Methoden nur in "Phase 2" ohne Exception aufrufbar sind, und in welcher eine bestimmte Methode eine Transition von Phase 1 nach 2 triggert:

[Phased(defaultRequirement=2, initial=1)]
class Sample
{
IAuthenticator authenticator;

public IAuthenticator Authenticator
{
[Phase(1)]
[Phase(2)]
get
{
return authenticator;
}
[Phase(1)]
set
{
authenticator = value;
}
}

[Phase(1)]
[PhaseTransition(2)]
public void ValidateAndInitialize()
{
if (authenticator==null)
{
throw new InvalidConfigurationException("I need an authenticator");
}
}

public void DoSomething()
{
// Use authenticator, assuming it's valid
}

public void DoSomethingElse()
{
// Use authenticator, assuming it's valid
}
}