Java 单独的解码/编码接口或在一个接口中

Java 单独的解码/编码接口或在一个接口中,java,api,oop,fluent-interface,Java,Api,Oop,Fluent Interface,我正在创建一个执行从一个表单到另一个表单转换的实现 我现在面临的设计问题是编码器和解码器API应该在一个接口中还是在单独的接口中。e、 g.ApacheMina使用 我目前正在做这样的事情: interface Convertor { A encode( B b ); B decode( A a ); } 将它们放在一个接口中的基本原理是,您可以将实现集中化,并在一个地方修复任何协议更改。对此有什么想法吗?唯一的问题是,通常只有一个代码部分使用解码器,另一个部分使用编码器。因

我正在创建一个执行从一个表单到另一个表单转换的实现

我现在面临的设计问题是编码器和解码器API应该在一个接口中还是在单独的接口中。e、 g.ApacheMina使用

我目前正在做这样的事情:

interface Convertor
{
    A encode( B b );

    B decode( A a );
}

将它们放在一个接口中的基本原理是,您可以将实现集中化,并在一个地方修复任何协议更改。对此有什么想法吗?

唯一的问题是,通常只有一个代码部分使用解码器,另一个部分使用编码器。因此,对接口编码部分的更改将强制对解码部分进行不必要的重新编译,反之亦然

对于具有头文件include的c/c++等,为True

搜索实体原则并查看界面分离原则。

好的,您可以有两个单独的界面,然后是另一个将它们组合在一起的界面。这将使为两者声明单个参数变得更容易,例如

private IEncoder encoder;
private IDecoder decoder;

public ThingWhichUsesEncodeAndDecode(IEncoder encoder, IDecoder decoder)
{
    this.encoder = encoder;
    this.decoder = decoder;
}

public ThingWhichUsesEncodeAndDecode(IEncoderDecoder both)
{
    this(both, both);
}

这实际上取决于你设想使用其中一部分而不是另一部分的频率。大多数时候,我发现编码/解码的东西我需要两个部分都可用,所以我可能只声明一个接口和两个方法,但这取决于具体情况。

通常您会将它们一起使用,但有时不会。 这取决于什么对你来说更自然。 顺便说一句:如果你单独定义它们,你仍然可以一起使用它们 e、 g


考虑不使用单独的编码器/解码器接口,而是

interface Encodable
{
    Decodable encode();
}
interface Decodable
{
    Encodable decode();
}
class A implements Encodable;
class B implements Decodable;

取决于应用程序


如果通常在同一个二进制文件中有一个编码器和一个解码器,一个接口就可以了。如果它们通常是分开的(例如,仅捕获应用程序编码,仅管理应用程序解码),请使用单独的接口。

将它们放在同一个接口中的缺点是,这会迫使您的实现在单个类中既是编码器又是解码器。这在目前看来似乎是合理的,但并非总是如此。所以我会问自己,这是否是一个要求/是可取的?

拥有独立的接口并不意味着不能集中实现。例如,您可以让一个类实现两个接口。或者,每个类都可以引用实现该协议的公共类


所以我要做的是有单独的接口,至少从一开始,有一个类同时实现这两个接口。因此实现是共享的,但用户代码将编码器和解码器视为独立的概念。

将它们分开要灵活得多。如果编写单独的接口,则始终可以将它们组合到第三个接口中,以便在需要编码和解码功能时使用


事实并非如此。如果您从一开始就编写一个接口,您将失去选择仅包含编码功能或解码功能的灵活性。

我不会仅基于此做出决定,因为实现可以是组合的,只需分别委托给实现编码和解码的不同类。如何将协议规范放在一个类中,并从中派生出编码器和解码器?@EricStalnik,这当然是完全抽象的,所以很难说具体,但通常,协议本身定义了许多数据结构和公共操作,这些都可以在一个公共类中定义。编码器和解码器可以使用这些数据结构并调用这些操作,同时提供一个简化的“编码器”或“解码器”接口。是的,我知道你说这是可能的。我想问的是你到底是怎么做的?将使用什么样的设计模式。“我不懂。”埃里克·斯塔尼克,你什么意思?我只是描述了我会怎么做。您不需要设计模式,只需编写代码即可按您所需的方式完成您所需的工作。
interface Encodable
{
    Decodable encode();
}
interface Decodable
{
    Encodable decode();
}
class A implements Encodable;
class B implements Decodable;