<?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>T#</title>
	<atom:link href="http://www.software-vision.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.software-vision.net</link>
	<description>Think Sharp</description>
	<lastBuildDate>Wed, 12 May 2010 17:38:40 +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>Partial Function Application</title>
		<link>http://www.software-vision.net/?p=7</link>
		<comments>http://www.software-vision.net/?p=7#comments</comments>
		<pubDate>Tue, 11 May 2010 22:01:14 +0000</pubDate>
		<dc:creator>Dejan Siedle</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[F#]]></category>

		<guid isPermaLink="false">http://www.software-vision.net/?p=7</guid>
		<description><![CDATA[Vor einiger Zeit habe ich angefangen mich mit F# zu beschäftigen weil ich die funktionalen Konzepte sehr interessant finde, besonders für meine tägliche Arbeit. Seit dem ist mir erst bewusst geworden das immer mehr funktionale Konzepte auch in C# Einzug erhalten. F# zu lernen hat mir geholfen zu erkennen welches Potential noch in C# steckt [...]]]></description>
			<content:encoded><![CDATA[<p>Vor einiger Zeit habe ich angefangen mich mit F# zu beschäftigen weil ich die funktionalen Konzepte sehr interessant finde, besonders für meine tägliche Arbeit. Seit dem ist mir erst bewusst geworden das immer mehr funktionale Konzepte auch in C# Einzug erhalten. F# zu lernen hat mir geholfen zu erkennen welches Potential noch in C# steckt und wie man sich dieses erschließen kann. </p>
<p>In F# gibt es das Konzept der „Partial Function Application“. Es geht darum dass Parameter einer Methode oder Funktion gebunden oder vorbelegt werden, während andere Parameter ungebunden bleiben und somit von Methodenaufruf zu Methodenaufruf variieren können. </p>
<p>Hier ein Beispiel wie eine Umsetzung dieses Konzepts in C# aussehen könnte. Gegeben sei eine Hilfsklasse:</p>
<pre class="brush: csharp; toolbar: false;">static class SomethingUtilities
{
    /// &lt;summary&gt;
    /// Do something.
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;context&quot;&gt;
    /// Parameter welcher sich nicht ändert.
    /// &lt;/param&gt;
    /// &lt;param name=&quot;person&quot;&gt;
    /// Parameter welcher sich oft ändert.
    /// &lt;/param&gt;
    public static void DoSomething(Context context, Person person)
    {
        if(context.IsConnectionOpen)
        {
           …
        }
    }
}</pre>
<p>Der Methode DoSomething können zwei Parameter übergeben werden, ein Kontext – Objekt und ein Person – Objekt mit dem was angestellt werden soll. Das Kontext – Objekt ändert sich in diesem Beispiel nicht. Die Methode würde dann so wie erwartet aufgerufen werden: </p>
<pre class="brush: csharp; toolbar: false;">SomethingUtilities.DoSomething(context, person1);
SomethingUtilities.DoSomething(context, person2);
SomethingUtilities.DoSomething(context, person3);</pre>
<p>Wir sehen dass der Kontext sich nicht ändert jedoch aber das Person &#8211; Objekt. Es wäre schön den Kontext nur einmal zu setzen und anschließend mit den verschiedenen Person – Objekten weiter arbeiten zu können. Die Methoden würden dann wie folgt aufgerufen werden: </p>
<pre class="brush: csharp; toolbar: false;">doSomething(person1);
doSomething(person2);
doSomething(person3);</pre>
<p>Das Ziel lässt sich relativ einfach erreichen. Es muss zunächst eine Extension – Methode definiert werden welches auf dem Delegaten der Zielmethode aufgerufen werden kann. Weitere Parameter dieser Extension – Methode sind dann die Objekte welche sich erst einmal nicht mehr weiter verändern, in diesem Beispiel das Kontext – Objekt. Der Rückgabewert ist eine Funktion oder Methoden – Delegat, welches die freien Argumente entgegen nehmen kann. Hier eine mögliche Implementierung: </p>
<pre class="brush: csharp; toolbar: false;">public static class Extensions
{
    /// &lt;summary&gt;
    /// Zeigt die Umsetzung von Partial
    /// Method Application
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;method&quot;&gt;
    /// Signatur der Methode dessen Parameter
    /// gebunden werden soll.
    /// Diese Methode ist das eigentliche
    /// Ziel des Aufrufs.
    /// &lt;/param&gt;
    /// &lt;param name=&quot;context&quot;&gt;
    /// Parameter welcher gebunden
    /// beziehungsweise vorbelegt wird.
    /// &lt;/param&gt;
    /// &lt;returns&gt;
    /// Delegate mit freien Parametern
    /// &lt;/returns&gt;
    public static Action&lt;Person&gt; PinContextArgument
      (this Action&lt;Context, Person&gt; method,
      Context context)
    {
        return person =&gt; method(context, person);
    }
}</pre>
<p>Nun belegen wir die Ziel – Methode mit Argumenten vor: </p>
<pre class="brush: csharp; toolbar: false;">var doSomething=((Action&lt;Context, Person&gt;)DoSomething).
PinContextArgument(context);</pre>
<p>Geschafft <img src='http://www.software-vision.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Die statische Methode ist mit einem Kontext bereits versehen und die Aufrufe können wie gewünscht getätigt werden ohne jedes Mal den Kontext zu übergeben. </p>
<pre class="brush: csharp; toolbar: false;">doSomething(person1);
doSomething(person2);
doSomething(person3);</pre>
<p>Die gezeigte Implementierung ist anwendungsspezifisch um das Beispiel möglichst einfach zu halten. Eine allgemeine Implementierung ist schnell realisiert. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.software-vision.net/?feed=rss2&amp;p=7</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
