我正在创建一个执行从一种形式到另一种形式的转换的实现。
我现在面临的设计问题是 Encoder 和 Decoder API 应该在一个接口中还是在不同的接口中。例如 Apache MINA 使用单独的接口
我目前正在做这样的事情:
interface Convertor
{
A encode( B b );
B decode( A a );
}
将它们放在一个接口中的基本原理是,您可以集中实现并在一个地方修复任何协议更改。对此有什么想法吗?
我正在创建一个执行从一种形式到另一种形式的转换的实现。
我现在面临的设计问题是 Encoder 和 Decoder API 应该在一个接口中还是在不同的接口中。例如 Apache MINA 使用单独的接口
我目前正在做这样的事情:
interface Convertor
{
A encode( B b );
B decode( A a );
}
将它们放在一个接口中的基本原理是,您可以集中实现并在一个地方修复任何协议更改。对此有什么想法吗?
拥有单独的接口并不意味着您不能集中实施。例如,您可以让一个类实现两个接口。或者每个类都可以引用一个实现协议的公共类。
所以我要做的是有单独的接口,至少在开始时,让一个类实现两者。因此实现是共享的,但用户代码将编码器和解码器视为独立且独立的概念。
唯一的问题是,您通常有一个代码部分将使用解码器,而另一个代码部分将使用编码器。因此,对接口编码部分的更改将强制对解码部分进行不必要的重新编译,反之亦然。
适用于带有头文件的 c/c++ 等。
搜索可靠的原则并查看接口隔离原则。
好吧,您可以有两个单独的接口,然后是另一个将它们组合在一起的接口。这将使能够更容易地为两者声明一个参数,例如
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);
}
这实际上取决于您设想使用一个部件而不是另一个部件的频率。大多数时候,我发现编码/解码的东西我需要两个部分都可用,所以我可能只用两种方法声明一个接口——但这确实取决于具体情况。
将它们放在同一个接口中的缺点是它迫使您的实现在单个类中同时成为编码器和解码器。目前这似乎是合理的,但可能并非总是如此。所以我会问自己这是否应该是一个要求/是否可取?
将它们分开会更加灵活。如果您编写单独的接口,您可以随时将它们组合成第三个接口,以便在需要编码和解码功能时使用。
反过来是不正确的。如果您从一开始就编写一个接口,您将失去选择仅包含编码或解码功能的灵活性。
通常你会一起使用它们,但有时不会。这取决于什么对你来说更自然。顺便说一句:如果您单独定义它们,您仍然可以一起使用它们,例如
interface Converter extends Decoder, Encoder { }
考虑没有单独的编码器/解码器接口,而是
interface Encodable
{
Decodable encode();
}
interface Decodable
{
Encodable decode();
}
class A implements Encodable;
class B implements Decodable;
取决于应用程序。
如果通常你在同一个二进制文件中有一个编码器和一个解码器,一个接口就可以了。如果它们通常是分开的(例如,捕获应用程序仅编码,管理应用程序仅解码),则使用单独的接口。