コードの深いインデントを防ぐために、どのような手順と対策を講じることができますか?
コードの深いインデントを防ぐために、どのような手順と対策を講じることができますか?
回答:
あなたができる最善のことは、メソッドを抽出することです:
int Step1(int state)
{
if (state == 100)
{
return Step2(state);
}
else
{
return Step3(state);
}
}
int Step2(int state)
{
if (state != 100)
{
throw new InvalidStateException(2, state);
}
// ....
}
if
条件でも機能します。極端に考えると、実行可能な疑似コードになります。
else
ブロックをドロップすることです。
たぶん、あなたはガード条項を考慮することができますか?
の代わりに
public void DoSomething(int value){
if (someCondition){
if(someOtherCondition){
if(yetAnotherCondition){
//Finally execute some code
}
}
}
}
行う
public void DoSomething(int value){
if(!(someCondition && someOtherCondition && yetAnotherCondition)){
return;
//Maybe throw exception if all preconditions must be true
}
//All preconditions are safe execute code
}
機会があれば、Steve McConnellのCode Completeを読むことをお勧めします。彼は、これらのトピックについて多くの素晴らしいアドバイスを受けています。
http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6
「ガード条項」の詳細については、https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clausesを参照してください。
を反転しますif
。
の代わりに:
if (foo != null)
{
something;
something;
if (x)
{
something;
}
something;
}
else
{
boohoo;
}
私は書くだろう:
if (foo == null)
{
boohoo;
return;
}
something;
something;
if (x)
{
something;
}
something;
同じことがif
- else
ブロックにも当てはまります。else
が短い/ネストが少ない場合は、元に戻します。
パラメータの値を1か所で確認する
メソッドを入力したらすぐにすべてのパラメーターの不正な値を確認し、安全であることを確認してください。これにより、コードが読みやすくなりますが、後で条件ブロックを積み上げて、これらのチェックをサブルーチン全体に広げることもできます。
If
いくつかの条件が満たされないために実行フローを停止するコードの先頭にある@JasonTuranが指摘したように、セーフガード句とも呼ばれます。そして、それは明確な名前を持つことに近づいているようです。
ネストされたコンポーネント(特に繰り返されるコンポーネント)を個別の関数に分割する(言語がクロージャーをサポートしている場合、これは簡単です)または一連のネストされたループを再帰で置き換えます。
また、4つではなく2つのスペースをインデントします。
インデントは、実際に戦うために本当に考えています。私がすることを学んだことは、最初にメソッドを断片に分割し、次に奇妙なトリックを使用して、1つの断片が失敗した場合、後続のすべての断片をスキップすることです。以下に例を示します。
の代わりに :
{if (networkCardIsOn() == true)
{if (PingToServer() == true)
{if (AccesLogin(login,pass) == true)
{if (nextCondition == true)
...
}
}
}
私は現在書いています:
{vbContinue = true;
if (vbContinue) {
vbContinue = networkCardIsOn();
if (vbContinue == false) {
code to Handle This Error();
}
}
if (vbContinue) {
vbContinue = PingToServer();
if (vbContinue == false) {
code to HandleThisError2();
}
}
if (vbContinue) {
vbContinue = AccesLogin(login,pass);
if (vbContinue == false) {
HandleThisErrorToo();
}
}
...
これは最初は奇妙に思えますが、これを使用するため、メンテナンスコストが半分に分割され、1日の終わりに脳が冷たくなります。
実際、この「テクニック」によってもたらされる利点は、コードの密度が低いため、コードの複雑さが実際に分割されることです。
コードを読んでいる間、過去の条件について何も覚えておく必要はありません。コードのそのポイントXにいる場合、前のステップはパスして成功しています。
もう1つの利点は、ネストされたすべての「if-else」からの「エスケープパスと条件」が単純化されることです。