質問
最近、他の人のコードを使って作業していて、その人はプライベート変数とメソッドのパラメーターに関して私とはまったく異なる哲学を持っていることに気づきました。私は通常、プライベート変数は次の場合にのみ使用すべきだと考えています。
- 変数は後で呼び出せるように保存する必要があります。
- 変数に格納されたデータはクラス内でグローバルに使用されます。
- 変数をグローバルに操作する必要がある場合 (すべてのクラス メソッドで変数を読み取る必要があることとは明らかに異なります)。
- それによってプログラミングが大幅に容易になるとき。(確かに漠然としていますが、自分を追い詰めないようにするには、多くの状況に置かれなければなりません)。
(上記の多くが多少重複していることは認めますが、それぞれがそのような扱いに値するほど十分に異なっているように見えます...)
これは、変数を誤って変更することを防ぐ最も効率的な手段であるように思えます。また、これらの標準に従うことで (クラスが最終的に変更された場合) 外部参照の最終的な操作が可能になり、将来的にはさらなる選択肢が残されるようです。これは単にスタイルの問題 (真の括弧やハンガリーの命名規則など) なのでしょうか、それともこの考えには正当性があるのでしょうか?この場合、実際にベストプラクティスはあるのでしょうか?
編集
これは修正する必要があると思います。上記で「グローバルに」と使用したのは、実際には「インスタンス メソッドによってグローバルに」という意味であり、「どこからでもグローバルにアクセスできる」という意味ではありません。
編集2
次のような例が求められました。
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;
}
}
解決
一般的に、クラスメンバーは、クラスのオブジェクトの状態を表すべきである。
彼らは(つまり、メソッドのパラメータがのためにあるものだ)メソッドのパラメータのための一時的な場所ではありません。
他のヒント
私はそれはスタイルの問題ではなく、読みやすく/保守性の問題ではないことを主張します。一つの変数は1、使用、そして唯一の使用を持っている必要があります。彼らはどんな意味がありません同じタイプを必要とするために起こるという理由だけで、異なる目的のために「リサイクル」変数ます。
あなたが働いていた他の人のコードはまさにこれを行うかのように、すべての他の用途は、基本的にはあなたのリストで覆われているので、あなたの説明からは、聞こえます。簡単に言えば、それは状況に応じて一時として動作するようにプライベートメンバ変数を使用しています。私は右、これを前提とするのですか?その場合、コードは恐ろしいです。
字句範囲と寿命任意の所与の変数の誤使用の少ないpossiblityとリソース処分のためのより良い小さい。
メンバ変数を持つことは、それがメソッド呼び出しの間に保持される必要がある状態を保持することを意味します。値が呼び出しの間ライブする必要がない場合(それが全く存在している場合)には、メソッド自体内で可変であるべきである。
このように単一の呼び出しの範囲の外に存在する理由を持っていない、及びあなたがマンネリのビットにはまり込むことができ、あなたが何が最善の方法ではないかもしれない理由を参照することが困難な場合が1を開発したら、スタイルは、常に難しいものです。
あなただけのとき、どこが必要とされている変数を作成し、作業が完了したときに処分すべきです。クラスは、クラスレベルの変数が機能する必要がない場合、それは1つだけ必要としません。あなたがそれらを必要としない変数を作成することは非常に悪い習慣です。
クラスのメンバーは次のいずれかである必要があります。
- クラスの依存関係
- クラスの状態を表す変数
- クラスのメソッド
私は常にメソッドのパラメータとして渡すことに対して、グローバルスコープの変数を使用するために述べたベストプラクティスがあるかわかりません。 (「プライベート変数」とは、私はあなたがグローバルスコープの変数を意味すると仮定しています。)
グローバルスコープの変数を使用すると、.NETでプロパティを実装するための唯一の方法である(でも自動プロパティは、最終的にだけではない1あなた自身を宣言する必要があり、グローバル変数をスコープ使用)。
値がどこから来ている、それは完全に明確になるため、常にメソッドのパラメータを使用するためのarguementのラインがあります。私はそれが本当に根本的な値に変更を加えるからメソッドを防止し、それは、私の意見では、時間に読むために、物事をより困難にすることができます助けないと思います。
私は、グローバルアクセスのためにそれを実装するとそうは思わないか簡単にプログラミングを行うこと。あらゆる種類のフィルタリングを行わず世界的にこれらを露出させることにより、将来的にアクセスを決定することがより困難にします。
、私のポリシーは、私はそれらを公開する正当な理由がない限り、デフォルトでは、民間それらのすべてを持つことです。
それはあなたがしなければならない場合、単純に(私は、クラスを書くの初めに右を考える必要はありません)例えばgetterメソッドを書くことで、後でそれらを公開するためにはるかに簡単です。しかし、その後のパブリックプロパティに動揺して再書き込みされるコードの膨大な量を必要とする場合があります。
私は必要以上このことについて考える必要がないながら、柔軟な、それを維持したい。