C#文法リファレンス ー 書き込み専用メソッド
処理内容を明かすことなく、実行状態を変えます。
日常でたとえると
秘密の任務を行う。おもてなしをする。
使用に適した状況
オブジェクトの利用者に意識させることなく、何らかの処理を行いたい場合。イミュータブルオブジェクトのコストが高い場合。
サンプル
/*----------------------------------------------------
*
* 書き込み専用メソッド(副作用を伴う処理)
*
----------------------------------------------------*/
using System;
class Foo
{
private int _value;
public void SetValue( int newValue )
{
this._value = newValue;
}
public int GetValue()
{
return this._value;
}
}
class Sample
{
static void Main( )
{
//呼び出しの順序で結果がわかる
Console.WriteLine( "順序に値を変える処理を実行します・・・" );
Foo obj = new Foo();
obj.SetValue( 10 );
Console.WriteLine( "現在の値は{0}です。", obj.GetValue() );
obj.SetValue( 20 );
Console.WriteLine( "現在の値は{0}です。", obj.GetValue() );
Console.WriteLine();
Console.WriteLine( "順序を変えて処理を実行します・・・" );
Foo obj1 = new Foo();
obj1.SetValue( 20 );
Console.WriteLine( "現在の値は{0}です。", obj1.GetValue() );
obj1.SetValue( 10 );
Console.WriteLine( "現在の値は{0}です。", obj1.GetValue() );
//終了
Console.ReadLine();
}
}
文法
書き込み専用メソッドという名前の文法はありませんが、戻り値の型を「void」にすることにより、利用者にその意図を伝えるのが一般的です。
解説
イミュータブルなオブジェクト(変更不可能なオブジェクト)における、インスタンスの生成コストが高い場合、変更可能なオブジェクトを作ることになります。変更不可能で透過性がないオブジェクトの実装は、オブジェクト内部に持つフィールド値、コンピューター内部の情報、カーネルオブジェクトなどといったものを変更する形で行います。
イミュータブルオブジェクトのコストが高いという後ろ向きの理由だけではなく、変更可能なオブジェクトには、メリットがあります。それは、処理内容をカプセル化し、利用者の負担を減らせることです。オブジェクトの内部で、利用者に無断でいろいろな状態を変え、結果を、プロパティや専用のメソッドなどで最終結果だけど知らせることができます。こうすると、オブジェクトの利用者は、複雑なアルゴリズムを考えずとも、常に正しい結果だけを受け取ることができます。
ただし、並列処理の一般化により、この手間を省けるというメリットも難しくなってきました。変更可能なオブジェクトの値は、時間と状況により変わるので、実行順序が変更されると、意図した処理結果を得ることができなくなります。従って、並列しやすいイミュータブルオブジェクトをカプセル化する目的で、変更可能なオブジェクトを用意するといった、より高度な戦略が求められています。
変更可能なオブジェクトと、変更不可能なオブジェクトをうまく使い分けましょう。なお、書き込みプロパティと、書き込み専用メソッド(副作用を伴うメソッド)の違いは、プロパティが属性、メソッドが振る舞いである点です。大きな差はないように見えるでしょうが、この意味の違いが設計に大きく影響を与えます。両者の違いにも十分に注意してください。