添加新行为时 SPI 应如何演变

问题描述 投票:0回答:1

这是一道SPI设计问题。我目前有以下界面:

interface IService {
    void init();
    void add(AddArgs args);
    void get(GetArgs args);
    void close();
}

现在应该添加一个新行为:

void delete(DeleteArgs args)

所以我的问题是:如何引入这个功能?它是一个新的独立界面吗?或者应该扩展上面的一个?

换句话说,这个(1):

interface IDeletableService {
   void delete(DeleteArgs args)
}

与(2):

interface IDeletableService extends IService {
   void delete(DeleteArgs args)
}

或者有什么我不知道的新设计。

请注意,“理想情况下”,可删除服务是“当前”的服务。但这并不意味着第二个选择 (2) 是首选。我更关心的是一个好的、可维护的 API 设计。

java api-design
1个回答
0
投票

我将通过SOLID原则来回答,让您轻松解决这个问题。

如果您认为每次引入新功能/行为时都会修改

IService
。因此,在这种情况下,您应该避免使界面太大。

相反,您可以遵循接口隔离原则,根据行为将它们拆分为单独的接口。

注意: 此外,您还确保该类仅通过此原则从接口实现所需的行为/方法,从而消除了为实现类中未使用的行为提供默认实现的开销。

这将确保您正确遵循 SOLID 原则以及良好的 API 设计。

您的代码应如下所示:

IInitService:

interface IinitService {
    void init();
}

I关闭服务:

interface ICloseService {
   void close();
}

我添加服务:

interface IAddService {
   void add(AddArgs args);
} 

我获取服务:

interface IGetService {
   void get(GetArgs args);
} 

ID删除服务:

interface IDeleteService {
   void delete(DeleteArgs args);
} 

现在,假设您要创建仅具有

add
行为的类。

public class AddServiceImpl implements IAddService, IInitService, ICloseService {

     @Override
     public void init() {
        //.....
     }

     @Override
     public void add(AddArgs args) {
        //.....
     }

     @Override
     public void close() {
        //.....
     }

}

这是相当容易维护的。

© www.soinside.com 2019 - 2024. All rights reserved.