1
/
5

【コードで分かるUMLシリーズ】属性とプロパティ

Photo by Alex D'Alessio on Unsplash

.NETのプロパティ

.NETで開発している人は、プロパティって知っていますよね。
これです↓。

Sample1.cs

class Sample {
// フィールド
private string property1;
// プロパティ
public string Property1
{
set{
this.property1 = value;
}
get{
return this.property1;
}
}
}

これは、

Sample4.cs

class Sample {
// プロパティ
public string Attribute1 { set; get; }
}

なんて書くこともできます。

マイクロソフトの
『プログラミング .NET Framework 第4版』
第10章 プロパティ P254に、

型のフィールドを外部に公開すると、オブジェクトのステートを破壊してしまうような方法でフィールドを不正に使用するコードを記述してしまう危険性が高くなる型のデータフィールドへのアクセスをカプセル化するプロパティ(property)と呼ばれる仕組みを提供しています。

と書いてあります。

つまり、プロパティは、データフィールドへのアクセスをカプセル化するための仕組みです。

上のSample3.csコードにコメントしましたが、privateの部分はフィールドです。
publicの部分がプロパティです。

Sample4.cs の例なんて、そもそも、主役であるはずのフィールドを実装せずに、
サポート役のプロパティだけを実装しています。
なんか、違和感ありませんか?

UMLのプロパティ

UMLでプロパティというと、クラスの属性を表している型の名前です。
属性=attribute
属性の型は、propertyです。


この図の関係です。
「クラスは、プロパティ型の属性を持っている」です。

.NETのプロパティとUMLのプロパティの違い

つまり、.NETのプロパティは、.NET上用意されたデータフィールドをカプセル化する仕組みであり、
UMLのプロパティは、属性の型ということで、全く違うものだと分かります。

UMLの属性をコードで表現すると

では、改めて、UMLの属性をコードで表現してみましょう。


C#のカプセル化する仕組みを使わない場合

Sample2.cs

class Sample {
// フィールド
public string attribute1;
}

C#のカプセル化する仕組みを使う場合

Sample3.cs

class Sample {
// フィールド
private string attribute1;
// プロパティ
public string Attribute1
{
set{
this.attribute1 = value;
}
get{
return this.attribute1;
}
}
}

上のサンプルコード(Sample1.cs)では、
フィールドに、「プロパティの名前の先頭を小文字にした名前」を付けていました。
また、上のサンプルコード(Sample4.cs)では、
フィールド自体が登場しません。

本来は、プロパティは属性をカプセル化する仕組みなだけですから、
フィールドが主役である方が自然です。

プロパティは、メソッドの一種であって、フィールドの一種ではありませんから、
属性がメソッド主体で実装されるのには、違和感が伴います。

些細なことかも知れませんが、UMLモデリングと実装コードの関係を考えるときは、
こういった元々の考え方を大切にしたいです。

まとめ

C#のプロパティって、
UMLの属性のことだと思っていたり、
C#で属性の実装方法だと思っていたる人がよくいますが、
どちらでもありません。

UMLの属性は、C#コードでは、
・フィールドか、
・フィールド+カプセル化する仕組み
で表現できます。

※転載元の情報は上記執筆時点の情報です。
 上記執筆後に転載元の情報が修正されることがあります。



執筆者のページはこちら


株式会社豆蔵では一緒に働く仲間を募集しています
同じタグの記事
今週のランキング