3

Objective C から Java に移植されたコードベースに取り組んでいます。nullcheck を使用しないメソッド チェーンの使用法がいくつかあります。

dog.collar().tag().name()

安全な逆参照演算子?に似たものを探していました。nullchecks の代わりに Groovy で

dog.collar?.tag?.name

これにより、Maybe モナドは Null の代わりに Nothing の概念を持つようになりました。しかし、値がアクセスされたときに、私が遭遇した Nothing のすべての実装は例外をスローしますが、それでもチェーンの問題は解決されません。NullObject パターンのように動作するモックを返す Nothing を作成しました。しかし、それはチェーンの問題を解決します。

この Nothing の実装に問題はありますか?

public class Nothing<T> implements Maybe<T> {

    private Class<T> klass;

    public Nothing(Class<T> klass) {
        this.klass = klass;
    }

    @Override
    public T value() {
        return mock(klass, Mockito.RETURNS_DEEP_STUBS); 
    }
}

私が見る限り

  1. コードでモッキングライブラリを使用するのは奇妙に感じます
  2. 最初のヌルで止まらない。
  3. null参照または名前が実際にnullであるため、null結果を区別するにはどうすればよいですか? Groovy コードではどのように区別されますか?
4

4 に答える 4

7

ヌルをチェックするだけではあまりお勧めしません。本当に、null を返さないことをお勧めしますが、代わりに例外をスローします。

どちらの場合でも、この null オブジェクト メソッドを実行してもコードが高速になることはありません。別のプログラミング言語の機能を複製したいという理由だけで、誰かを混乱させるだけになると思います。使用している言語に適応する必要があると思います。

于 2010-05-24T20:45:38.457 に答える
4

私はこの演算子も気に入っていますが、Java では使用できません。さらに、ずさんなコードに対する応急処置のパッチです。これはおそらくエラーであり、例外をスローする必要があります。

あなたが書いていないコードを継承しているときに、「より良いコード」と言うことが何かを解決するというわけではありません。

最初にコードをリファクタリングすることをお勧めします。そのようなコードがいたるところで発生している場合は、とにかく集中化された機能に移動する必要があるかもしれません。dog.getName() がタグを取得し、最後にタグの名前を取得するために dog.collar() に委譲する場合、このバグを 1 か所だけ修正する必要があります (犬は首輪になくても名前を持っている必要があります。そのため、dog.getName は問題を解決するために任意のパスをたどることができるはずです。今度は、くだらないコードの次のスポットに対してもう一度実行してください。

2 つの場所で同じコードにパッチを適用している場合は常に、因数分解の問題があります。これが属性のグループごとに 1 回だけ発生する場合 (既に完全に分解され、オブジェクト指向である場合)、深刻な問題になることはありません。

一体、このようなコードは、慣れ親しんだいくつかのルールに違反していませんか?

于 2010-05-24T20:52:58.700 に答える
1

クロージャーを使用して、これをモナドとして明示的に実装できます。

あなたの質問に出くわしたと同時に、これに出くわしました。
http://groovyconsole.appspot.com/script/205001

?. 安全な逆参照は、null チェックの groovy で明らかに構文的にクリーンです。チェーンを ?: で終了して、null の代わりに Nothing 値を返すことができます (このコンテキストでは "" など)。

モナドを理解したいなら、Haskell を学ぶことをお勧めします。そうすれば、これらの概念が他の言語でどのように使用され、どのように使用されるかが自然にわかり始めます。機能的であっても可変性を許容する言語 (Scala など) は、純粋に機能的なソリューションではなく、「不純な」ソリューションを示すことがよくあります。

于 2010-12-24T15:18:03.567 に答える
-2

Java には「安全な逆参照」演算子はありません。

「安全な逆参照」は多くの場合、バグが偽装されているため、これは良いことだと思います。基本的に 2 つの可能性があります。

  • が null であってはなりません。この場合、null は仮定に重大なエラーがあることを示しており、null が何らかの形で表示された場合は NullPointerException をスローする必要があります (これはフェイルファーストの原則です) 。
  • は null にすることができます。その場合、通常、「このメソッドを呼び出さない」よりも洗練された明示的な null 処理を行う必要があります。この状況でnull は何を意味するのでしょうか?

個人的には、通常、長いメソッド チェーンは、コードをより小さく明確な名前のメソッドにリファクタリングするためのヒントと見なします (必要に応じて、内部で適切な null 処理をラップできます)。これはおそらく、ほとんどの状況でモナドを導入するよりも賢明です。

于 2012-09-09T01:41:07.317 に答える