私は数週間前に書いたコードを少し持っています (コードの目的はその構造ほど重要ではありません):
if (_image.Empty)
{
//Use the true image size if they haven't specified a custom size
if (_glyphSize.Width > 0)
imageSize.Width = _glyphSize.Width //override
else
imageSize.Width = _image.GetWidth;
if (_glyphSize.Height > 0) then
imageSize.Height = _glyphSize.Height
else
imageSize.Height = _image.GetHeight
}
else
{
//No image, but they can still override it with a custom size
if (_glyphSize.Width > 0) then
imageSize.Width = _glyphSize.Width
else
imageSize.Width = 0;
if (_glyphSize.Height > 0)
imageSize.Height = _glyphSize.Height
else
imageSize.Height := 0;
}
今夜それを調べていて、クリーンアップしていたときに、クリーンアップされたバージョンはもっと簡潔でなければならないことに気付きました:
//Figure out the final image width
if (_glyphSize.Width > 0)
imageSize.Width = _glyphSize.Width
else if (not _glyph.Empty)
imageSize.Width = _glyph.GetWidth
else
imageSize.Width = 0;
//Figure out the final image height
if (_glyphSize.Height > 0)
imageSize.Height = _glyphSize.Height
else if (not _glyph.Empty)
imageSize.Height = _glyph.GetHeight
else
imageSize.Height = 0;
注:コードを切り詰めて論理フローを裸にし、ソース言語を難読化しました。
最後に、ネストされたif
's を取り、それらを反転させました。そうすることで、この短縮が可能になりました。私の質問は、将来これをどのように認識できますか?
より短いコードにリファクタリングできるコードを書いたという明確な兆候は何ですか?
数週間前に私が持っていた別の例は、権限チェックに似たものでした: ユーザーはアクションを実行できます:
- 彼らが許可を持っていれば、彼らはそれを行うことができます
- 権限はないが、オーバーライドが有効な場合
私は最初に次のようにコーディングしました:
if ((HasPermission || (!HasPermission and OverrideEnabled))
{
...do stuff
}
if
その節の論理条件は、ちょっと冗長に思えました。ブール代数のコースに戻って、それを単純化する方法を見つけようとしました。結局、私はそれを行うことができたので、真理値表を描くことになりました:
Permission Override Result
0 0 0
0 1 1
1 0 1
1 1 1
私が見ると、OR演算です。したがって、私のif
ステートメントは次のようになりました。
if (HasPermission or OverrideEnabled)
{
...
}
これは明白で単純です。そして今、私はどうして最初からそれを見ることができなかったのだろうと思っています。
SO の質問に戻ります。コードのブロックに TLC が必要であることを認識するために、どのような兆候を探すことができますか?