【问题标题】:Is it a good idea to create a class for object identified by names?为由名称标识的对象创建一个类是个好主意吗?
【发布时间】:2010-03-17 18:25:01
【问题描述】:

我有一个可以通过名称识别的服务列表。每个服务都有一组参数(IP 地址、端口、可用性等)。还有一些方法可以应用于服务(关闭连接、打开连接、向服务器发送消息、检查是否响应等)。

所以,我认为创建一个 Server 类并将真实服务器表示为该类的对象是一种自然的方法。

但是比我意识到这不是很方便。例如,我有一个服务器名称(只是一个字符串),我想用这个服务器做点什么。然后我需要一个映射,将服务器的名称映射到代表该服务器的对象?这似乎不是一个优雅的解决方案。

我决定创建一个包含一组静态方法的类。然后,例如以下列方式使用它:ServerClass.sendMessage("NameOfServer","MyMessage") 或例如ServerClass.close("NameOfServer")ServerClass.getIP("NameOfServer")

这是一个好的解决方案吗?

【问题讨论】:

    标签: java oop class object


    【解决方案1】:

    拥有具有各种实例的类的一个优点是它提供了一种类型安全性。如果你有

    Server myServer = ServerRepository.getServer("NameOfServer");
    if (myServer != null) myServer.sendMessage("MyMessage");
    

    那么您在发送消息之前就知道您的服务器名称是否有错字(因为您的存储库无法返回匹配的消息)。

    【讨论】:

    • 我的问题如下。有时我发现我需要处理名为“FirstServer”的服务器。我知道对于这台服务器,我已经有了一个对象。但现在我需要罚款这个对象。我该怎么做?我应该有某种从服务器名称到代表服务器的对象的映射吗?我没有看到一个优雅的解决方案。这就是为什么我认为使用静态方法是个好主意。在这种情况下,如果我知道服务器的名称,我可以立即执行 MyClass.doWhatIWant("NameOfServer") 之类的操作。
    • 这就是 ServerRepository 的目的。它是一个用于获取服务器实例的单例对象。当您调用它时,如果它尚未创建该特定服务器的实例,它会创建它并缓存它。如果你再次请求它,你会得到缓存的实例。
    • 好的。我懂了。这就是我需要的。所以,我需要 2 个类(一个是 Server,另一个是 ServerRepository)。但是我不明白 ServerRepositiory 如何检查是否已经存在与服务器的特定名称相对应的 Server 类的对象。
    • ServerRepository 有一种创建服务器的方法,但也保留了服务器名称到服务器的映射。因此,当您请求服务器时,它会在地图中查找它,如果不存在,它会创建它(并将其放入地图中)。我认为拥有这样的地图没有任何不雅之处,如果它被包装在存储库结构中并且服务器是根据需要创建的。
    【解决方案2】:

    您的所有服务器是否都公开相同的服务,或者是否有一些依赖于服务器。例如,如果您同时拥有具有方法 doFoo() 的 FooServer 和具有方法 doBar() 的 BarServer,但 Foo 没有 doBar 且 Bar 没有 doFoo,那么这可能是一个坏主意,因为您的 ServerClass 可能会暴露以下方法对潜在的呼叫者毫无意义。但是,如果您知道您的所有服务器都将成为 FooServer,那么这可能是一种有效的方法,因为您可以集中公共代码。我会说要小心,您的代码保持可维护性,并且您不会在需要自定义的地方强制执行常见行为,或者您最终会添加大量额外参数来指示“特殊情况”,在这些情况下您需要稍微改变行为一个或另一个原因。

    【讨论】:

    • 我的服务器彼此非常相似。它们共享相同的方法并拥有相同的参数集。但问题是它们是由名称标识的。例如,在某个阶段,我知道我需要对名为“FirstServer”的服务器做一些事情。然后我必须找到一个对应于这个服务器的对象。这就是为什么我认为我可能不应该将服务器表示为类的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多