另一层(1接口)与扩展N接口?

时间:2014-05-26 12:03:47

标签: api oop interface extend

我有一个数据访问层(SAP ABAP,但这里的语言并不重要)我每个实体/数据库表有1个接口,比如

  • IF_DATA_CONTRACT_POSITION-> get_contract_positions()
  • IF_DATA_CONTRACT_HEAD-> get_contract_header()
  • IF_DATA_OBJECT_CALC-> get_object_calculations()
  • 40多......

这些接口是由实际的数据库访问类impl和生成的缓存层实现的,这非常简单,因为这些方法实际上没有任何参数,只返回相关的"数据

但是在某些消费者中,我需要对返回的数据进行过滤访问,特别是我需要获取受合约位置约束的所有接口(~50)的数据。

那么,你建议

  • A)通过可选参数扩展所有接口,如IF_DATA_CONTRACT_POSITION-> get_contract_positions([OPTIONAL-FILTER]),这意味着我的impl和我的缓存层变得更复杂
  • B)我应该创建另一个接口IF_DATA_FILTER_CONTRACT_POSITION-> set_contract_position_filter?仅用于明确过滤数据访问

A)当使用可选的合同位置过滤器/约束扩展每个现有接口(上面列出的~40-50)时,API非常干净,如下所示:

result = lo_data_object_calc->get_contract_positions( <FILTER> ).

如前所述,它需要扩展每个实现,数据访问以及生成的缓存层。

B)另一方面,使用显式过滤器接口IF_DATA_FILTER_CONTRACT_POSITION,我还有另一个围绕数据访问的接口层,我可以生成非耦合过滤impls。我既不需要触及实际的数据访问impl,也不需要触及生成的缓存层。但是,使用会更加笨拙,比如

TRY.
     " down-cast from data-interface to filter-interface
     DATA lo_object_filter ?= lo_data_object_calc.
     lo_object_filter->set_contract_position_filter( <FILTER> ).
  CATCH could_not_cast. RAISE i-need-a-filter-impl!
ENDTRY.
result = lo_data_object_calc->get_object_calculations( ).

更新05.08.2014:我决定使用C)创建一个单独的过滤器对象,该对象明确过滤由例如get_contract_positions()。

1 个答案:

答案 0 :(得分:1)

我会选择解决方案A. 1.如果以后需要优化数据检索,可以在db-access-class中执行此操作 2.您可以在where子句中使用过滤器,而不必自己编程 3.使用您的接口的其他人必须查找,理解和使用您的过滤器接口/类。如果您在数据访问方法

中包含过滤器作为参数,我认为这样会更容易