名前重要とは何であるか?
名前重要というのは、「変数名はi,jとかじゃなくて分かりやすいものにしよう」などという単純なものではない。
以下に、私の考える3大名前重要ポイントを挙げる。
プリミティブの値、その値の集合に名前を付ける
DDDの世界ではValue Objectということになろうが、引数がintやstringのような型だと、利用者側で使い方を間違えないための方策は、結局その引数名に委ねられる。これをプロジェクト全体に渡って、整合性のとれた名前付けをするのは至難の業なので、その意味を表す名前を付けた型として定義するのである。
条件式に名前を付ける
例えば下記のような条件式があった場合、これが何を意味しているかがパッとは分からない。
code:java
if ((HolidayUtils.isHoliday(drive.getEnteredAt().toLocalDate())
|| HolidayUtils.isHoliday(drive.getExitedAt().toLocalDate()))
&& EnumSet.of(STANDARD, MINI, MOTORCYCLE).contains(drive.getVehicleFamily())
&& drive.getRouteType() == RouteType.RURAL) {
この条件式の部分をメソッドとして切り出し、isHolidayDiscount のように名前を付ければ、先のif文は「休日割引だったら」という意味がとれるようになる。
code:java
boolean isHolidayDiscount(HighwayDrive drive) {
return (HolidayUtils.isHoliday(drive.getEnteredAt().toLocalDate())
|| HolidayUtils.isHoliday(drive.getExitedAt().toLocalDate()))
&& targetVehicleFamilies.contains(drive.getVehicleFamily())
&& drive.getRouteType() == RURAL;
}
区分値、コード値の集合に名前を付ける
先の例で、以下のような条件がある。
code:java
&& EnumSet.of(STANDARD, MINI, MOTORCYCLE).contains(drive.getVehicleFamily())
これは車種が「普通車」または「軽自動車」または「二輪車」だったら、ということを意味しているが、なぜこの組み合わせなのかが分からない。これは中型車より小さい車両をグルーピングして、料金計算などが変わることがあるためで、ここ以外にも使用箇所は出てきかねないため、これを名前を付けて表すようにする。
code:java
final static EnumSet SMALLER_THAN_MID_SIZE = EnumSet.of(STANDARD, MINI, MOTORCYCLE);
&& SMALLER_THAN_MID_SIZE.contains(drive.getVehicleFamily())
区分値やコード値が、データベース上の値として存在し、SQLを文でIN句やOR句を使ってそれらをWHERE句に並べる場合も同様である。この場合、××マスタテーブルに対する××カテゴリテーブルが設計上足りてないことに起因することが往々にしてある。業務で使う分類を見出し、データ設計するようにしよう。