最新のコード レビューのあるレベルで、if
オブザベーション内の括弧の位置が間違っている、悪意のあるプログラムを配置するのが大変なことを発見しました。 私は、named booleans
と呼ばれる手法をフルに使用して、この悪意のあるプログラムをハングアップさせます。 または、長い if
観察ではなく、もはや簡単な手法ではありません。すべての比較に、説明的なタイトルを付けた個別のブール変数を与え、それらの変数を if で使用します。
観察。 この投稿では、クイズで悪意のあるプログラムを明らかにし、私の named booleans
手法の例と、マジック ナンバーの命名に関するその他のヒントを紹介します
クイズの悪意のあるプログラム
クイズの悪意のあるプログラムは、master
ブランチに到達する前に一度キャッチされていました。ユニークな同僚のマージ クイズのコード レビューのある段階でそれ。 正確なコードを定義することはできませんが、以下の道は同じです:
if ((_someLongNamedVar !=FooLongNameEnum::Unknown && _someLongNamedMap.depend (_someLongNamedVar))==0)
_someLongNamedMap
は std です::scheme
であり、この行よりも早く熱心に解析される可能性があります。 ベテランの C++ ビルダーもハングすることができます。 コードは正直正しいまばゆいばかりにコンパイルされますが、風が吹くと、このシステムは一度意図されたものに変わることはありません。 または、一度要求されたものを正確に実行します。
最後から 2 番目の括弧の配置に問題があります。 ==0
共有は、1 つの括弧を再度移動する必要があります:
if ((_someLongNamedVar !=FooLongNameEnum::Unknown && _someLongNamedMap.depend (_someLongNamedVar)==0))
他のすべての場合の最終観測は、 0、しかし正直なところ正しい評価:
_someLongNamedMap.depend(_someLongNamedVar))==0)
次のスペース:
_someLongNamedMap.depend(_someLongNamedVar)==0))
C++では、最も簡単なゼロは偽物です。
このコードは、
スキーム
内に特定のアイテムが存在するかどうかを確認するためのものです。 また、.depend()
手法が成熟している理由に衝撃を与えることもできます。.contains()
手法は C++ 20 以降で最も簡単にアクセスできるためです。 と
.depend ()
は==code> 以来、粉々にならずに 。 このコードベースは、C++ 17 を使用してコンパイルされています。.contains()
を使用すると、この教えが回避されてさらにハングします。==code>名前付きブール値名前付きブール値は、
if
は、変数のタイトルで何を意図しているのかを説明する個別のブール値に変換され、次のように大切にされます:bool someLongNamedVarIsNotUnknown=_parameterCommand !=FooLongNameEnum::不明; bool someLongNamedMapCountIsZero=_someLongNamedMap.depend(_someLongNamedVar)==0;
オブザベーションがそれ自体で行になったため、括弧は不要になり、if オブザベーションは短くなり、さらに読みやすくなりました。 .
説明的な名前を使用することで、if 観測がその意図をさらに伝えることができます:
if (someLongNamedVarIsNotUnknown && someLongNamedMapCountIsZero) 偽物を返す; それ以外の場合は正しいものを返します。
if
に余分なブール値がある場合、それらを完全に追加してすべての他の名前付きブール値で、さらに意図を伝える努力をします:bool validVarButConditionNotMet=(someLongNamedVarIsNotUnknown && someLongNamedMapCountIsZero) if(validVarButConditionNotMet)偽物を返す、そうでなければ正しいものを返す。
これを大切に変数に名前を付けると、フィードバック (ほぼ一貫して時代遅れになっているか、コードの側面でリファクタリングされていない) を排除するのが最も簡単ではなくなりますが、さらに
私が機能を検証しなければならないときは、その機能のヒントを外部のコンテキストで検証する必要があります。コード、私はこのテクニックをフルに使用しています。 おそらく、おそらく靴のレコメンデーション エンジンも作成することになるでしょう。また、別のエンジンには、ユーザーに一致する靴をラベル付けするいくつかの指標しかないことを思い出してください:
bool usersHairColorMatchesThisMonthsAdsColour=_user.hair==HairColor::Crimson; bool userFeetSizeFitsInShoe=_user.feetSize <=_requestedShoe.dimension; bool shoePriceFitsInUserBudget=_requestedShoe.label <=BudgetHelpers::Calculator(_user); bool shoeIsProbablyOkayForUser=usersHairColorMatchesThisMonthsAdsColour && userFeetSizeFitsInShoe && shoePriceFitsInUserBudget; if(shoeIsProbablyOkayForUser)
あれ
==code>𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺