質問が「単一のintを返すメソッドから2つの無関係な情報を返すにはどうすればよいですか。戻り値をチェックしたくないので、nullが悪いので、使用しないでください。」
何を渡したいか見てみましょう。intを渡せない理由について、intまたはint以外の論理的根拠のいずれかを渡しています。質問は2つの理由しかないと主張しますが、列挙型を作成したことがある人なら誰でもリストが大きくなることを知っています。他の理論的根拠を指定する範囲は理にかなっています。
最初は、これは例外をスローするための良いケースのように見えます。
呼び出し側に戻り値の型ではない特別な何かを伝えたい場合、例外はしばしば適切なシステムです:例外はエラー状態のためだけではなく、多くのコンテキストと理論的根拠を返して、なぜできるのかを説明することができます今日はありません。
これは、保証付き有効なintを返すことができる唯一のシステムであり、intを取るすべてのint演算子とメソッドが、nullやマジック値などの無効な値をチェックする必要なく、このメソッドの戻り値を受け入れることができることを保証します。
しかし、例外は、名前が示すように、これが例外的なケースであり、通常のビジネスコースではない場合にのみ有効なソリューションです。
そして、try / catch and handlerは、そもそも反対であったnullチェックと同じくらい定型的なものです。
そして、呼び出し元にtry / catchが含まれていない場合、呼び出し元の呼び出し元はそれを繰り返す必要があります。
素朴な2番目のパスは、「これは測定値です。負の距離測定値はほとんどありません」と言うことです。したがって、一部の測定Yについては、次の定数を使用できます。
- -1 =不明、
- -2 =測定不能、
- -3 =回答を拒否、
- -4 =既知だが機密、
- -5 =ムーンフェイズによって異なります。表5aを参照してください。
- -6 = 4次元、タイトルで指定された測定値、
- -7 =ファイルシステム読み取りエラー、
- -8 =将来の使用のために予約済み、
- -9 =平方/立方体なので、YはXと同じですが、
- -10 =はモニター画面であるため、X、Y測定を使用しません。画面の対角線としてXを使用し、
- -11 =領収書の裏面の測定値を書き留め、判読不能になったが、5または17だったと思う
- -12 = ...アイデアが得られます。
これは、多くの古いCシステムで行われている方法であり、intに真の制約がある現代のシステムでさえ、何らかのタイプの構造体またはモナドにラップすることはできません。
測定値が負になる可能性がある場合は、データ型を大きくし(たとえば、long int)、intの範囲よりもマジック値を高くし、理想的にはデバッガーに明確に表示される値で開始します。
ただし、単にマジックナンバーを持たせるのではなく、個別の変数として使用するのには十分な理由があります。たとえば、厳密なタイピング、保守性、および期待への準拠。
3番目の試みでは、非整数値を持つことが通常のビジネスコースである場合を検討します。たとえば、これらの値のコレクションに複数の非整数エントリが含まれる場合があります。これは、例外ハンドラーが間違ったアプローチである可能性があることを意味します。
その場合、intとその理論的根拠を渡す構造の良い例に見えます。繰り返しますが、この理論的根拠は上記のようなconstになりますが、両方を同じintに保持する代わりに、構造の別個の部分として保存します。最初に、原理が設定されている場合、intは設定されないというルールがあります。しかし、私たちはもはやこの規則に縛られていません。必要に応じて、有効な数値の理論的根拠も提供できます。
いずれにせよ、呼び出すたびに、理論的根拠をテストしてintが有効かどうかを確認し、理論的根拠に基づいてint部分を引き出して使用するボイラープレートが必要です。
これは、「nullを使用しないでください」の背後にある理由を調査する必要がある場所です。
例外と同様に、nullは例外的な状態を意味します。
呼び出し元がこのメソッドを呼び出して、構造の「合理的」部分を完全に無視し、エラー処理のない数字を期待し、ゼロを取得した場合、ゼロを数字として処理し、間違っています。マジックナンバーを取得した場合、それは数字として扱われ、間違っています。しかし、nullを取得した場合、うまくいくはずなので、転倒します。
したがって、このメソッドを呼び出すたびに戻り値のチェックを行う必要がありますが、帯域内または帯域外にかかわらず無効な値を処理し、try / catch、「合理的な」コンポーネントの構造体、intマジックナンバーの場合、またはnullの場合はintをチェックします...
代わりに、無効なintと「私の犬がこの測定値を食べた」のような理論的根拠を含む可能性のある出力の乗算を処理するには、その構造の乗算演算子をオーバーロードします。
...そして、このデータに適用される可能性のあるアプリケーション内の他のすべての演算子をオーバーロードします。
...そして、intを取る可能性のあるすべてのメソッドをオーバーロードします。
...そしてすべてのものをオーバーロードはする必要があります、まだそれは常にあなたがそれを呼び出している時点で有効なint型であるかのようにあなたは、この1つの方法の戻り値の型を扱うことができるだけのように、無効なint型のためのチェックが含まれています。
したがって、元の前提はさまざまな点で間違っています。
- 無効な値がある場合、値を処理しているコードのどの時点でも、それらの無効な値のチェックを避けることはできません。
- int以外を返す場合、intを返さないので、intのように扱うことはできません。演算子のオーバーロードにより、ふりをすることができますが、それは単なるふりです。
- マジックナンバー(NULL、NAN、Inf ...を含む)を持つintは、もはや実際にはintではなく、貧乏人の構造体です。
- nullを回避してもコードの堅牢性は向上せず、intの問題が隠されるか、複雑な例外処理構造に移動するだけです。