为什么要以这么复杂的方式完成?这是OOP的思维方式吗?

时间:2010-03-07 17:01:49

标签: java bonjour zeroconf

我正在尝试使用Java中的Bonjour。我找到了一个如何做的例子,我想我明白了。但我仍然不明白为什么要这么复杂。可能是我想念一些东西。

因此,code I found以下列方式工作(代码也在下面给出)。

  1. Java程序试图找到服务,如果找到服务,程序会尝试“解析”服务(我认为“解析服务”意味着“使用服务”或“连接到服务”服务“)。

  2. 要“解析”找到的服务,我们需要调用“DNSSD.resolve”方法,并且作为此方法的最后一个参数,我们需要提供一个对象。

  3. “DNSSD.resolve”尝试解析给定的服务。如果“DNSSD.resolve”能够解析该服务,则调用作为最后一个参数的实例的“serviceResolved”方法。如果“DNSSD.resolve”无法解析服务,ti会调用上述对象的“operationFailed”方法。

  4. 以下是代码:

    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. 程序运行“serviceResolved”或“operationFailed”方法,具体取决于“DNSSD.resolve”返回的值。

    6. 或者我只是不习惯OOP的思维方式?

6 个答案:

答案 0 :(得分:4)

与“异步思维方式”不同,“OOP思维方式”并非如此。通过对可能需要一段时间的操作使用回调函数,您可以在等待操作完成时执行其他操作(或者仅保持GUI响应)。

答案 1 :(得分:4)

当然,有很多不同的方法可以解决“问题”。这里采用的方法是一种回调方法:你调用resolve方法并将它交给一个方法(好吧,实际上是一个包含方法的对象,因为Java没有匿名方法或闭包等......)。 一旦解析器(un-)成功解决了你想要解决的任何问题,它就会调用你给它的serviceResolved方法(然后用解析器提供的信息做一些事情)。

这意味着它是一种异步方法,但不是OO。当解析器处于“工作”状态时,您可以执行其他操作,serviceResolved方法将被称为 somewhen ,因此您无需等待。

答案 2 :(得分:2)

该代码也是Java - > JNI - > C代码。关于它没有任何OO。它是异步过程代码,带有Java包装器。

答案 3 :(得分:1)

DNSSD.resolve的JavaDoc声明“大多数操作都是非阻塞的;客户端通过一个操作结果的接口回调。回调是从一个单独的工作线程进行的。”

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

这就是并行性的来源。

答案 4 :(得分:0)

JBonjourBrowser中,您可以看到其他人引用的“异步方法”如何在JTree订阅者模型中使用。作者指出,这“特别有用......设备通常非常短暂,服务会在不久后宣布并消失。

答案 5 :(得分:0)

回调接口样式通常用于异步操作。

在设计接口时,尤其是网络或IO操作中涉及的服务时,经常出现两个问题: 1.操作同步(阻塞)还是异步(非阻塞) 2.操作是否返回值

我们不能说回调样式是否是面向对象的。 面向对象的设计是为每个对象分配明确的责任。

相反,回调机制是异步操作的OO设计中非常常见的模式。 1.负责提供规定服务的服务 2.负责接收服务响应的回调