如何正确地对此进行抽象

时间:2019-10-16 11:29:08

标签: java oop coding-style

我在这里陷入困境。

因此,我有这个Rest API,它充当另一个使用它的API与来自外部提供程序的SOAP API之间的简化代理。

在其中,我有4个方法对应于4个Soap端点,这些方法将数据从Rest请求DTO-s映射到Soap请求DTO-s。

4个Rest请求DTO具有一个CommonDto,其中包含所有请求共有的一些对象。

此常见REST请求DTO的某些字段可以为空,如果是这种情况,我就设置了nullchecks,以便根本不设置相应的SOAP请求字段,因为那样会发出SOAP请求失败。

这4种方法基本上是这样的:

public RestResponseObject1 method1(RestRequestObject1 rRO1){
   SoapRequestObject1 sRO1= new SoapRequestObject1();

   Object commonField1= rR01.getCommonField1();//Object can be anything, BigDecimal, String, int,etc.
   if(commonField1!=null){
       sRO1.setCommonField1(commonField1);
   }

   BigDecimal commonField2= rR01.getCommonField2();
   if(commonField2!=null){
       sRO1.setCommonField2(commonField2.intValue());
   }

  //etc....

  return Mapper.map(soapService.doSoapMethod1(sRO1);
}

此方法重复4次,使用不同的RestRequestObjects,RestResponseObjects和SoapRequestObjects,但它们之间的commonfields类型不变。

我的问题是,我如何才能抽象出nullcheck,以便不为每个方法重复执行它们,从而使我的代码更干净?请注意,我没有选择对Soap请求对象执行任何操作的方法,因为它们是通过Swagger / OpenApi自动生成的

2 个答案:

答案 0 :(得分:1)

或者在上一个答案的基础上,使其更通用,以便它也适用于其他请求对象

private <T, E> void setIfNotNull(E setterObject, BiConsumer<E, T> setter, T value) {
   if (value != null) {
       setter.accept(setterObject, value);
   }
}

现在您可以致电

setIfNotNull(sRO1, sRO1::setCommonField1, rR01.getCommonField1());

答案 1 :(得分:0)

您可以从一个简单的实用程序方法开始:

weight_initialisation = random_normal * sqrt(2/(number of input for the layer))

您的主要代码将变为:

private static <T> void setIfNotNull(T object, Consumer<T> setter) {
  if (object != null) setter.accept(object);
}