- PR -

なぜ protected field は良くない?

1
投稿者投稿内容
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-11-18 03:26
コーディング作法についての質問です。
以前C++を使っていた頃、protected fieldを非常に良く使っていました。

コード:
public class Base
{
    public Base(){}
    protected m_name;
}

public class Derived
{
    public Derived(){ m_name = "Derived class";}
}



しかし、C#に移ってから、しばしば protected field は良くないと聞きます。FxCop先生もWarningを出してきます。そこで以下のようにすれば文句は言われないようです。

コード:
public class Base
{
    public Base(){}
    private m_name;
    protected Name
    {
        get{ m_name = value; }
        set{ return m_name; }
    }
}

public class Derived
{
    public Derived(){ base.Name = "Derived class";}
}



私にはこの変更のメリットが分かりません。なぜ protected field が良くないのかも謎です。どなたか良い説明をご存じないでしょうか。どうぞよろしくお願いします。
ほげた
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 67
お住まい・勤務地: なごやん
投稿日時: 2005-11-18 03:40
public field の場合、外部クラスから直接操作される危険があります。
意図しない操作をされるかもしれないし、操作されたことも認識できないという問題があります。

protected にするということは、継承クラスであれば、どのクラスからでも操作できるように公開するということですよね。そこにはやはり、「意図しない変更」の危険を孕んでいることになります。

ですので、field への直接アクセスは禁止して、かわりにアクセス用プロパティを用意するというのは安全策として素直なやり方だと思います。

開発チーム構成や対象の形態(ライブラリなのかアプリケーションなのか)によって、その重要度は異なると思いますが・・・


さらには、オブジェクト指向の思想から考えて、
・クラスのフィールドは、そのクラスからでないと直接アクセスできない
よりも
・インスタンスのフィールドは、そのインスタンスからでないと直接アクセスできない
となっているほうが自然な考え方であるとして、そのように仕様が定められている言語もあります。
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2005-11-18 07:30
protected/public field でプログラムを書いてしまっても
あとからプログラムを
base.setName("Derived class")
に書き直さなくてもいいということは便利だな。
1

スキルアップ/キャリアアップ(JOB@IT)