(より論理的なステートメントのように)より詳細なコードがより簡潔なコードよりクリーンであるケースはありますか?
これに答えるために、私に起こった実際の例を見てみましょう。私が管理しているC#ライブラリには、次のコードがありました。
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
これについて仲間と話し合ったところ、全会一致の評決は、ネストされた3項式とis var
の「巧妙な」使用を組み合わせた結果、簡潔になったものの、コードの読み取りが困難になったことです。
だから私はそれを次のようにリファクタリングしました:
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
元のバージョンには、暗黙のreturn
を含む複合式が1つだけ含まれていました。新しいバージョンには、明示的な変数宣言、if
ステートメント、および2つの明示的なreturns
が含まれています。より多くのステートメントとより多くのコード行が含まれています。それでも、私が相談したすべての人は、「クリーンなコード」の重要な側面である、読みやすく、理由付けが簡単だと考えました。
したがって、あなたの質問への答えは強調された「はい」であり、簡潔なコードよりも冗長である方がクリーンな場合があるため、有効なリファクタリングです。
1。 LOCとコード品質の相関関係の欠如
リファクタリングの目標は、コードの品質を向上させることです。
LOCは非常に基本的なメトリックであり、コードの一部の品質と相関する場合があります。たとえば、数千のLOCを持つメソッドには品質の問題がある可能性があります。ただし、LOCはonlyメトリックではなく、多くの場合、品質との相関関係がないことに注意してください。たとえば、4 LOC方式は、6 LOC方式よりも必ずしも読みやすく、維持しやすいとは限りません。
2。一部のリファクタリング手法は、LOCの追加で構成されます。
リファクタリング手法のリスト を使用すると、意図的にLOCを追加するものから簡単に見つけることができます。例:
どちらも非常に有用なリファクタリング手法であり、LOCへの影響は、それらを使用するかどうかを検討する場合はまったく関係ありません。
LOCの使用を避けます。
LOCは危険なメトリックです。測定は非常に簡単で、正しく解釈することは非常に困難です。
コード品質の測定手法に慣れるまで、そもそもLOCを測定しないことを検討してください。ほとんどの場合、関連するものは何も得られず、コードの品質を低下させるように誤解させる場合もあります。
ソースコードのバイト数またはLoC数を最小限に抑えた最終的な結果を確認したい場合は、 Stack Exchange Code Golfサイト への送信を確認してください。
あなたのソースコードがそのような方法で減らされるならば、あなたはすぐに手に負えない混乱を持っています。あなたがそのようなコードを書いた人であり、その時点でそれを完全に理解していたとしても、6か月後にコードに戻る場合、どのくらい効率的ですか?このような最小限のコードが実際に速く実行されるという証拠もありません。
コードは、チームのどのメンバーもそれを見て、すぐに何が行われているかを理解できるような方法で書く必要があります。
はい、リファクタリングは間違いなくより多くのコード行をもたらす可能性があります。
IMOの最も一般的なケースは、ジェネリックではないコードを使用して、それをよりジェネリック/フレキシブルにする場合です。コードを汎用化すると、コードの行が大幅に増加します(2倍以上になる場合もあります)。
新しく汎用的なコードが(内部ソフトウェアコンポーネントとしてだけでなく)他の人によってライブラリとして使用されることが予想される場合は、通常、ユニットテストコードとコード内ドキュメントマークアップを追加することになり、コードの行が再び増加します。
たとえば、すべてのソフトウェア開発者に発生する非常に一般的なシナリオは次のとおりです。
私の頭上に浮かぶいくつかの具体的な例: