C#で関数型プログラミングを楽しむ♪
using System;
class Piyo
{
private string m_msg;
public string Message
{
get { return this.m_msg; }
}
public Piyo( string msg )
{
this.m_msg = msg;
}
public static Piyo AddPiyo( Piyo p )
{
return new Piyo( p.Message + "ピヨ♪" );
}
}
class PiyoPiyo : Piyo
{
public PiyoPiyo( string msg ) : base( msg ){ }
public static PiyoPiyo AddPiyo( PiyoPiyo pp )
{
return new PiyoPiyo(
Piyo.AddPiyo( pp ).Message + "ピヨ♪" );
}
}
class Program
{
static void Main( string[] args )
{
string str = "C";
Console.WriteLine(
Piyo.AddPiyo( new Piyo( str ) ).Message );
Console.WriteLine(
PiyoPiyo.AddPiyo( new PiyoPiyo( str ) ).Message );
}
}
関数型プログラミングは、関数による戻り値でプログラミングを行います。ですが、通常(命令型)のオブジェクト指向プログラミングを行うとメソッドは副作用を生みます。そこで、関数型プログラミングに近づけるに、オブジェクトのインスタンスを受け取る静的メソッドを定義し、受け取ったインスタンスに変更を加えずに、新しいインスタンス生成して返す必要があります。あと、プロパティは読み取り専用にした方がよいでしょう。「何故、F#を採らない!」この様にすれば、副作用がない関数型プログラミング風のプログラミングを実現できます。もちろん、.NETで関数型プログラミングをしたいのであればF#を使えばよいの言うまでもありません。
真面目な話を言うと、このテクニックは並行処理に向いています。並行処理の対象となるクラスは、この様に定義すればいいかもしれません。「何故、F#を採らない!」