【问题标题】:Configuring a socket connection inside a library在库中配置套接字连接
【发布时间】:2019-12-17 20:56:23
【问题描述】:

我目前正在为我的一个程序开发一个库。在内部,库本身通过套接字连接到服务器。目前,目标主机和端口等套接字设置是通过 IConnection 配置的,这是我想为 lib 用户提供的两个类之一:

public interface IConnection {
   public void connect(String hostname, int port); //lib connects to a server internally
   public void disconnect();
}

一旦通过 IConnection 建立到服务器的连接,就可以通过库的第二个接口 IRequestor 触发请求:

public interface IRequestor {
    public String processRequest(String request);
}

我看不出这种设计有什么大的缺点,但是,有两件事困扰着我:

  1. 库假定用户了解发生前的关系,这意味着用户首先必须通过 IConnection 建立连接才能使用库的主要功能,即通过以下方式触发请求请求者。 只要我提供完整的文档,这是否可以接受,或者是否有更好的设计解决方案可以自动强制执行之前发生的关系?

  2. 套接字在整个库中用作字段。当用户断开连接并重新连接到不同的服务器时,许多类的状态会发生变化(它们现在请求不同的服务器)。因此,突然间,这些类向不同的服务器发出请求,并且很难推断出“套接字连接”的更改对象、地点和时间(因为套接字作为字段并通过内存“交换”,而不是方法传递)。 当然,我总是可以通过 IRequestor 指定服务器,但这似乎也不对,例如

    processRequest(String request, String hostname, int port)
    

【问题讨论】:

    标签: java design-patterns architecture


    【解决方案1】:

    如果在使用之前必须明确建立连接,我不认为这是一个问题——很多事情都是这样工作的。

    我可能会尝试通过在 IConnection 上使用工厂方法来使其在 API 中更直观,以返回绑定到特定连接的 IRequestor 对象。这明确表明,没有另一个就不可能发生。它确实假设您必须将IConnection 传递回您的图书馆的用户。

    另外,为了防止严重混淆,我可能会让IConnection 对象不可变——你可以建立和关闭它,但不能改变它。如果要连接到不同的服务器,请创建不同的 IConnection 对象。意外的状态更改会导致严重的错误。

    【讨论】:

      【解决方案2】:

      如果您查看任何用于连接到任何类型的服务器(DB、Socket)的标准库,您通常会发现建立连接然后执行任务的方法是不同的。

      如果你从“分离关注点”设计模型的思想来看,你应该有不同的方法来连接和处理请求。

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 2017-10-15
        • 2012-12-06
        • 2017-03-17
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        相关资源
        最近更新 更多