Có phải cộng với tên lửa và cộng trừ


21

Java SE 8 đi kèm với một cơ chế mới cho những ngày, giới thiệu LocalDate, LocalTimeLocalDateTimecác lớp học để biểu diễn khoảnh khắc của thời gian. Để thao tác khoảnh khắc như vậy, một tập hợp các phương pháp được đưa ra: LocalDate.plusDays(...), LocalDate.minusDays(...)và vân vân.

Tôi đã luôn nghĩ rằng thực tiễn tốt là đặt tên cho các phương thức sau khi các động từ mô tả mục đích của chúng, vì thực tế, các phương thức được thực thi, một cái gì đó sẽ thực hiện một hành động. Chỉ cần đề cập đến, nếu bạn xem xét các lớp học như StringBuilder, ví dụ, tên phương pháp là append, insert, delete...

Đây là lý do tại sao với tôi nó không phải âm thanh đặt tên một phương pháp plusDaysthay vì sumDays, minusDaysthay vì subtractDays. Chỉ là tôi thấy nó rất phiền phức? Bạn nghĩ sao?

Lý do duy nhất tôi có thể nghĩ đến là ngày tháng là những đối tượng bất biến, vì vậy bằng cách gọi plusDaysbạn không thêm ngày vào đối tượng ban đầu mà tạo ra một đối tượng mới với các thuộc tính mới, nhưng điều đó rất tinh tế.


22
Tôi nghĩ rằng bạn đang xem xét điều này quá kỹ thuật. Mục tiêu thực tế cho các tên phương thức là làm cho nó rõ ràng những gì nó làm và làm cho nó có thể đọc được. Nó chỉ ra rằng việc đặt tên cho chúng với các động từ thường hoàn thành hai mục tiêu này. Tuy nhiên, hãy xem xét một phương pháp được gọi là sqrtlấy căn bậc hai. Đặt tên cho phương thức này takeSqrtcó vẻ có ý nghĩa theo quy tắc của bạn, nhưng đặt tên cho phương thức này sẽ không làm cho phương thức dễ đọc hơn và cũng không làm cho nó rõ ràng hơn.
Brandin

2
Lập trình không phải là "tiếng Anh". Ví dụ, sqrtchỉ là một từ mà các lập trình viên dự kiến ​​sẽ nhận ra và biết. Nhân tiện, từ tiếng Anh là "căn bậc hai". Nhưng đặt tên mọi thứ theo những gì tự nhiên trong tiếng Anh là không tốt. Lấy từ "bất hợp pháp", ví dụ, một từ tiếng Anh hoàn toàn tốt. Tuy nhiên, nếu ai đó đặt tên cho phương pháp của họ, hãy nói rằng isIllicittôi nghĩ rằng tôi sẽ muốn xé nhãn cầu mỗi khi tôi nhìn vào phương thức này. Nó chỉ có vẻ khủng khiếp và phải có một cách tốt hơn để thể hiện ý tưởng.
Brandin

18
sumNghe có vẻ sai trong bối cảnh này. Tôi thích .net AddDays.
CodeInChaos

3
@LuigiCortese Tên phương thức được chọn để khớp với thứ tự từ tiếng Anh thông dụng. Math.addExact(1, 2)bởi vì bạn nói "thêm 1 và 2". tomorrow.plusDays(2)bởi vì bạn nói "ngày mai cộng 2 ngày". Nếu addExactlà một thành viên của Integerbằng cách nào đó nó sẽ có được 1.plusExact(2).
Tavian Barnes

8
Cá nhân, tôi dự kiến plusDayssẽ trả lại một ngày mới x số ngày trong tương lai, trong khi addDaystôi có thể mong đợi sẽ làm thay đổi đối tượng ban đầu. Mặc dù đó chỉ là tôi, tôi không quen thuộc lắm với Java.
Ajedi32

Câu trả lời:


52

Lý do duy nhất tôi có thể nghĩ đến là ngày là đối tượng bất biến, vì vậy bằng cách gọi plusDays bạn không thêm ngày vào đối tượng ban đầu mà tạo một đối tượng mới với các thuộc tính mới, nhưng điều đó rất khác nhau.

Đây chính xác là lý do. Hãy tưởng tượng bạn có một số loại api để thao túng phạm vi ngày cho mục đích lên lịch. Nó có thể phơi bày các phương thức cho phép bạn đưa ra tuyên bố như:

var workdaySchedule = initialSchedule.withoutWeekends();

Điều này đọc rất giống với tuyên bố tiếng Anh: "Lịch làm việc là lịch trình ban đầu không có ngày cuối tuần". Nó không ngụ ý thay đổi lịch trình ban đầu, nó ngụ ý lịch trình làm việc là một điều mới, khác biệt.

Bây giờ thay vào đó hãy tưởng tượng nó được đặt tên:

var workdaySchedule = initialSchedule.removeWeekends();

Điều này thật khó hiểu. Là lịch trình ban đầu đang được sửa đổi? Nó chắc chắn nghe giống như vậy, vì có vẻ như chúng ta đang loại bỏ những ngày cuối tuần khỏi nó. Nhưng tại sao chúng ta lại gán nó cho một biến mới? Mặc dù hai phương án đặt tên này rất giống nhau, nhưng kế hoạch này ít gợi lên rõ ràng hơn về những gì đang xảy ra. Đây sẽ là thích hợp hơn nếu removeWeekends đã làm thay đổi lịch ban đầu, và trở void- trong trường hợp này withoutWeekendssẽ là lựa chọn khó hiểu.


Đây thực chất là một sự phân biệt khai báo và bắt buộc. Chúng ta đang tuyên bố rằng đó workdaySchedulelà một điều cụ thể, hay chúng ta đang thực hiện một danh sách các hướng dẫn bắt buộc (như "loại bỏ") để thực hiện điều cụ thể đó? Thông thường, việc đặt tên bắt buộc có ý nghĩa hơn khi bạn thay đổi giá trị và khai báo có ý nghĩa hơn với các giá trị bất biến, như ví dụ trên minh họa.

Trong trường hợp của bạn, bạn có chính xác điều tương tự. Nếu tôi thấy : tomorrow.plusDays, tôi sẽ không tưởng tượng rằng nó tomorrowđang bị đột biến, trong khi đó tomorrow.addDays, tôi nghĩ nó có thể xảy ra. Điều này là hơi tinh tế - nhưng không nhất thiết là một cách xấu. Không cần phải suy nghĩ về nó quá khó, cách đặt tên này tự nhiên đặt suy nghĩ của bạn theo đúng dòng về việc bạn có biến đổi hay không. Để làm cho sự khác biệt này giữa các kiểu mệnh lệnh và khai báo rõ ràng hơn: "thêm" (và "loại bỏ") là các động từ , trong khi "cộng" (và "không có") là giới từ .


13
Tôi thực sự có một vấn đề với addDaysso với plusDaysngày hôm qua! Trong .NET, các DateTimelớp học có phương pháp gọi là addDays, addMonthsaddYears. Tôi đã tạo ra phương pháp để phân tích một ngày tương đối (1 năm, 2 tháng, 3 ngày trước) và gọi các phương thức đã nói ở trên nghĩ rằng họ đang sửa đổi DateTimeđối tượng hiện tại . Mỗi ngày trong cơ sở dữ liệu kết thúc vào ngày 8 tháng 6 năm 2015. "Thật buồn cười", tôi nghĩ. Đó là khi tôi nhớ rằng addDayskhông sửa đổi DateTimeđối tượng, nó sẽ trả về một đối tượng mới . Vì vậy, +1 xung quanh cho câu hỏi này.
Greg Burghardt

1
@GregBurghardt Là một người dùng .NET, tôi hoàn toàn trái ngược với mong đợi. Tôi đoán điều này chỉ có nghĩa là "cộng" và "thêm" có thể trao đổi, không phải ánh xạ trực tiếp đến ++=
Agent_L

2
@Agent_L Thật thú vị. Các quy ước .NET sang một bên, "thêm" và "cộng" không thể hoán đổi cho nhau bằng tiếng Anh.
Ben Aaronson

1
Ngoài ra, đối với ngày và giờ, người ta thường nói về D + 1, H + 12 và liên quan đến thời gian tham chiếu đến một nguồn gốc cụ thể (cũng như đối với chuyến bay vào vũ trụ T-10, T-9, v.v.). Thông thường, điều này được đọc là D-plus-1, H-plus-12, T-minus-10. Có thể Mỹ tập trung, nhưng đó là cách nó xuất hiện với tôi.
Kristian H

4
Bạn có thể thấy câu hỏi StackOverflow cũ này của Jon Skeet rất thú vị: Cái tên nào hay nhất cho một phương thức add add không biến đổi trên một bộ sưu tập bất biến? .
MicSim

2

Trong .NET, việc đặt tên là khác nhau mặc dù kết quả hoàn toàn giống nhau. Thay vì:

tomorrow = LocalDateTime.plusDays(1);

có:

tomorrow = DateTime.Now.AddDays(1);

Điều này chỉ có nghĩa là sự khác biệt giữa hiểu biết về "cộng" và "thêm" đã kết thúc như là vấn đề quan điểm cá nhân. Vui lên, bạn không đơn độc, ít nhất bạn có thể chọn ngôn ngữ hấp dẫn bạn hơn :)


-1

Đây có lẽ là một tạo phẩm của Java sử dụng .Methodcho tất cả các phương thức, cả những phương thức sửa đổi đối tượng và những phương thức không.

Hãy tưởng tượng một ngôn ngữ cũng có một object=>methodcú pháp, nó sẽ cung cấp methodmột bản sao của đối tượng để làm việc. Bây giờ trong một ngôn ngữ như vậy, startDate=>plusDays(5)rõ ràng là không rõ ràng. Nó lấy ngày ban đầu và tạo một ngày mới là 5 ngày sau.

Trên một lưu ý không liên quan, sumDayskhông có ý nghĩa ở đây. LocalDatelà thời điểm , không phải là một thời gian thời gian . Bạn có thể tính tổng số lượng thời lượng (và kết quả là thời lượng khác) và bạn có thể thêm điểm thời gian và thời lượng (kết quả là thời điểm khác), nhưng bạn không thể tính tổng thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.