system-sekkei/isolating-the-domain

EmployeeQueryServiceクラスにおけるメソッド名の非統一性に関する質問

Closed this issue · 2 comments

特定の従業員を選択する時と、契約中の従業員一覧を取得する時で、メソッド名を途中で変える/変えないで違う意図は何でしょうか。

また、chooseは動詞、contractingEmployees は名詞でプロパティを取得しているように見え、それも統一されていないことに違和感があります。

過去の従業員も管理するために、テーブルに「契約中」「契約終了」を設けられているかと思いますが、契約が終了した人を「従業員」とは呼称しないのではないでしょうか。

それをふまえると、従業員一覧を取得するメソッドはgetAllのような動詞でよいのではないかと考えました。(メソッド名で契約中をあえて表現する必要はない。)

ご意見をいただいてもよろしいでしょうか。

public Employee choose(EmployeeNumber employeeNumber) {
return employeeRepository.choose(employeeNumber);

public ContractingEmployees contractingEmployees() {
return employeeRepository.findUnderContracts();

命名規約、統一性

命名に言語化した細かい規約は設けていないので、いろいろなスタイルが混在しているのが現状ですね。

気になった点は、時々コメントしたり修正したりしていますが、厳密な統一性にこだわってはいません。

メソッド名

メソッド名の一般論としては、動詞にはこだわっていません。
これは、Javaあるいはオブジェクト指向の伝統的な命名の慣習からすると、違和感があるかもしれません。
ただ、最近は、動詞ではなメソッド名も見かけることが増えたし、わかりやすいなら、動詞にこだわることは重要ではないと考えています。

たとえば、 java.time.LocalDate 型は、動詞系のメソッド以外に、 atTime() とか with() とか、動詞でないメソッドもあって、意図としてわかりやすいメソッド名だと思っています。

choose()

個人的には、この名前は違和感がありますね。
習慣的にはfindByあたりにしたいかな。

contractingEmployees()

この名前は冗長ですね。改善できそう。

getAll() は、getが冗長ですね。 私なら より簡単に all() を選びます。

で all() と書いてみると、「すべて」の一覧というのは違和感があります。
この場合「契約中」という条件が入るわけですが、それが返す型の名前の表現でよいかどうかは検討の余地はありそうです。

たとえば、ContractingEmployees 型の名前を変更したときに、意図が消えてしまいそうです。
ここらへんは、ちょっとした命名実験をしてみるとよいかもしれません。

契約終了した「従業員」

一般的な言葉の意味だけでいえばおっしゃる通り、従業員とは呼ばないですね。
元従業員という言葉はありますが、ことさら「元」を強調すべき場面は少なそうです。

このサンプルアプリケーションは、ある量販店系の雇用契約関連の実際のアプリケーションを元に、作ってみたものです。

そのアプリケーションでは、定期的に契約更新したり、閑散期にはいったん契約がなく繁忙期には再契約みたいなことが現場で行われています。

期間契約が切れても、従業員の候補をプールしておく、というような意図があります。
契約状態によって、従業員以外の名前を考案することは、このアプリケーションでは、それほど重要な課題ではないと思います。

ご回答ありがとうございます。
理解できたと思います。