-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
Clean Code Developer - Gedanken zum Online-Meeting
10.02.09 - Entwicklung, Diskussionen, Patterns, Software Testing, Qualitätsmgmt. Beitrag von Norbert Eder| | Gestern hatte es das 3. Online Meeting von ALT.NET DE zum Thema Clean Code Developer (CCD) gegeben. Mit dabei war jede Menge Prominenz der deutschsprachigen .NET Community.
Ich möchte an dieser Stelle jetzt nicht das Thema Clean Code Developer (= die Initiative) breittreten - da kann sich jeder auf oben verlinkter Site informieren. Vielmehr möchte ich auf einen gestrigen Aspekt eingehen, dem ich nicht so wirklich zustimmen möchte und den ich gerne diskutieren würde.
Grundsätzlich, damit ich nicht falsch verstanden werde: Ich finde diese Initiative sehr gut, sie erhält meine vollste Unterstützung und auch ich versuche tagtäglich, mich und meinen Output zu verbessern.
Einer der Punkte, der gestern aufkam, betraf die Verteilung der Prinzipien, Paradigmen und Werte. Hier kam mehrfach zur Sprache, dass denn die Hersteller von Entwicklungstools, als auch die Lehre (konkret wurden Fachhochschulen angesprochen) hauptsächlich zur Verbreitung dieser Bewegung beitragen sollten, dies aber lange Zeit vernachlässigt wurde bzw. immer noch wird. Durch das Eine oder Andere Zitat eines FH-Professors sollte dies weiter unterstrichen werden.
Da ich selbst an einer Fachhochschule unterrichte und daher die "andere Seite" auch ganz gut kenne, möchte ich dazu meine Gedanken einbringen (dies gilt auch für Trainingscenter etc.):
Ich kann nicht beurteilen, wie Fachhochschulen in Deutschland aufgestellt sind. Ich kenne einige in Österreich und weiß daher, dass an zahlreichen Fachhochschulen wichtige Prinzipien zur Erhöhung der Software-Qualität gelehrt werden. Woraus besteht dies in vielen Fällen?
- Vermittlung des notwendigen Stoffes
- Hervorhebung der sich daraus ergebenden Vorteile
- Laufende Verwendung, sofern möglich
- Bei Bedarf Diskussion und Gegenüberstellung
Dies bedeutet: Die Lehre vermittelt das notwendige Wissen (Qualitätssicherungsmaßnahmen, Code Metriken, Code Coverage, Versionierung, Test, etc.). Auf dieser Basis werden die Vorteile klar hervorgehoben und versucht, diese in sämtlichen Projekten einzusetzen (Teile werden zwingend vorgegeben).
Was aber jetzt nicht durch die Lehre passieren kann (konträr zu einigen gestrigen Meinungen) ist, dass dieses Muster in jeden hinein geprügelt werden kann. So funktioniert es nicht. Der angehende Entwickler (egal ob durch eine Ausbildung, ein Training, FH, Uni, etc.) muss von sich aus die Vorteile aufnehmen und sich selbst dahin bringen, diese laufend einzusetzen. Der Vortragende kann den Grundstock legen. Genauso wie es der Hersteller von Entwicklungswerkzeugen kann. Aber weder der Vortragende, noch der Hersteller können den Entwickler zwingen.
Aus dieser Sichtweise heraus ist es ebenfalls unwesentlich, ob diverse Praktiken vom Vorgesetzten unterstützt werden oder nicht. Wer um Qualität bemüht ist, wird dies umsetzen. So oder so. Wer um Qualität bemüht ist, wird sich fortbilden bzw. nach entsprechenden Möglichkeiten suchen. Wer gezwungen wird, der lehnt sich dagegen auf. Das ist der natürliche Lauf der Dinge.
Fazit: Es braucht Multiplikatoren (Hersteller, Vortragende, aber VOR ALLEM Entwickler), welche die Vorteile aufzeigen, die unterstützend tätig sind, damit möglichst viele auf diesen Zug aufspringen. Aber niemand kann von einem Absolventen erwarten, dass er es genau so macht und dann der Ausbildungsstätte die Schuld zuweisen, es würde nicht gelehrt werden. Daher mache ich den Softwareentwickler (fast) alleine für (fehlende) Qualität verantwortlich. Schließlich heißt es ja auch Clean Code Developer.
| | | 2 Kommentare
- 6694 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Einfache Verbesserungen für kleine Teams
11.09.08 - Diskussionen, Patterns, Projektmgmt., Qualitätsmgmt. Beitrag von Norbert Eder| | Immer wieder, wenn ich mit kleinen Entwickler-Teams zu tun habe, sehe ich, dass dieselben Probleme vorhanden sind. Meist dreht es sich um die folgenden Punkte:
- Das Projekt wurde nicht ausreichend spezifiziert. Der Auslöser für das Projekt kennt die genauen Anforderungen, brachte diese jedoch nie vollständig in ein Dokument. Sollte ein Dokument vorhanden sein, findet dieses oft nicht den Weg zum Entwickler. Daher erhält dieser oft unzureichende Informationen, um das Projekt erfolgreich durch zu führen.
- Keine Arbeitspakete. Soll ein Projekt durchgeführt werden, muss eine Analysephase durchlaufen werden. Im Zuge dieser Phase sind Arbeitspakete zu definieren. Diese erleichtern zum Einen die Abgrenzung zu anderen ToDo's und ermöglichen eine Kontrolle. Zeitschätzungen dafür werden sehr oft ebenfalls nicht angegeben. Deswegen gestaltet sich eine Kontrolle schwierig.
- "Drauf-los-Entwicklung". Die Vorgaben sind bekannt und es wird einfach einmal entwickelt. Zukünftige Anforderungen werden nicht in Betracht gezogen, auch wird erst bei der Integration der einzelnen Teile in Erfahrung gebracht, ob diese überhaupt miteinander harmonieren. In den meisten Fällen sind größere Änderungen notwendig.
- Kontrolle. Zum Thema Kontrolle gibt es zwei Wege die hauptsächlich durchschritten werden: Entweder findet keine Kontrolle statt (oder erst ca. 2 Wochen vor Auslieferung) oder es wird versucht das ultimative Kontrollsystem einzuführen. Oft wird hierbei jedoch auf notwendige Vorarbeiten vergessen, wodurch eine Kontrolle gar nicht durchgeführt werden kann (Arbeitspakete in Kombination mit Zeitschätzungen als Beispiel).
- Ressourcen-Planung. Ressourcen müssen geplant werden. Freie Kapazitäten sollten vor Annahme eines Projektes bekannt sein. Ebenso sollte bekannt sein, dass eventuell zwischenzeitlich Ressourcen für andere Projekte abgestellt werden müssen - und zu welchem Umfang. Viele Teams werden von plötzlicher Ressourcen-Knappheit überrascht, da plötzlich Entwickler zu anderen Projekten abgezogen werden müssen. Es gilt daher eine saubere Ressourcen-Planung durch zu führen und - wenn notwendig - frühzeitig für Ausgleich zu sorgen.
- Der fehlende Architekt. Nicht jeder Softwareentwickler ist zum Architekten geboren. Großes Wissen und viel Erfahrung ist notwendig, um zukunftssichere Grundgerüste zu entwickeln. Gerade kleine Teams haben oft keinen "gelernten" Architekten zur Verfügung. In diesem Fall kommt es für die meisten Projekte billiger, sich zumindest für das Grundgerüst eine entsprechende Person zu zu kaufen.
Dies sind einige Punkte, auf die ich immer wieder in der Praxis stoße. Die einen Teams leben dabei nach dem Motto "Es wird schon irgendwie gehen", wobei die anderen definitiv nach Verbesserung streben. Ich persönlich kann nur jedem Team bzw. jedem kleinen Softwareunternehmen raten, sich zumindest für ein paar Stunden einen Spezialisten zu zu kaufen. Sind bisherige Abläufe bekannt (grobe Abläufe lassen sich in kurzer Zeit ohne Weiteres feststellen), können selbst kleine Änderungen große positive Auswirkungen auslösen.
Will ein Unternehmen dafür kein Geld an externe Personen vergeben, dann sollten zumindest meine aufgeführten Punkte mit der eigenen Vorgehensweise reflektiert werden. Alleine daraus lassen sich einige Verbesserungsmaßnahmen ableiten.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
WPF, NHibernate, ObservableCollection und Patterns
10.08.08 - Entwicklung, Diskussionen, Patterns, .NET, WPF Beitrag von Norbert Eder| | Im Beitrag ObservableCollection und NHibernate hatte ich einen Link zu einem Artikel gepostet, der zeigt, wie man NHibernate dazu bringt, mit einer ObservableCollection zu arbeiten.
Nun, ein paar Tage später, finde ich die Sache dann doch nicht mehr ganz so toll, gerade wenn Patterns mit ins Spiel kommen (was hoffentlich der Fall ist). Man nehme als Beispiel die bereits von mir vorgestellten Patterns MVC für WPF und Model-View-ViewModel. Diese beiden Patterns unterscheiden sich unter anderem dadurch, dass beim MVC Controller und Model komplett getrennt sind. Beim MVVM ist dies zwar auch der Fall, jedoch stellt das ViewModel sowohl die Controller-Funktionalität zur Verfügung, als auch eine gewrappte Form des Models.
Was bedeutet dies nun konkret?
Bei der Verwendung des MVVM Patterns zusammen mit NHibernate bedarf es keiner speziellen Erweiterung oder Anpassung. Das Model verwendet weder eine ObservableCollection noch wird irgendein für WPF benötigtes Interface implementiert (siehe beispielsweise INotifyPropertyChanged). Damit ist es möglich, NHibernate zu nutzen, wie es auch ausgeliefert wird. Beim MVC-Pattern müsste hier der im verlinkten Artikel angesprochene Handkniff getätigt werden, um in den Genuss der für das Data Binding notwendigen Events zu gelangen.
Was kann daraus abgeleitet werden?
Der – zumindest für mich – wesentliche Punkt ist, dass es sinnvoll wäre, das zu verwenden, was sich bereits vielfach bewährt hat. NHibernate hat sich bereits in sehr vielen Projekten bewährt und man kann sich auf eine korrekte Funktionsweise verlassen. Aus diesem Grund würde ich eher die Finger von einer ObservableCollection-spezifischen Erweiterung lassen (auch wenn es lediglich eine Handvoll Klassen sind) und hier auf das MVVM-Pattern zu setzen, welches eben diese Änderung nicht benötigt.
Damit muss man sich bei einem Update keine Sorgen machen und wer weiß, vielleicht gibt es ja bald eine entsprechende Unterstützung.
Was meint ihr dazu?
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
WPF und MVC
08.06.08 - Entwicklung, Diskussionen, Patterns, .NET, WPF Beitrag von Norbert Eder| | Anwendungen sollten nicht nur schön anzusehen sein, sondern auch das robust und korrekt tun, wofür sie geschaffen wurden. Damit dem so ist, muss sich der Entwickler/Architekt natürlich zu Beginn eines Projektes so einige Gedanken machen. Denn nur durch ein gutes Grundgerüst werden Anforderungen á la Erweiterbarkeit, Testbarkeit, einfache Wartung usw. auch erfüllt.
Das Model View Controller Pattern ist da so ein Ansatz. Mittlerweile Jahrzehnte am Buckel hatte sich dieses Pattern immer wieder bewährt (in seiner ursprünglichen Form oder in einer abgewandelten).
Wie nun die Windows Presentation Foundation mit dem Model View Controller Pattern zusammen arbeitet, zeigt der Artikel MVC Pattern mit WPF verwenden, welchen ich gestern auf .NET GUI veröffentlicht habe.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
.NET BlogBook Ausgabe 6
14.04.08 - Entwicklung, Diskussionen, Patterns, Software Testing, Projektmgmt., Qualitätsmgmt., .NET, Grundlagen, Base Framework, WPF, ASP.NET, Silverlight, Mobile Devices, Datenverwaltung, Visual Studio, Allerlei, Microsoft Office, SQL Server Beitrag von Norbert Eder| | Ab sofort steht die 6. Ausgabe des .NET BlogBooks zur Verfügung. Insgesamt stehen nun fast 330 Seiten an puren Informationen und Praxiswissen zur Verfügung.
Noch dazu wurden einige Anregungen aufgegriffen. Es gibt ein neues Cover (ein herzliches Dankeschön an 69° media solutions). Ebenfalls wurden unnötige dunkle Stellen entfernt, die beim Ausdrucken maximal Toner verbrauchen, sonst jedoch keinerlei Wirkung erzielen.
Hauptsächlich wurde das BlogBook um Wissen rund um die Windows Presentation Foundation erweitert, aber auch andere Punkte kamen hinzu. Ein Blick lohnt sich allemal.
Weitere Informationen sind auf der Homepage unter http://www.dotnet-blogbook.com zu finden.
Für Anregungen, Wünsche und (konstruktive) Kritik haben wir natürlich weiterhin ein offenes Ohr.
| | | 6 Kommentare
- 1363 mal angesehen
| 1 Trackbacks
| Permalink | Trackback-URL |
Undo und Redo implementieren
12.03.08 - Entwicklung, Diskussionen, Patterns, .NET, Grundlagen, Base Framework, WPF, ASP.NET Beitrag von Norbert Eder| | Es kommt ja doch häufig vor, dass eine Anwendung ein Undo bzw. ein Redo unterstützen muss. Wird diese Funktionalität gefordert wird immer wieder nach einer Umsetzungsmöglichkeit gefragt. Hier eine kleine Lösung, die für diese Zwecke verwendet werden kann.
Hinweis: In diesem Beispiel werden keine Fehlerabfragen gemacht. Es empfiehlt sich, einen Ausführungsstatus zu integrieren, der das Verhalten entsprechend beeinflusst.
Design
Um diese Funktionalität umzusetzen, wird das Command-Pattern verwendet. Dieses eignet sich sehr gut dazu, Aktionen auszuführen und diese auch wieder zurück zu nehmen. Erweitert wird das Command-Pattern um einen CommandManager, der für die Ausführung und Verwaltung der einzelnen Commands zuständig ist.
Implementierung
Zuerst wird eine Basisklasse für den Command implementiert, welche die Methoden Execute(), Undo und Redo zur Verfügung stellt.
public abstract class Command
{
public abstract void Execute();
public abstract void Undo();
public abstract void Redo();
}
Als weiteren Schritt wird der CommandManager implementiert. Dieser ist in diesem Fall ein Singleton (damit er nur einmal pro Instanz vorhanden sein kann) und bietet nach aussen hin die selbe Funktionalität wie ein Command an. Intern werden die einzelnen Commands jedoch in einem Stack behalten, um den Verlauf der einzelnen Commands nachvollziehen zu können. Darüber kann nun ein Undo bzw. ein Redo abgebildet werden.
public class CommandManager
{
#region Static Attributes
private static object _lockObject = new object();
private static CommandManager _instance = null;
#endregion Static Attributes
#region Attributes
private Stack<Command> _commandStack = new Stack<Command>();
private Stack<Command> _undoneStack = new Stack<Command>();
#endregion Attributes
#region ctor
private CommandManager() { }
#endregion ctor
#region Static Methods
public static CommandManager GetInstance
{
get
{
if (_instance == null)
{
lock (_lockObject)
{
_instance = new CommandManager();
}
}
return _instance;
}
}
#endregion Static Methods
#region Public Methods
public void Execute(Command command)
{
command.Execute();
_commandStack.Push(command);
}
public void Redo()
{
Command redoCommand = _undoneStack.Pop();
redoCommand.Redo();
_commandStack.Push(redoCommand);
}
public void Undo()
{
Command undoCommand = _commandStack.Pop();
undoCommand.Undo();
_undoneStack.Push(undoCommand);
}
#endregion Public Methods
}
Damit ist die eigentliche Implementierung bereits abgeschlossen und wir können zu einem ersten Test schreiten. Hierzu benötigen wir ein paar kleinere Klassen, die nicht wirklich etwas aufregendes machen.
Hier eine Klasse Person, die zwei Eigenschaften zur Verfügung stellt, anhand derer getestet wird. Zudem implementiert sie das Interface ICloneable (wird im nachfolgenden Command benutzt) und überschreibt die ToString-Methode.
public class Person : ICloneable
{
#region Properties
public String Firstname { get; set; }
public String Lastname { get; set; }
#endregion Properties
#region ICloneable Members
public object Clone()
{
Person p = new Person();
p.Firstname = this.Firstname;
p.Lastname = this.Lastname;
return p;
}
#endregion ICloneable Members
#region Overrides
public override string ToString()
{
return String.Format("{0}, {1}", Lastname, Firstname);
}
#endregion Overrides
}
Als nächsten Schritt müssen wir noch einen konkreten Command implementieren, der eine Aktion durchführt. Dieser wird sich lediglich ein wenig mit den Eigenschaften der Person spielen:
public class PersonCommand : Command
{
private Person _person;
private Person _personStateBefore;
public PersonCommand(Person person)
{
_person = person;
}
public override void Execute()
{
_personStateBefore = _person.Clone() as Person;
_person.Firstname = "Norbert";
_person.Lastname = "Eder";
}
public override void Undo()
{
_person.Firstname = _personStateBefore.Firstname;
_person.Lastname = _personStateBefore.Lastname;
}
public override void Redo()
{
Execute();
}
}
Wichtig ist an dieser Stelle nur, dass sich der Command den ursprünglichen Status des übergebenen Objektes merkt und somit eine Undo bzw. Redo-Funktionalität anbieten kann.
Schlussendlich ein Stück Code, welches bei mir in einer Konsolen-Anwendung direkt in der static void Main ausgeführt wird:
CommandManager manager = CommandManager.GetInstance;
Person p = new Person();
p.Firstname = "<not set>";
p.Lastname = "<not set>";
Console.WriteLine(
String.Format("Before first execution: " + p.ToString()));
manager.Execute(new PersonCommand(p));
Console.WriteLine(
String.Format("After first execution : " + p.ToString()));
manager.Undo();
Console.WriteLine(
String.Format("After undo : " + p.ToString()));
manager.Redo();
Console.WriteLine(
String.Format("After redo : " + p.ToString()));
Console.Read();
Und nun möchte ich das Ergebnis nicht vorenthalten:
Fazit
Wie zu sehen ist, ist ein Undo bzw. Redo-Mechanismus sehr einfach zu implementieren. Abhängig der Umgebung in welcher diese Methode zu tragen kommt, müssen eventuell weitere Mechanismen eingefügt werden.
| | | 9 Kommentare
- 2602 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Verhalten einer Anwendung per Konfiguration bzw. Laufzeit verändern
27.02.08 - Entwicklung, Diskussionen, Patterns, .NET, Grundlagen Beitrag von Norbert Eder| | Abgrenzung
In diesem Artikel wird folgendes gezeigt:
- Austauschen von Verhaltensweisen via Konfiguration als auch zur Laufzeit
- Austauschen von einzelnen Methoden via Konfiguration als auch zur Laufzeit
Einführung
In vielen Fällen ist es notwendig, Verhaltensweisen über die Konfiguration oder per Laufzeit zu steuern. Als Beispiel: Nehmen wir eine Anwendung, die unterschiedliche Listen zur Verfügung stellt. Nun müssen die Daten für diese Listen geladen werden, damit sie angezeigt werden können. Unter der Annahme, dass alle Daten aus einer Datenbank kommen ist es kaum notwendig, dieses Verhalten zu verändern. Nun kann es aber sein, dass Inhalte für bestimmte Listen nicht aus der Datenbank kommen, sondern aus anderen Quellen. Das Standardverhalten würde nun nicht mehr funktionieren und muss daher ausgetauscht werden.
Ein weiterer häufig auftretender Punkt ist, dass zwar grundsätzlich das Standardverhalten verwendet werden soll, bis auf einen kleinen Teil, beispielsweise eine bestimmte Methode.
Strategy Pattern hilft bei Verhaltensänderungen
Da Verhaltensweisen getauscht werden können, liegt es nahe, sich im Bereich der Behavioral Patterns umzusehen. Darunter ist das Strategy-Pattern zu finden. Dieses ermöglicht, das gesamte Verhalten auszutauschen. Hier eine UML-Übersicht dieses Patterns:
Im Diagramm ist der Aufbau einfach zu erkennen. Grundsätzlich wird ein Interface IStrategy zur Verfügung gestellt. Dieses schreibt die Methode DoWork vor, welche dann die tatsächliche Aufgabe ausführt. Dieses Interface wird von zwei konkreten Klassen implementiert: ConcreteStrategy1 und ConcreteStrategy2. Beide Klassen besitzen also die Methode DoWork. Allerdings unterscheiden sich diese beiden Implementierungen voneinander, sprich das Verhalten ist ein unterschiedliches (sonst würde auch die Erstellung von zwei konkreten Klassen wenig sinnvoll sein). Schließlich gibt es noch einen StrategyContext. Dieser bekommt über den Konstruktor ein IStrategy übergeben. Dieses bestimmt nun das Verhalten. Die Aufrufe erfolgen über den StrategyContext, wodurch die Funktionalität aus dem übergebenen Strategy-Objekt aufgerufen wird. Eine Beispiel-Implementierung sieht so aus:
public interface IStrategy
{
void DoWork();
}
public class ConcreteStrategy1 : IStrategy
{
#region IStrategy Members
public void DoWork()
{
Console.WriteLine("ConcreteStrategy1");
}
#endregion
}
public class ConcreteStrategy2 : IStrategy
{
#region IStrategy Members
public void DoWork()
{
Console.WriteLine("ConcreteStrategy2");
}
#endregion
}
public class StrategyContext
{
private IStrategy _strategy;
public StrategyContext(IStrategy strategy)
{
_strategy = strategy;
}
public void DoWork()
{
_strategy.DoWork();
}
}
Der Aufruf des Konstruktes geschieht folgendermaßen:
class Program
{
static void Main(string[] args)
{
StrategyContext context = new StrategyContext(new ConcreteStrategy1());
context.DoWork();
}
}
Austausch von einzelnen Methoden
Bisher haben wir gesehen, wie gesamte Verhaltensweisen ausgetauscht werden können. Wie sieht es jedoch aus, wenn nur einzelne Methoden getauscht werden und das restliche Verhalten gleich bleiben soll? Hier bietet sich ein Structural Pattern an, das Proxy Pattern. Dieses Pattern beschreibt einen möglichen Weg, wie Aufrufe an ein Ziel weitergeleitet werden können. Dies ist genau das was wir benötigen. Zuerst jedoch das UML Diagramm, um einen ersten Überblick zu erlagen:
Wie zu sehen ist, wird der StrategyContext gegen einen Proxy ersetzt. Dieser erhielt zusätzlich zur eigentlichen DoWork-Methode eine weitere Überladung, dem ein ICommand übergeben werden kann. Damit kann entweder das Standardverhalten (welches durch die konkrete Strategy-Implementierung vorgegeben wird) oder aber ein beliebiges eigenes Verhalten ausgeführt werden. Dies wirft natürlich die Frage auf, warum man nicht trotzdem ausschließlich mit dem Strategy-Pattern arbeiten kann. Der Einfachheit wegen hat dieses Beispiel nur eine einzige Methode, diese Variante kommt jedoch erst bei mehreren angebotenen Methoden zu tragen.
Hier eine Beispielimplementierung (IStrategy und die konkreten Implementierungen haben sich nicht geändert und sind im obigen Sourcecode zu finden):
public interface ICommand
{
void Execute();
}
public class CustomWorker1 : ICommand
{
#region ICommand Members
public void Execute()
{
Console.WriteLine("CustomWorker1");
}
#endregion
}
public class CustomWorker2 : ICommand
{
#region ICommand Members
public void Execute()
{
Console.WriteLine("CustomWorker2");
}
#endregion
}
public class StrategyProxy
{
private IStrategy _usedStrategy;
public StrategyProxy(IStrategy usedStrategy)
{
_usedStrategy = usedStrategy;
}
public void DoWork()
{
_usedStrategy.DoWork();
}
public void DoWork(ICommand customWorker)
{
customWorker.Execute();
}
}
Fazit
Dieser Beitrag hat gezeigt, wie gesamte Verhalten innerhalb einer Anwendung einfach ausgetauscht werden können bzw. einen Weg aufgezeigt, wie dies auf Basis von Methoden realisiert werden kann. Wer dies nun über eine Konfigurationsdatei konfigurieren möchte, der kann sich beispielsweise einen Builder basteln, welcher die Konfiguration ausliest und die darin angegebenen Typen mit Hilfe der Klasse Activator instanziert, den Proxy mit den notwendigen Instanzen füllt und ihn anschließend fertig konfiguriert zurück liefert.
| | | 4 Kommentare
- 1798 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
UML Modellierung mit Visual Studio
03.10.07 - Entwicklung, Patterns, .NET, Visual Studio Beitrag von Norbert Eder| | Wer auf der Suche nach einem UML Modelling-Tool für Visual Studio ist, dem sei eine weitere Variante durch tangible engineering geboten. Zusätzlich zum kostenpflichtigen Tool tangible architect 4.0 gibt es auch eine kostenlose Variante die folgende Diagramme unterstützt:
- Case Diagrams
- Component Diagrams
- State Charts
- Class Diagrams
- Activity Diagrams
- Persistent Object Models
Hier ein Screenshot:
Die erstellten Diagramme und Modelle sind mit der kostenpflichtigen Variante kompatibel.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Enterprise Library Contrib September 2007 verfügbar
02.10.07 - Entwicklung, Patterns, .NET, Allerlei Beitrag von Norbert Eder| | Seit gestern ist die Enterprise Library Contrib September 2007 auf CodePlex verfügbar. Was genau ist die EntLib Contrib?
"EntLib Contrib is a community-developed library of extensions to the patterns & practices Enterprise Library."
Folgende Features sind enthalten:
- Erweiterungen Data Access Application Block: Provider für MySql, SqLite und SqlEx
- Erweiterungen Exception Handling Application Block: SqlException Wrap Handler
- Erweiterungen Logging Application Block: LogParser
- Erweiterungen Policy Injection Application Block: PostSharp4EntLib, neue Matching-Regeln und neue Call-Handler
- Erweiterungen Validation Application Block: CollectionCountValidator, TypeValidator, ObjectValidator usw.
| | | 1 Kommentar
- 621 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Enterprise Library für Visual Studio 2008 geplant
29.08.07 - Entwicklung, Patterns, .NET, Visual Studio, Internet, Community Beitrag von Norbert Eder| | Grigori Melnik schrieb in seinem Blog, dass das pattern & practices Team eine Version der Enterprise Library für Visual Studio 2008 (Orcas) plant. Dazu wurde eine Umfrage gestartet die 10 Fragen enthält. Dadurch soll in Erfahrung gebracht werden, welche Szenarios und darauf abzielt, zu erfahren, was den einzelnen Entwicklern an der EntLib fehlt.
Wer sich also einbringen möchte, der möge an der Umfrage teilnehmen, um ein möglichst großes Feedback für die Enterprise Library zu leisten, die ja tatsächlich sehr hilfreich für uns Entwickler ist.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL | Weiter
|
|
|
|
|
|
|