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