web-dev-qa-db-ja.com

既存のAPIにメソッドを追加することは単一の責任の違反ですか

POSTおよびGETメソッドを持つRest APIがあるとします。

APIでリソースを上書きする場合は、GETメソッドを呼び出して元のアイテムを取得し、POSTメソッドを呼び出して、変更が完了した後でそのリソースを置き換えます。

最初のアプローチのようにクライアントクラスに更新機能を追加するか、新しいクラスを作成してそこに更新機能を追加し、2番目のアプローチのようにクライアントクラスを外部から呼び出す必要がありますか

最初のアプローチ

class BookApiClient{

 Client restClient = ClientBuilder.newClient();

 public Book getBook(String id){

 // code to get book using rest client
 }

 public void postBook(){

 //code to post a book

 }


 public void updateBookTitle(String id, String newTitle){

  Book book = getBook(id);

  book.setTitle(newTitle);

  postBook(book);

 }

}

第二のアプローチ

class BookUpdater{

 BookApiClient bookService;

 public BookUpdater(BookApiClient bookService){

   this.bookService = bookService;

 }

  public void updateBookTitle(String id, String newTitle){

  Book book = bookService.getBook(id);

  book.setTitle(newTitle);

  bookService.postBook(book);

 }

}

UpdateBookTitleメソッドをクライアントクラスに追加すること、または2番目のアプローチのようにそれを別のものとして持つことは、単一責任の原則に違反しますか?

4
Claudiga

最初のアプローチは問題なく一貫しています。それはSRPと矛盾しません。単一責任の原則は、クラスが何をするかではなく、変更する理由についてです。ボブおじさん(SRPの「発明者」)が この優れた記事 で説明しています。

さらに、あなたの REST API は、POSTの代わりに完全な置換(および部分的な更新の場合はPATCH)の代わりに適切なPUTを提供できます。最初のアプローチを使用すると、 APIの詳細を非表示にする利点があり、本を処理するためのより単純なインターフェースを提供します。

BookAPIClientリモートファサード として機能します。変更する唯一の理由は、book APIの進化でしょう。

6
Christophe