27

私は最近、他の誰かのコードを扱っていて、この個人がプライベート変数とメソッド パラメーターに関して私とは非常に異なる哲学を持っていることに気付きました。一般的に、プライベート変数は次の場合にのみ使用する必要があると感じています。

  1. 変数は、後で呼び出すために保存する必要があります。
  2. 変数に格納されたデータは、クラス内でグローバルに使用されます。
  3. 変数をグローバルに操作する必要がある場合 (すべてのクラス メソッドで変数を読み取る必要がある場合とは明らかに異なります)。
  4. プログラミングが大幅に簡単になるとき。(確かに漠然としていますが、自分を窮地に追い込むことを避けるために、多くの状況に身を置く必要があります)。

(上記の多くは少し繰り返していることは認めますが、そのような扱いに値するほどそれぞれが異なっているように見えます...)

これは、誤って変数が変更されるのを防ぐ最も効率的な方法のようです。また、これらの標準に従うと、(クラスが最終的に変更された場合) 外部参照の最終的な操作が可能になるように思われるため、将来さらにオプションが残されます。これは単なるスタイルの問題 (1 つの真のブラケットやハンガリーの命名規則など) ですか、それともこの考えには正当な理由がありますか? この場合、実際にベストプラクティスはありますか?

編集
これは修正する必要があると思います。上記の「グローバル」を実際に使用したのは、「インスタンスメソッドによるグローバル」であり、「どこからでもグローバルにアクセス可能」ではありません。

edit2
例が求められました:

class foo
{
    private $_my_private_variable;

    public function __constructor__()
    {
    }

    public function useFoo( $variable )
    {
        // This is the line I am wondering about,
        // there does not seem to be a need for storing it.
        $this->_my_private_variable = $variable; 
        $this->_doSometing();
    }

    private function _doSomething()
    {

        /*
          do something with $this->_my_private_variable.
        */
        // This is the only place _my_private_variable is used.
        echo $this->_my_private_variable;
    }
}

これは私がやったであろう方法です:

class foo
{

    public function __constructor__()
    {
    }

    public function useFoo( $variable )
    {
        $this->_doSometing( $variable );
    }

    private function _doSomething( $passed_variable )
    {
        /*
          do something with the parameter.
        */
        echo $passed_variable;
    }
}
4

9 に答える 9

8

これはスタイルの問題ではなく、読みやすさ/保守性の問題であると私は主張します。1 つの変数には 1 つの用途があり、1 つの用途のみが必要です。たまたま同じ型を必要とするという理由だけで、異なる目的のために変数を「リサイクル」することは意味がありません。

あなたの説明からすると、他のすべての用途は基本的にあなたのリストでカバーされているため、あなたが取り組んだ他の人のコードがまさにこれを行っているように聞こえます。簡単に言えば、プライベートメンバー変数を使用して、状況に応じて一時的に機能します。これを仮定するのは正しいですか?もしそうなら、コードは恐ろしいです。

任意の変数のレキシカル スコープと有効期間が小さいほど、誤った使用の可能性が低くなり、リソースの破棄に適しています。

于 2009-02-09T19:50:52.443 に答える
8

メンバー変数を持つことは、メソッド呼び出し間で保持する必要がある状態を保持することを意味します。値が呼び出し間で存在する必要がない場合、単一の呼び出しの範囲外に存在する理由はないため、(存在する場合) メソッド自体内の変数にする必要があります。

スタイルは常に難しいものです。スタイルを確立すると、マンネリに陥り、なぜ自分のやり方が最善の方法ではないのかを理解するのが難しくなる可能性があります。

于 2009-02-09T19:55:11.277 に答える
4

必要なときに必要な場所にのみ変数を作成し、完了したら破棄する必要があります。クラスが機能するためにクラス レベルの変数を必要としない場合は、必要ありません。必要のない場所に変数を作成することは、非常に悪い習慣です。

于 2009-02-09T19:50:01.103 に答える
3

クラス メンバーは、次のいずれかである必要があります。

  • クラスの依存関係
  • クラスの状態を表す変数
  • クラスのメソッド
于 2016-10-29T22:52:07.347 に答える
1

C++ デストラクタに慣れていれば、答えは簡単だと思います。すべてのメンバー変数には破棄する方法を割り当てる必要がありますが、関数のパラメーターはそうではありません。そのため、メンバー変数は通常、ライフサイクルに関して何らかの関係を持つオブジェクトの状態または依存関係です。

于 2020-05-26T03:55:21.403 に答える
0

常にメソッド パラメーターとして渡すのではなく、グローバル スコープの変数を使用するためのベスト プラクティスが規定されているかどうかはわかりません。(「プライベート変数」とは、グローバルスコープの変数を意味していると思います。)

グローバル スコープの変数を使用することが、.NET でプロパティを実装する唯一の方法です (自動プロパティでさえ、最終的にはグローバル スコープの変数を使用しますが、自分で宣言する必要はありません)。

値がどこから来ているのかが完全に明確になるため、常にメソッドパラメーターを使用することについての議論があります。メソッドが基になる値を変更するのを防ぐのに実際に役立つとは思いません。また、私の意見では、時には読みにくくなる可能性があります。

于 2009-02-09T19:55:26.410 に答える
-1

他の人が述べたように、オブジェクトのプロパティは状態を保持することを意図しているため、公開する正当な理由がない限り、デフォルトですべてを非公開にすることをポリシーとしています。

必要に応じて、たとえば getter メソッドを作成するだけで、後でそれらを公開する方がはるかに簡単です (これは、クラスを作成する最初に考える必要もありません)。しかし、後でパブリック プロパティを巻き込むには、膨大な量のコードを書き直す必要がある場合があります。

これについて必要以上に考える必要がないようにしながら、柔軟性を維持するのが好きです。

于 2012-04-26T14:03:49.247 に答える