3

これは表面的な問題かもしれませんが、いつも醜いコードになってしまうので、本当に面倒です。読みやすさは常に重要ですよね?

ハッシュ内のハッシュに値が存在するかどうかを確認したい。だから私がすることはこれです。

already_exists_data[:data][:user_id]

しかし、:data が nil の場合は nullpointer 例外が発生し、 already_exists_data が nil の場合、:data をチェックすると nullpointer が返される可能性があります。だから私が最終的にはこれです:

if already_exists_data && already_exists_data[:data] && already_exists_data[:data][:user_id]
    # Do stuff
end

これは見栄えの悪いコードです。おそらく、代わりにハッシュをオブジェクトに変更する必要があります。しかし、私は時々この問題に出くわし、皆さんがどのようにそれに立ち向かうのか疑問に思っていました.

現在Rubyでコーディングしていますが、他の複数の言語でこの問題が発生しました。

4

3 に答える 3

2

執事にビクトリア通り34の食堂のテーブルでチョコレートの箱を拾うように頼んだら、私は彼にそれだけを頼みます。言いたくないのですが、ビクトリアストリートを探しに行き、見つけたら34番を探してください。見つけたら...

彼が自分の間違いを見つけたので、私はそれをすることができます:彼が通りを見つけられないならば、彼はただ手ぶらで戻るでしょう。

したがってtry、空の例外ハンドラでを使用する必要があります。擬似コードの場合:

{chocolates = streets( "Victoria")(34)( "dining room")( "table")}を試してください

ブロックが式である言語(rubyたとえば、いくつかの自家製の構文糖衣構文を使用)では、次のように記述できます。

{already_exists_data(data)(user_id)}を試してみてください

do_stuff

言語自体も役立ちます。たとえば、の場合perl$streets{Victoria}[34]{dining_room}{table}は未定義$streetsです。もちろん、住所が間違っていることに気付く前に、執事は何年も手ぶらで帰宅するかもしれません。tryブロックソリューション(およびあなたのif .. && ....)には同じ欠点があります。ビクトリアストリートの番号が34であるかどうかを本当に気にしない場合にのみ、これらを使用してください。

于 2012-07-08T22:43:14.633 に答える
1

もう 1 つの可能性は、関数呼び出しでハッシュ アクセスをラップし、関数内で「汚い」作業を行うことです。次に、コードは次のようになります (疑似コード構文):

accessHash(already_exists_data, data, userid)

: ラッパー関数に渡されるパラメーターの数に基づいて、ネストされたハッシュにアクセスすることに夢中になることができるため、複数の状況で機能します。

于 2012-07-09T14:26:48.213 に答える
1

言語に依存しない解決策: null を使用しないでください。これまで。このルールをプロジェクト全体に適用してください。絶対に必要な場合は、明示性を追加する/にラップしますEitherOptional。Scala などの一部の言語には、Optional既に組み込まれているという概念があります。

Java 固有の解決策: null を使用する必要がある場合は、メソッドの引数に注釈を付け、 と を使用して値を返し@Nullableます@Nonnull。適切な IDE (IntelliJ など) はnull、そのようなメソッドから値が取得された場合、コードを分析し、逆参照の可能性を強調表示することができます。

于 2012-07-06T14:50:06.967 に答える