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


21

Java SE 8には、時刻、インスタントLocalDateLocalTimeおよびLocalDateTimeクラスを紹介するクラスを導入するための新しいメカニズムが付属しています。そのようなインスタントを操作するために、一連のメソッドが提供されます:LocalDate.plusDays(...)などLocalDate.minusDays(...)

メソッドは、実際には実行される操作であり、アクションを実行するものであるため、良いプラクティスは、メソッドの目的を説明する動詞にちなんでメソッドに名前を付けることだと常に考えてきました。あなたのようなクラスを検討している場合だけに言及し、StringBuilder例えば、メソッドの名前はappendinsertdelete...

これが、私にとって、の代わりにメソッドplusDaysを命名するように聞こえない理由です。非常に迷惑なのは私だけですか?どう思いますか?sumDaysminusDayssubtractDays

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


22
あなたはこれを技術的に見すぎていると思います。メソッド名の実際の目標は、メソッドの動作を明確にし、読みやすくすることです。動詞で名前を付けると、通常これら2つの目標が達成されることがわかります。ただし、sqrt平方根を取るメソッドを検討してください。このメソッドにtakeSqrt名前を付けることは、ルールに従って意味をなすように見えるかもしれませんが、これに名前を付けても、メソッドが読みやすくなったり、明確になったりすることはありません。
ブランディン

2
プログラミングは「英語」ではありません。たとえばsqrt、プログラマーが認識して知っておくべき単語です。ちなみに英語の単語は「平方根」です。しかし、英語で自然なことに従って物に名前を付けるのは良くありません。たとえば、「違法」という単語を考えてみましょう。完全にすばらしい英語の単語です。しかし、誰かがメソッドに名前を付けた場合、isIllicitこのメソッド呼び出しを見るたびに眼球を引き裂きたいと思います。それはひどく見えるだけで、アイデアを表現するためのより良い方法が必要です。
ブランディン

18
sumこの文脈では間違っているように聞こえます。私は.netの方が好きAddDaysです。
-CodesInChaos

3
@LuigiCorteseメソッド名は、一般的な英語の単語の順序に一致するように選択されます。 Math.addExact(1, 2)「1と2を追加」と言うからです。 tomorrow.plusDays(2)「明日と2日間」と言うからです。どうにかしてのaddExactメンバーだったら、そうだったIntegerでしょう1.plusExact(2)
タビアンバーンズ

8
個人的にはplusDays、新しい日付x将来の日数を返すことを期待しaddDaysますが、元のオブジェクトを変更することを期待するかもしれません。それは私だけですが、私はJavaにそれほど精通していません。
Ajedi32

回答:


52

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

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

var workdaySchedule = initialSchedule.withoutWeekends();

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

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

var workdaySchedule = initialSchedule.removeWeekends();

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


これは本質的に宣言的対命令的区別です。それが特定のものであることを宣言しているのworkdayScheduleか、それともその特定のものを作成するための命令のリスト(「削除」など)を実行しているのか。通常、値を変更する場合は命令型の命名がより意味があり、上記の例が示すように、不変の値の場合は宣言型がより意味があります。

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


13
私は実際に問題を抱えていたaddDaysplusDays昨日!.NETでは、DateTimeクラスにと呼ばれるメソッドaddDaysaddMonthsありaddYearsます。相対的な日付(1年、2か月、3日前)を解析するメソッドを作成し、前述のメソッドが現在のDateTimeオブジェクトを変更していると考えて呼び出しました。データベース内のすべての日付は2015年6月8日でした。「それはおかしい」と思いました。オブジェクトをaddDays変更せずDateTime新しいオブジェクトを返すことを思い出したときです。したがって、この質問については+1です。
グレッグブルクハート

1
@GregBurghardt .NETユーザーとして、私はまったく反対の期待を抱いています。私はへの直接マッピング、交換可能ではありません、「追加」という「プラス」と、この唯一の手段を推測+し、+=
Agent_L

2
@Agent_Lそれは興味深いです。.NETの規則はさておき、「add」と「plus」は英語では交換できません。
ベンアーロンソン

1
また、日付と時刻については、特定の起点に関連する時間を参照するためにD + 1、H + 12などと言うのが一般的です(また、宇宙飛行T-10、T-9など)。通常、これはD-plus-1、H-plus-12、T-minus-10として読み取られます。たぶん米国中心ですが、それは私に見える方法です。
クリスチャンH

4
Jon Skeetのこの古いStackOverflowの質問はおもしろいと思うかもしれません
MicSim

2

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

tomorrow = LocalDateTime.plusDays(1);

がある:

tomorrow = DateTime.Now.AddDays(1);

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


-1

これはおそらく.Method、オブジェクトを変更するメソッドと変更しないメソッドの両方で、すべてのメソッドに使用するJavaのアーティファクトです。

言語想像ありobject=>method与えるだろう構文、method上の仕事にオブジェクトのコピーを。今ではそのような言語でstartDate=>plusDays(5)は、明らかにあいまいではありません。元の日付を取り、5日後の新しい日付を作成します。

無関係なメモでsumDaysは、ここでは意味がありません。LocalDateは時間はなく時間である。任意の数の期間を合計でき(結果は別の期間です)、時刻と期間を追加できます(結果は別の時刻です)が、時刻を合計することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.