【问题标题】: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() 运行。通过这种方式,您可以实时获取统计信息,也可以使用计划任务从队列中提取缓冲数据或类似的方式来计算统计信息。

标签: java api-design


【解决方案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方法不能编译,异常处理需要多思考)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2019-04-07
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多