<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C and it&#039;s sharp &#187; Clean Code</title>
	<atom:link href="http://berndhengelein.de/tag/clean-code/feed/" rel="self" type="application/rss+xml" />
	<link>http://berndhengelein.de</link>
	<description>berndhengelein.de</description>
	<lastBuildDate>Sat, 30 Oct 2010 20:08:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Compiler warning CS0067 – es muss nicht immer #pragma sein</title>
		<link>http://berndhengelein.de/2010/07/compiler-warning-cs0067-es-muss-nicht-immer-pragma-sein/</link>
		<comments>http://berndhengelein.de/2010/07/compiler-warning-cs0067-es-muss-nicht-immer-pragma-sein/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 23:15:10 +0000</pubDate>
		<dc:creator>Bernd</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Clean Code]]></category>

		<guid isPermaLink="false">http://berndhengelein.de/?p=331</guid>
		<description><![CDATA[Da ist es wieder. Der Compiler spuckt die Warnung CS0067 “The event ‘XXX’ is never used” aus. Das kann z.B. passieren, wenn das Interface ICommand implementiert wird, das Command aber immer ausführbar sein soll. Das Event CanExecuteChanged muss also nie gefeuert werden:
&#160;
&#160;

public class SomeCommand : ICommand
{
	public void Execute(object parameter)
    {
		// do sth.
	}

	public [...]]]></description>
			<content:encoded><![CDATA[<p><img title="warningSign" style="border-right: 0px; border-top: 0px; display: inline; margin: 0px 15px 0px 0px; border-left: 0px; border-bottom: 0px" height="120" alt="warningSign" src="http://berndhengelein.de/wp-content/uploads/2010/07/warningSign1.png" width="120" align="left" border="0" />Da ist es wieder. Der Compiler spuckt die Warnung CS0067 “The event ‘XXX’ is never used” aus. Das kann z.B. passieren, wenn das Interface <a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx" target="_blank">ICommand</a> implementiert wird, das Command aber immer ausführbar sein soll. Das Event <a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.canexecutechanged.aspx" target="_blank">CanExecuteChanged</a> muss also nie gefeuert werden:</p>
<p>&#160;</p>
<p>&#160;</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8b02cd47-cb25-475c-a736-c1566396800d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">public class SomeCommand : ICommand
{
	public void Execute(object parameter)
    {
		// do sth.
	}

	public bool CanExecute(object parameter)
    {
		return true;
	}

	public event EventHandler CanExecuteChanged;
}</pre>
</div>
<p>Bei obiger Imlementierung bekommt man beim Übersetzten die Compiler Warnung CS0067:</p>
<blockquote>
<p>warning CS0067: The event &#8216;CommandDemo.SomeCommand.CanExecuteChanged&#8217; is never used</p>
</blockquote>
<p>Was einem als erstes (zumindest mir) einfällt die Warning zu “beheben”, ist sie mit einem <a href="http://msdn.microsoft.com/en-us/library/x74w198a.aspx" target="_blank">#pragma Statement</a> kurzzeitig aus- und wieder einzuschalten:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f04c9229-dfdb-4384-9a1a-b71df3ac080f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">#pragma warning disable 0067
	public event EventHandler CanExecuteChanged;
#pragma warning restore 0067</pre>
</div>
<p>So richtig gut gefällt diese Lösung aber nicht. Bei Implementierungen, wo das Event später vielleicht doch einmal gefeuert wird, ist die Wahrscheinlichkeit ziemlich hoch, dass diese #pragma Statements vergessen werden und im Code verbleiben. Das ist nicht schön. Aber es gibt eine andere, (mittlerweile meiner Ansicht nach bessere) Lösung:</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5970b024-3c25-4b4c-86ed-03a01738c95c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#:nogutter:nocontrols">public event EventHandler CanExecuteChanged { add{} remove{} }</pre>
</div>
<p>Durch das Hinzufügen der leeren Eventaccessors “add” und “remove” mache ich klar, dass dieser Event nicht verwendet wird. Da das Event sowieso nie gefeuert wird, ändert sich auch für den potentiellen Konsumenten des Events nichts. Wenn in einer späteren Phase dieser Event doch einmal ausgelöst werden soll, wird der Entwickler sofort mit einem Kompilerfehler darauf hingewiesen, das dies nicht möglich ist. Die leeren “add” und “remove” Accessoren müssen also entweder wieder entfernt oder entsprechend vollständig implementiert werden ==&gt; der Code bleibt sauber.</p>
<p>Wie man sieht, muss man also nicht sofort zum #pragma greifen, wenn man mit der Warnung CS0067 konfrontiert wird. Das Hinzufügen der leeren Eventaccessoren bietet eine elegante und saubere Lösung mit dem Fall umzugehen.</p>
]]></content:encoded>
			<wfw:commentRss>http://berndhengelein.de/2010/07/compiler-warning-cs0067-es-muss-nicht-immer-pragma-sein/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>INotifyPropertyChanged &#8211; Varianten f&#252;r die Implementierung</title>
		<link>http://berndhengelein.de/2009/09/inotifypropertychanged-varianten-fr-die-implementierung/</link>
		<comments>http://berndhengelein.de/2009/09/inotifypropertychanged-varianten-fr-die-implementierung/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 19:27:56 +0000</pubDate>
		<dc:creator>Bernd</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[PostSharp]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://berndhengelein.de/?p=284</guid>
		<description><![CDATA[Wer mit WPF programmiert, kennt INotifyPropertyChanged. Das allgegenwärtige Interface, mit dem Änderungen z.B. von einem ViewModel zu einem daran gebunden UI Element propagiert werden. Eine typische Implementierung von INotifyPropertyChanged sieht etwa so aus:

Drei Sachen fallen ins Auge

jedes ViewModel muss INotifyPropertyChanged implementieren, d.h. den PropertyChanged Event anbieten und eine Methode zum Feuern des Events haben. 
die [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit WPF programmiert, kennt <a href="http://msdn.microsoft.com/de-de/library/system.componentmodel.inotifypropertychanged(VS.95).aspx">INotifyPropertyChanged</a>. Das allgegenwärtige Interface, mit dem Änderungen z.B. von einem ViewModel zu einem daran gebunden UI Element propagiert werden. Eine typische Implementierung von INotifyPropertyChanged sieht etwa so aus:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="INotifyPropertyChanged Horror" border="0" alt="INotifyPropertyChanged Horror" src="http://berndhengelein.de/wp-content/uploads/2009/09/INotifyPropertyChanged.png" width="616" height="700" /></p>
<p>Drei Sachen fallen ins Auge</p>
<ol>
<li>jedes ViewModel muss INotifyPropertyChanged implementieren, d.h. den PropertyChanged Event anbieten und eine Methode zum Feuern des Events haben. </li>
<li>die EventArgs für den PropertyChanged Event bekommen als Parameter einen <strong>String</strong>, der dem Namen der Property entspricht. </li>
<li>der Code ist “zugemüllt” mit Infrastrukturcode, der eigentlich nichts zur Logik des Objekts beiträgt </li>
</ol>
<ol>Der erste Punkt lässt sich relativ einfach lösen, indem man eine ViewModel Basisklasse macht, die diese Aufgaben übernimmt.</ol>
<ol><strong>Basisklasse für ViewModels</strong></ol>
<ol>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a25e30eb-cdc6-4ed1-9223-a3885f0b7466" class="wlWriterSmartContent">
<pre class="c#:nogutter:nocontrols" name="code">public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}</pre>
</p></div>
</ol>
<p>Beim zweiten Punkt wird es dann schon schwieriger. Hier gibt es mehrere Ansätze, die Strings loszuwerden.</p>
<p>Am häufigsten trifft man wohl eine Variante mit Lambda Expressions an. Die Implementierungen reichen von einer Extensionmethod für den PropertyChangedEventHandler bis zu einer generischen ViewModel Basisklasse, welche das abgeleitete ViewModel als Type Parameter bekommt. Hier ein paar Links zum Nachlesen:</p>
<p><a href="http://www.jphamilton.net/post/MVVM-with-Type-Safe-INotifyPropertyChanged.aspx" target="_blank">J.P. Hamilton &#8211; Generische ViewModel Basisklasse</a></p>
<p><a href="http://www.lieser-online.de/blog/?p=130" target="_blank">Stefan Lieser &#8211; Implementierung direkt im ViewModel</a></p>
<p><a href="http://blog.decarufel.net/2009/07/how-to-use-inotifypropertychanged-type_22.html" target="_blank">Eric De Carufel &#8211; Extensionmethod für PropertyChangedEventHandler</a></p>
<p>&#160;</p>
<p>Andere Lösungen, die ich gefunden habe:</p>
<p><a href="http://www.nablasoft.com/alkampfer/index.php/2008/08/14/how-to-implement-inotifypropertychanged-with-codedom/" target="_blank">Alkampfer &#8211; INotifyPropertyChanged mit CodeDom implementieren</a></p>
<p><a href="http://ayende.com/Blog/archive/2009/08/07/nhibernate-amp-inotifypropertychanged.aspx" target="_blank">Ayende &#8211; INotifyPropertyChanged mit Castle Dynamic Proxy</a></p>
<p><a href="http://thetreeknowseverything.net/2009/01/21/auto-implement-inotifypropertychanged-with-aspects/" target="_blank">Mike Saunders &#8211; INotifyPropertyChanged mit PostSharp Aspekt</a></p>
<p><a href="http://richardsbraindump.blogspot.com/2009/02/aspect-oriented-programming.html" target="_blank">Richard Banks &#8211; INotifyPropertyChanged mit PostSharp Aspekt</a></p>
<p>&#160;</p>
<p>Dann gibt es noch <strike>die</strike> den Verfechter von <a href="http://www.codeplex.com/updatecontrols">UpdateControls</a>, <a href="http://adventuresinsoftware.com/blog/">Michael L. Perry</a>. UpdateControls ist eine Open Source Bibliothek auf <a href="http://www.codeplex.com/">CodePlex</a>, die es erlaubt, Änderungen von Eigenschaften auch ohne INotifyProperyChanged zu propagieren und z.B. an WPF Controls zu binden. Eine <a href="http://www.code-magazine.com/Article.aspx?quickid=0907101">gute Einführung</a> in UpdateControls kann man beim <a href="http://www.code-magazine.com/Index.aspx">CODE Magazin</a> lesen.</p>
<p>&#160;</p>
<p>Mir gefallen bisher die Lösungen mit PostSharp am Besten. Damit lassen sich alle drei Punkte auf einmal erschlagen.</p>
<ol>
<li>Mit einem PostSharp Attribut, das auf die ViewModel Klasse geklebt wird, lässt man die INotifyPropertyChanged Implementierung automatisch einweben. </li>
<li>Es gibt keine Magic Strings mehr, da auch das Feuern des ProperyChanged Events automatisch eingewoben wird. Verschreiber sind dadurch ausgeschlossen, Refactoring ist kein Problem. </li>
<li>Der Code bleibt sauber und lesbar, da der ganze Notifikationscode erst nachträglich hinzugefügt wird. </li>
</ol>
<ol><strong>Der nächste Schritt</strong></ol>
<p>Ein Kollege von mir hatte die Idee, die Verwendung von PostSharp in Verbindung mit dem MVVM Pattern noch einen Schritt weiter zu treiben. Wir verwenden jetzt ein [ViewModelAspekt] PostSharp Attribut, mit dem die ViewModels versehen werden.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0f090b30-5b83-405e-8483-2c0781406394" class="wlWriterEditableSmartContent">
<pre name="code" class="c#:nogutter:nocontrols">[ViewModelAspect]
public class MyViewModel
{
    private string _name;

    public string Name
    {
        get{ return _name;}
        set{ _name = value;}
    }

    public void Save()
    {
        // do sth.
    }
}</pre>
</div>
<p>Dieser Aspekt macht folgendes:</p>
<ul>
<li>Implementierung von INotifyPropertyChanged </li>
<li>Für alle public Properties wird im Setter der PropertyChanged Event gefeuert </li>
<li>Für alle public void Methoden wird eine Command Property erzeugt, welche mit Hilfe des <a href="http://dotnet.org.za/rudi/archive/2009/03/05/the-power-of-icommand.aspx">Delegate/Relay Commands</a> wiederum diese Methode aufruft. </li>
</ul>
<ul>Dadurch haben wir es geschafft, den Overhead für die Verwendung des <a href="http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx">MVVM Patterns</a> sehr gering zu halten. Die nächsten Wochen werden zeigen, ob sich diese Variante bewährt und alle Use Cases damit abgedeckt werden können.</ul>
]]></content:encoded>
			<wfw:commentRss>http://berndhengelein.de/2009/09/inotifypropertychanged-varianten-fr-die-implementierung/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

