2

Bonjour を Java から使用しようとしています。それを行う方法の例を見つけたので、理解できたと思います。しかし、なぜそんなに複雑な方法でそれを行う必要があるのか​​ 、まだ理解できません。何かが恋しいのかもしれません。

したがって、私が見つけたコードは次のように機能します (コードも以下に示します)。

  1. Javaプログラムはサービスを見つけようとし、サービスが見つかった場合、プログラムはサービスを「解決」しようとします(「サービスを解決する」とは「サービスを使用する」または「サービスに接続する」ことを意味すると思います)。

  2. 見つかったサービスを「解決」するには、「DNSSD.resolve」メソッドを呼び出す必要があり、このメソッドの最後の引数としてオブジェクトを指定する必要があります。

  3. 「DNSSD.resolve」は、特定のサービスを解決しようとします。「DNSSD.resolve」がサービスを解決できる場合、最後の引数として指定されたインスタンスの「serviceResolved」メソッドを呼び出します。「DNSSD.resolve」がサービスを解決できない場合、ti は上記オブジェクトの「operationFailed」メソッドを呼び出します。

コードは次のとおりです。

DNSSD.resolve(0, ifIndex, serviceName, regType, domain, new ResolveListener(){
                public void serviceResolved(DNSSDService resolver, int flags, int ifIndex,
                String fullname, String hostname, int port, TXTRecord txtRecord){
                    InetAddress theAddress;
                    try {
                        theAddress = InetAddress.getByName(hostname);
                    } catch (UnknownHostException e) {
                        // ouch..
                    }
                }

                public void operationFailed(DNSSDService arg0, int arg1) {
                    // ouch, again!
                }
            });

次のようにコードを整理する方が簡単ではないでしょうか。

  1. 解決したいサービスに関する情報を指定して「DNSSD.resolve」メソッドを呼び出します。

  2. 「DNSSD.resolve」にはオブジェクトを渡しません。

  3. 「DNSSD.resolve」は、どのクラスのメソッドも呼び出しません。

  4. 「DNSSD.resolve」は特定のサービスを「解決」しようとし、それができた場合、「DNSSD.resolve」は true を返します。それ以外の場合は false を返します。

  5. プログラムは、「DNSSD.resolve」によって返された値に応じて、「serviceResolved」または「operationFailed」メソッドのいずれかを実行します。

それとも、OOP の考え方に慣れていないだけですか?

4

6 に答える 6

4

「OOP の考え方」ではなく、「非同期の考え方」です。時間がかかる可能性のある操作でコールバック関数を使用することにより、操作が完了するのを待っている間、他のことを行うことができます (または単に GUI の応答性を維持することができます)。

于 2010-03-07T17:10:24.587 に答える
4

もちろん、「問題」へのアプローチにはさまざまな方法があります。ここで採用されているアプローチはコールバック アプローチです。resolve メソッドを呼び出してメソッドを渡します (Java には匿名メソッドやクロージャーなどがないため、実際にはメソッドを含むオブジェクトです...)。そのリゾルバーが、解決したいものを解決 (失敗) すると、指定したserviceResolvedメソッドが呼び出されます (次に、リゾルバーが提供する情報を使用して何かを実行します)。

つまり、これは非同期アプローチですが、オブジェクト指向ではありません。Resolver が「動作」している間、何か他のことを行うことができます。メソッドはsomewhenserviceResolvedと呼ばれるため、それを待つ必要はありません。

于 2010-03-07T17:16:09.550 に答える
2

また、そのコードは Java -> JNI -> C コードです。それについてOOは何もありません。これは、Java ラッパーを使用した非同期手続き型コードです。

于 2010-03-07T17:12:47.620 に答える
1

DNSSD.resolve の JavaDoc には、「ほとんどの操作は非ブロッキングです。クライアントは、操作の結果を持つインターフェイスを介してコールバックされます。コールバックは別のワーカー スレッドから行われます。」と記載されています。

http://developer.apple.com/mac/library/documentation/Java/Reference/DNSServiceDiscovery_JavaRef/com/apple/dnssd/DNSSD.html

そこから並列性が生まれます。

于 2010-03-07T17:35:10.363 に答える
0

コールバック インターフェイス スタイルは、一般的に非同期操作に使用されます。

インターフェイス、特にネットワークまたは IO 操作に関連するサービスを設計する場合、次の 2 つの質問が頻繁に発生します。

コールバック スタイルがオブジェクト指向かどうかはわかりません。オブジェクト指向設計とは、各オブジェクトに明確な責任を割り当てることです。

逆に、コールバック メカニズムは、非同期操作の OO 設計では非常に一般的なパターンです。1. 所定のサービスを提供するサービス 2. サービスの応答を受け取るコールバック

于 2010-06-23T06:29:59.063 に答える
0

では、他の人が引用した「非同期アプローチ」がサブスクライバー モデルJBonjourBrowserでどのように使用されているかを確認できます。JTree著者は、これは「デバイスが非常に一時的なものであることが多く、サービスが発表されてすぐに消える場合に特に役立ちます。

于 2010-03-07T18:16:10.997 に答える