MVCアーキテクチャに基づくRESTアプリケーションを開発しています。
サービスレイヤーはOptional<T>
を返します。ここで、T
は任意のクラスです。
したがって、コントローラーレイヤーには、結果がOptional.empty
であるかどうかをテストし、データ[]
を含むカスタム応答を返す条件ステートメントがあります。それ以外の場合は、カスタムResponseHTTP応答で実際のデータを返します。
return ABCService
.getById("")
.map("custom response with actual data ")
.orElse(Collections.empty in Custom response)
;
このコードをコントローラーレイヤーに記述するのは悪い習慣ですか?
null
を送信したくないため、Optional<T>
を返します。 Controllerレイヤーでその条件を使用しない場合は、サービスレイヤーから戻るOptional
も削除する必要がありますが、これは良い習慣ではないと思います。
上記のコードが適切でない理由を誰かが説明できますか?結果はどうなるでしょうか?
それは本当にMVCをどのように行っているかに依存します。 [〜#〜] mvc [〜#〜] は、M、V、およびCの通信方法を指示しません。あなたがしているならあなたのコードは理にかなっています this :
しかし、あなたがしている場合はそうではありません this :
どちらを実行するかは、 コマンドクエリの責任の分離 についてどのように感じているかによって大きく異なります。
MVCを使用していると言っても、あまりわかりません。これは、さまざまな方法で再発明された古いデザインパターンです。この時点で一貫しているのは、3つの責任領域を分離するという考えだけです。
数十億ドルの間違いは、null
をタイピングシステムに入れることでした。 null許容型で生活していることを修正する言語を使用しない限り。
注意深くnull
を返さないことは別のことです。 null
の意味はコンテキストごとに明確ではなく、通常は意図しない動作であるため、null
を返すことは避けてください。 nullオブジェクト を返すと、動作を制御し、意味を明確にすることができます。これは、Stringをnull
ではなく ""に設定するのと同じくらい簡単です。
Optional
は事実上コンテナであるため、null
を使用すると、Optional
オブジェクトクラスを定義しなくても同様の効果を得ることができます。ドットをオフにすると爆発するnull
にさらされるのではなく、Optional
は何も含まないArrayListのように機能します。
Optional
は、null
の存在を停止しません。それは単にそれを処理することを抽象化します。 if (foo != null)
チェックをOptional
に効果的に詰め込むので、それらを調べる必要はありません。また、Optional
を使い続ける限り機能します。 Optional
から抜け出し、そこにあるものに直接触れると、null
を処理して開始したところに戻ります。
返品でnull
を忠実に回避することは魅力的に聞こえるかもしれませんが、何かがOptional
を返すと言っているからといって、それでもあなたを台無しにすることができず、時には裸のnull
を返すことを意味しないことを理解してください。タイピングシステムはあなたにその約束をすることはできません。それは10億ドルの間違いです。