亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用模式在 Java 中重復代碼重構

使用模式在 Java 中重復代碼重構

蠱毒傳說 2022-05-21 21:01:00
這更多是關于 Java 而不是 Dropwizard;但我在 Dropwizard 中有兩個資源: CustomerResource和ApiResource.有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();    }}現在在里面CustomerResource,ApiResource我只是這樣做。CommonClass commonClass = new CommonClass(dbDao, api);//create a new instance customerPojo or CommonPojo and call commonClass.create(customerPojo);這聽起來像是一個好策略嗎?除了重復之外,還有其他問題嗎?這兩個資源方法也不能在同一個類中。任何最佳實踐將不勝感激。
查看完整描述

3 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

我認為繼承不是最好的解決方案。我也認為構圖要好得多。這可以幫助您使用通用代碼并在需要更改功能的其他地方輕松更改它。


此外,它還允許您更輕松地測試所有類。


例如:


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);


查看完整回答
反對 回復 2022-05-21
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

這可以通過以下兩種方式來實現

  1. 創建一個接口,然后在兩個目標類上實現,以便它們都可以提供本地實現

  2. 使用抽象類,然后擴展它。

接口不會使您免于編碼,而是使抽象類不強制執行任何操作的情況下保持內聯,因此兩者都有弱點。您可以實現多個接口,但只能擴展一個類。牢記這一點,我更傾向于接口

從 Java 8 開始。Java 支持使用接口的默認方法,我認為這是最好的方法。您可以在默認方法中提供默認實現,用戶可以根據需要覆蓋該方法。這將為您提供最好的接口和抽象類。

public interface CommonCode {


    default 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();

    }

}


@Path("/internal")        

public class CustomerResource  implements CommonCode {

    private DBDao dbDao;

    private AnotherAPI api;


    //constructor for DI

    create(CommonPojo)

}


@Path("/external")

public class ApiResource implements CommonCode {

    private DBDao dbDao;

    private AnotherAPI api;


    //constructor for DI

    create(CommonPojo)

}


查看完整回答
反對 回復 2022-05-21
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

有很多選擇,這完全取決于您使用的策略。我更喜歡使用抽象類并在其中制作非抽象方法。當您擴展抽象類時,您可以選擇要使用的方法。在您的場景中,它應該如下所示:


public abstract class AbstractResource {


    private CustomerService customerService;


    @Autowired

    public void setCustomerService(CustomerService customerService) {

        this.customerService = customerService;

    }


    public Response create(CustomerPojo customer) {

        return customerService.createCustomerPojo(customer);

    }


    public Response create(PartialCustomerPojo customer) {

        return customerService.createPartialCustomerPojo(customer);

    }


}

CustomerResource @Override唯一需要的方法:


@Path("/internal")

@Component

public class CustomerResource extends AbstractResource {


    @POST

    @Override

    public Response create(PartialCustomerPojo customer) {

        return super.create(customer);

    }


}

相同的ApiResource


@Path("/external")

@Component

public class ApiResource extends AbstractResource {


    @POST

    @Override

    public Response create(CustomerPojo customer) {

        return super.create(customer);

    }


}

一切都在一個地方 - CustomerService,在那里你做你的邏輯。


@Service

public class CustomerService {


    @Autowired

    private AnotherAPI api;


    @Autowired

    private DBDao dao;


    public Response createCustomerPojo(CustomerPojo customer) {

        //logic to validate customerpojo

        //logic to ensure user isn't a duplicate

        //some other validation logic

        //finally user creation/saving to DB

    }


    public Response createPartialCustomerPojo(PartialCustomerPojo customer) {

        //logic to validate PartialCustomerpojo

        //supplement partialCustomerPojo

        //logic to ensure user isn't a duplicate

        //some other validation logic

        //finally user creation/saving to DB

    }

}

如果要最小化重復,則必須使用接口并在每個類中實現:


public class CustomerPojo implements PojoInterface {

}

public class PartialCustomerPojo implements PojoInterface {

}

現在你只能有一個抽象方法:


public abstract class AbstractResource {


    private CustomerService customerService;


    @Autowired

    public void setCustomerService(CustomerService customerService) {

        this.customerService = customerService;

    }


    public abstract Response create(PojoInterface customer);


}

然后在“一個地方”,您需要檢查參數的每個實例:


public Response create(PojoInterface customer) {

        if (customer instanceof CustomerPojo){

            //logic to validate customerpojo

            //logic to ensure user isn't a duplicate

            //some other validation logic

            //finally user creation/saving to DB

        }else if (customer instanceof 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

        }

    }

編輯:對不起,很長的帖子......


查看完整回答
反對 回復 2022-05-21
  • 3 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號