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

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

哪個更好,編寫另一種方法還是向現有方法添加更多參數?

哪個更好,編寫另一種方法還是向現有方法添加更多參數?

墨色風雨 2021-06-29 08:00:42
我有一個方法: public Question createQuestion(String text, Project project, User createdUser, Date createdDate)控制器正在使用此方法來創建問題。現在參數中沒有標簽。我想實現向問題添加標簽的功能。要添加標簽,我需要向它傳遞一個 tagSet,當用戶在創建問題時未向問題添加標簽時,該標簽集也可以為空。那么,我應該再向它傳遞一個參數,然后if在將其添加到問題對象之前放置一個條件,還是應該編寫一個單獨的方法?public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate,Set<Tag> questionTagSet) 它將調用createQuestion,然后questionTagSet在上述createQuestion()方法返回的對象中設置。如果我編寫另一種方法,則檢查空標簽將在控制器中完成,如果沒有,則該檢查條件將在實用程序中進行。哪種方法更好?另外,在同一上下文中重載方法怎么樣?
查看完整描述

3 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

這個問題可能有很多很好的答案,根據您的具體用例,請記住設計模式(有時反模式是合理的)、最佳實踐等,這將使您的代碼更好。


也就是說,Question應該有添加新標簽的方法,因為它是具有tags屬性的類(不是嗎?)。您實施它的方式取決于您。它可能是這樣的:


public class Question {

  // ...

  public void addTags(Set<Tag> questionTagSet) {

    this.tags.addAll(questionTagSet);

  //...

  }

}

這樣,無論您有一個類型的對象,Question您都可以添加這樣的標簽:


//...

Set<Tag> tags = new HashSet<>();

Question q = new Question();

q.addTags(tags);

//...

從這一點來看,我認為沒有“最佳”選擇,而是“適合您的用例的最佳選擇”。因此,一種選擇是重載(有關詳細說明,請參閱下面的方法重載),另一種選擇是新方法(當然具有不同的簽名)。


方法重載:一種方法接收所有參數,另一種方法接收所有參數,但是questionTagSet,在該方法中,您只能通過提供默認值來調用接收所有參數的方法:null?,F在,在接收questionTagSet參數的Question#addTags方法中,如果questionTagSet參數不是 ,您將調用該方法null。這將允許您使用相同的方法簽名,但具有來自控制器的不同參數。因此,您不必檢查每個控制器(可能很多),因為您只將檢查移動到一個地方:createQuestionWithTags方法。


像這樣的東西:


帶有所有參數的方法,但 questionTagSet


public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate) {

  return createQuestionWithTags(text, project, createdUser, createdDate, null);

}

帶有所有參數的方法


public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate,Set<Tag> questionTagSet) {

 Question q = new Question();

 //... some more additional logic here

 if (questionTagSet != null) { //<- logic for adding tags moved here

    q.addTags(questionTagSet);

 }

 return q;

}

如果您想對questionTagSet參數進行一些檢查,則此實現可能會有所不同。

這樣做的優點:

  • 您可以createQuestionWithTags以不同的方式從不同的控制器調用該方法,而無需擔心questionTagSet參數:

    1. utility.createQuestionWithTags("", new Project(), new User(), new Date(), new HashSet<Tag>())

    2. utility.createQuestionWithTags("", new Project(), new User(), new Date(), null)

    3. utility.createQuestionWithTags("", new Project(), new User(), new Date())

缺點

  • 重載有時會很棘手且令人困惑

  • 在進行單元測試時,您需要確定正在測試哪種方法,因為簽名幾乎相同。


查看完整回答
反對 回復 2021-07-07
  • 3 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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