4

私の例はこれです。ユーザーに電話してもらいたい

findCustomers(...)

今私の質問は、このメソッドの引数についてです。私は

Customer.java

オブジェクトと、ユーザーがライブラリを使用して顧客名と顧客 ID で検索できるようにしたいと考えています。

今は複数のメソッドを作成したくありません

findCustomerById(String id)
findCustomerByName(String name)
findAllCustomers()

代わりに私がやろうと思ったのは、これが一般的な findCustomer です

/** if you pass only custoer.name and rest of fields are null will search by name,
if you pass a null custoer object will return all customers, if you pass both custoer id and his name will search by both fields). **/
findCustomer(Customer customer)

今、私は API の一般的な単一のメソッドを持っていますが、オブジェクトに null を渡すのは好きではありません。null は好きではありません。

そのようなAPIの明確なベストプラクティスを持っている人はいますか?

ありがとう

4

3 に答える 3

8

クエリ用の流動的なAPIのようなものはどうですか:

List<Customer> matches = find(new CustomerQuery().withName("john(.*)").withId(42));
于 2012-12-15T11:54:39.267 に答える
3

あなたが構築しようとしているものはQuery By Exampleと呼ばれます。それは問題ありませんが、制限があります。Customerクラスがクエリ パラメータとして転用され、そのコードの一部が役に立たなくなったり、逆効果になったりします。たとえば、名前に文字のみを含める必要がある検証を追加した場合、ワイルドカードを使用して名前を照会することはできません。

これに対処する 1 つの方法は、クエリ パラメーターを処理するために特別に設計されたクエリ ビルダー クラスを提供することです。クエリ オブジェクト自体はMap<String,Object>、ユーザーから渡されたパラメーター バインディングの 1 つをラップし、クエリ API がそれを分解して、対応するデータを基になるデータ ストアのクエリに渡すことができます。

QueryObject<Customer> qObj = new QueryObject(Customer.class);
qObj.setParameter("FirstName", "Joe");
qObj.setParameter("LastName", "S*");
qObj.setParameter("ID", 123);
List<Customer> cust = findCustomers(qObj);
于 2012-12-15T11:59:41.353 に答える
1

Customer オブジェクトを渡す代わりに、他にも多くのメソッドがあると思います

findCustomer(String id, String name); // id or name can be null.

または、これらのいずれかまたは複数の ID と名前を持つことができる CustomerSearch オブジェクト。

于 2012-12-15T11:52:25.973 に答える