gpt4 book ai didi

java - 使用模式在 Java 中重构重复代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:41 25 4
gpt4 key购买 nike

这更多是关于 Java 而不是 Dropwizard;但我在 Dropwizard 中有两个资源:CustomerResourceApiResource

CustomerResource 中有一个 createCustomer 方法,它基本上创建了一个新客户。 ApiResource 还会在第三方调用其中的方法时创建一个新客户,因此这让我开始思考重复代码和解决它的最佳方法。我有几种方法;但为了更清楚起见,这里首先是类。

@Path("/internal")        
public class CustomerResource{
private DBDao dbDao;
private AnotherAPI api;

//constructor for DI

public Response Create(@internalAuth CustomerPojo customerPojo) {
//logic to validate customerpojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
Return response.ok(200).build();
}
}

@Path("/external")
public class ApiResource{
private DBDao dbDao;
private AnotherAPI api;

//constructor for DI

public Response Create(@ExternalAuth PartialCustomerPojo partialCustomerPojo) {
//logic to validate PartialCustomerpojo
//supplement partialCustomerPojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
Return response.ok(200).build();
}
}

因此,两个主要区别是端点的调用方式(身份验证)和提供的有效负载。

我考虑删除重复代码的方法是创建一个新的具体类,该类从两种资源中获取共性,并且每个资源都像这样实例化一个新类。

public class CommonClass{
private DBDao dbDao;
private AnotherAPI api;

//constructor for DI

public boolean Create (CommonPojo commonPojo) {
//logic to validate customerPojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
Return response.ok(200).build();
}
}

现在在 CustomerResourceApiResource 中,我只是这样做。

CommonClass commonClass = new CommonClass(dbDao, api);
//create a new instance customerPojo or CommonPojo and call

commonClass.create(customerPojo);

这听起来是个好策略吗?除了重复之外还有其他问题吗?这两个资源方法也不能在同一个类中。任何最佳实践将不胜感激。

最佳答案

我认为继承不是最好的解决方案。我也认为构图要好得多。这可以帮助您使用通用代码,并在您需要更改功能的其他地方轻松更改它。

还可以让您更轻松地测试所有类。

例如:

class CommonPojo {}
class CustomerPojo extends CommonPojo {}
class PartialCustomerPojo extends CommonPojo {}

interface IResourceValid {
boolean isResourceValid(CommonPojo pojo);
}

class CustomerPojoValidator implements IResourceValid {
@Override
public boolean isResourceValid(CommonPojo pojo) {
//your validation for customer
return false;
}
}

class PartialCustomerPojoValidator implements IResourceValid {
@Override
public boolean isResourceValid(CommonPojo pojo) {
//your validation for partial customer
return true;
}
}

class CommonResource{
private DBDao dbDao;
private AnotherAPI api;
private IResourceValid validator;

public IResourceValid getValidator() {
return validator;
}

//constructor for DI

public Response Create(CommonPojo commonPojo) {
//logic to validate customerpojo
//logic to ensure user isn't a duplicate
//some other validation logic
//finally user creation/saving to DB
validator.isResourceValid(commonPojo);
return response.ok(200).build();
}
}

//@Path("/internal")
class CustomerResource{
private CommonResource resource;

//constructor for DI

public Response Create(CustomerPojo CustomerPojo) {
return resource.Create(CustomerPojo);
}
}

//@Path("/external")
class ApiResource{
private CommonResource resource;

//constructor for DI

public Response Create(PartialCustomerPojo partialCustomerPojo) {
return resource.Create(partialCustomerPojo);
}
}

DBDao dao = new DBDao();
AnotherAPI api = new AnotherAPI();

CommonResource castomerCreator = new CommonResource(new CustomerPojoValidator(), dao, api);
CommonResource apiCreator = new CommonResource(new PartialCustomerPojoValidator(), dao, api);

CustomerResource customerResource = new CustomerResource(castomerCreator);
ApiResource apiResource = new ApiResource(apiCreator);

customerResource.Create(somePojo);
apiResource.Create(someAnotherPojo);

关于java - 使用模式在 Java 中重构重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54371787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com