设计以下交互式 API 的替代方法是啥?

Posted

技术标签:

【中文标题】设计以下交互式 API 的替代方法是啥?【英文标题】:What are the alternatives ways of desiging following interactive API?设计以下交互式 API 的替代方法是什么? 【发布时间】:2021-10-26 04:11:14 【问题描述】:

界面的一个简单版本是:

public interface IAPI 
   void initialize(int processId) throws APIException;
   APIResult process(IData data) throws APIException;
   void finalize();

Finalize 方法创建一份关于已处理数据的摘要报告(对我来说非常重要的信息),但对客户来说并不重要。

API 的使用方式如下:

IAPI api = new API();
api.initialize(18);
loop 
       IData data = …..getData!
       APIResult res = api.process(data);

       // do something with result.


// Finalize - We want to enforce the finalize call
api.finalize();

我需要一个解决方案来确保在他们处理完数据后调用 finalize 方法。该解决方案必须足够灵活,以让用户定义他们希望如何处理异常,处理他们想要的尽可能多的数据。提前感谢您提供任何替代方案。

【问题讨论】:

我会避免依赖调用finalize() 方法的客户端。它根本不可靠,尤其是在运行process() 时满足了他们的担忧。我的意思是,开发人员会随意不关闭数据库连接对象...解决此问题的一种方法是汇总您的数据并将其缓冲为process() 运行。通过这种方式,您可以实时获取统计信息,也可以使用计划任务从队列中提取缓冲数据或类似的方式来计算统计信息。 【参考方案1】:

我会这样做:

import java.util.function.Function;

public class Test 
    static class APIException extends Exception 
    static class APIResult 
    static class IData 
    
    // This is the public API
    interface  IAPI 
        <T> T withIDataProcessor(Function<IDataProcessor,T> process) throws APIException;

        interface IDataProcessor 
            APIResult process(IData idata);
        
    
    
    // only the DefaultIAPI class knows about this
    interface PrivateIAPI 
        void initialize(int processId) throws APIException;
        APIResult process(IData data) throws APIException;
        void finalize();
    

    static class DefaultIAPI implements IAPI 
        private PrivateIAPI privateIAPI;

        @Override
        public <T> T withIDataProcessor(Function<IDataProcessor, T> process) throws APIException 
            try 
                privateIAPI.initialize(5);
                return process.apply(idata -> 
                    try 
                        return privateIAPI.process(idata);
                     catch (APIException e) 
                        // handle this in some way
                        throw new RuntimeException(e);
                    
                );
             finally 
                privateIAPI.finalize();
            
        
    

    public static void main(String[] args) 
        IAPI iapi = new DefaultIAPI();
        int result = iapi.withIDataProcessor(idataProcessor -> 
            while (idataProcessor.process(...getData())) 
                ...
            
            return n;
        );
    

(注意main方法不能编译,异常处理需要多思考)

【讨论】:

以上是关于设计以下交互式 API 的替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

RESTful API 设计:内部交互

在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法是啥?

matlab软件是啥软件?有啥用途

MVC的替代品[关闭]

交互是啥意思?

在 iOS 上修改 PDF 交互式表单域的最佳方法是啥?