web-dev-qa-db-ja.com

「プラス」と「マイナス」は適切なメソッド名ですか?

Java SE 8は日付の新しいメカニズムを備えており、LocalDateLocalTimeLocalDateTimeクラスを導入して時刻を表します。このようなインスタントを操作するために、LocalDate.plusDays(...)LocalDate.minusDays(...)などの一連のメソッドが提供されます。

メソッドは実際には実行される操作であり、実行アクションになるものであるため、目的を説明する動詞の後にメソッドに名前を付けることが良い習慣であると常に思っていました。たとえば、StringBuilderのようなクラスを考えると、メソッドの名前はappendinsertdelete...になります。

これが私にとって、メソッドにplusDaysではなくsumDaysminusDaysの代わりにsubtractDaysという名前を付けるのが適切ではないように思える理由です。それは私がそれを非常に迷惑だと思っているだけですか?どう思いますか?

考えられる唯一の理由は、日付が不変オブジェクトであるため、plusDaysを呼び出すことで、元のオブジェクトに日数を追加するのではなく、新しいプロパティで新しい日を作成することになりますが、それは非常に微妙です。

21
Luigi Cortese

考えられる唯一の理由は、日付が不変オブジェクトであるため、plusDaysを呼び出すことで、元のオブジェクトに日数を追加するのではなく、新しいプロパティで新しい日を作成することになりますが、微妙に異なります。

これがまさに理由です。スケジュールの目的で日付の範囲を操作するためのAPIがあると想像してください。次のようなステートメントを作成できるメソッドが公開される場合があります。

var workdaySchedule = initialSchedule.withoutWeekends();

これは英語のステートメントと非常によく似ています。「就業日のスケジュールは週末のない最初のスケジュールです」。 変更初期スケジュールを意味するのではなく、作業スケジュールが別の新しいものであることを意味します。

代わりに、名前が付けられたと想像してください:

var workdaySchedule = initialSchedule.removeWeekends();

これは紛らわしいです。初期スケジュールは変更されていますか? 削除週末のように聞こえるので、確かにそれはそのように聞こえます。しかし、なぜそれを新しい変数に割り当てるのでしょうか。これらの2つの命名規則は非常に似ていますが、これは何が起こっているかを明確に示すものではありません。 removeWeekendsdidが初期スケジュールを変更し、void-を返した場合、これはより適切です。この場合、withoutWeekendsは混乱するオプションになります。


これは本質的に宣言型と命令型の違いです。私たちはdeclaringworkdayScheduleが特定のものであること、または命令instructionsのリストを実行して( "remove"のように)その特定のものにすることですか?事?通常、上記の例が示すように、値を変更する場合は命令型の命名がより意味があり、不変値では宣言型がより意味があります。

あなたの場合、あなたはまったく同じものを持っています。私が見た場合:tomorrow.plusDaystomorrowが変異しているとは思いませんが、tomorrow.addDays、そうかもしれないと思います。これはやや微妙ですが、必ずしも悪い意味ではありません。難しいことを考える必要はありませんが、このネーミングは、突然変異を起こしているかどうかという点で、正しい方向に沿って思考を自然に設定します。これらの命令型と宣言型のスタイルを明確に区別するには、「追加」(および「削除」)は動詞であり、「プラス」(および「なし」)は前置詞です。 。

52
Ben Aaronson

.NETでは、結果はまったく同じですが、名前は異なります。の代わりに:

tomorrow = LocalDateTime.plusDays(1);

有る:

tomorrow = DateTime.Now.AddDays(1);

これは、「プラス」と「追加」の理解の違いが個人的な意見の問題として終わったことを意味するだけです。元気を出してください、あなたは一人ではありません、少なくともあなたはあなたにもっと魅力的な言語を選ぶことができます:)

2
Agent_L