Cách đặt tên cho biến khi từ vừa là danh từ vừa là động từ


48

Tôi đã gặp phải một vấn đề góc với hướng dẫn chung về:

  • danh từ cho biến
  • động từ cho các chức năng

Cụ thể, tôi có một trường hợp từ này mơ hồ - nó có thể là động từ hoặc danh từ. Và trong một số trường hợp khi chúng ta thảo luận về ứng dụng, nó sẽ được sử dụng cả hai cách trong cùng một câu.

Mục đích của tôi là đảm bảo chương trình sẽ vẫn có thể đọc được cho các nhà phát triển trong tương lai cũng như bản thân tôi khi tôi trở lại các phần của mã tháng sau.

Một trong những ví dụ là với a battery. A batterycó một chargevà bạn cũng có thể charge()một pin.

Tôi nghĩ rằng có cả hai Battery.ChargeBattery.Charge(value)sẽ gây nhầm lẫn cho các nhà phát triển trong tương lai.

Giải pháp hiện tại của tôi là chỉ cần chọn một từ khác cho một hoặc cả hai trường hợp đó (biến và hàm). Vấn đề của tôi với cách tiếp cận đó là Batterybiến và chức năng của đối tượng chargesẽ không phù hợp với các cuộc thảo luận thiết kế liên quan đến Battery.

Câu hỏi của tôi là nếu có một cách khác / tốt hơn để xử lý xung đột này trong quy ước đặt tên?


Một số đọc thêm về chủ đề này. Không ai thực sự giải quyết cụ thể câu hỏi của tôi.


3
làm cho chức năng sạc trở nên dễ dàng và đủ rõ ràng
ratchet freak

2
Bạn có thể thêm tiền tố vào biến danh từ với "Hiện tại-" không? Vậy "CurrentCharge" so với "Charge ()"?
Brian Snow

6
hoặc chỉ ChargeLevel để nhận được khoản phí hiện tại
ratchet freak

5
Tạo nên một từ. WordNet không nghĩ enqueuelà một từ, nhưng nó là một động từ trong Java. Thế còn doCharge? Nó vẫn sẽ thất bại trong kiểm tra đối xứng vì các phương thức khác của bạn sẽ không có tiền tố này
Biến sai lầm

5
"Hiện tại" = ngay bây giờ hoặc "hiện tại" = dòng phí. Giải pháp thực sự duy nhất là thay thế tiếng Anh bằng một ngôn ngữ hợp lý hơn!
DarenW

Câu trả lời:


38

Trong tình huống tương tự tôi cố gắng tìm các từ đồng nghĩa. Trong trường hợp này tôi sẽ sử dụng "nạp tiền" cho động từ. "Re-" là hơi dư thừa, nhưng ý nghĩa là rõ ràng. Sử dụng "sạc" đơn giản cho lần sạc còn lại trong pin là không rõ ràng vì nó không chỉ định bất kỳ đơn vị vật lý nào. Tôi thích "AvailableAmpHours", "hoursUntilRecharg" hoặc một cái gì đó tương tự. Các đơn vị sẽ phụ thuộc vào bất cứ điều gì thuận tiện cho ứng dụng.

Sở thích cá nhân của tôi là chỉ sử dụng động từ cho các chức năng thay đổi trạng thái. Tôi sử dụng danh từ cho các chức năng không đột biến. Tôi cho rằng nó phụ thuộc vào quan điểm của bạn. Ở cấp độ máy, các chức năng không đột biến làm một cái gì đó, nhưng ở cấp độ mô hình, chúng không hoạt động.


2
Điểm xuất sắc trên các đơn vị. Các đơn vị rõ ràng bị bỏ đi trong trường hợp này vì chúng có thể thay đổi tùy theo phân tích chúng tôi đang chạy. Tức là, chúng tôi đang sử dụng các thang thời gian khác nhau và Pin điều chỉnh các hoạt động của nó theo thang đo của phân tích.

1
Tôi thích động từ cho các chức năng đắt tiền, không đột biến. Ví dụ, các hàm chạy truy vấn trên cơ sở dữ liệu.
Brian

20

Chỉ cần ném nó ra khỏi đó, nhưng có lẽ giải pháp cho trường hợp đặt tên mơ hồ này là loại bỏ hoàn toàn chức năng đó khỏi pin. Tôi chưa bao giờ thấy pin tự sạc và nó sẽ có ý nghĩa hơn đối với tôi khi có lớp BatteryCharger. Điều này sẽ giúp giữ mối quan tâm của bạn tách rời hơn và làm cho hành động rõ ràng hơn.

battery.Charge(50) đấu với batteryCharger.Charge(battery, 50)

Đối với tôi, hình thức thứ hai dễ hiểu hơn nhiều và giữ tất cả mã "Sạc" của bạn ở một nơi thay vì rắc nó trong tất cả các loại pin của bạn.


6
Đó không phải là một suy nghĩ tồi, nhưng trong trường hợp Batterynày là một sự trừu tượng cho hệ thống sạc pin +. Ứng dụng của chúng tôi không yêu cầu chia hai khía cạnh thành các đối tượng riêng biệt, vì vậy chúng được cuộn thành một (hay còn gọi là Batterythuận tiện). Cuối cùng, tính chất vật lý của pin sạc có thể ra lệnh rằng nó có một số loại chức năng để chấp nhận sạc.

Trong trường hợp đó, tôi gửi câu trả lời của kevin cline là những gì bạn đang tìm kiếm. Để rõ ràng, tôi sẽ sử dụng Nạp tiền và Xả cho các chức năng đột biến và Tính phí cho tên thuộc tính. Có lẽ ChargePercent cũng là một thứ tốt.
chết

Bạn có lẽ là một lập trình viên Java? Đây rõ ràng là một sự vi phạm của Đừng lặp lại chính mình. Thực tế, bạn đang lặp lại MỌI THỨ trừ tham số "50". Tôi không thể đưa ra một ví dụ tồi tệ hơn về vi phạm DRY nếu tôi đã thử.
đóng hộp

@boxed Bạn có lấy ví dụ về tôi không? Bởi vì tôi không chắc làm thế nào bạn có thể tuyên bố tôi vi phạm DRY khi tôi không thực hiện. Tôi là một người ủng hộ rất lớn các nguyên tắc RẮN và tôi không thấy bạn đã đi đến kết luận đó như thế nào.
chết

Bạn đang vi phạm DRY bằng cách tạo một lớp BatteryCharger không cần thiết, bằng cách nào đó sẽ gây ra thay đổi trạng thái trong Pin. Vì vậy, BatteryCharger sẽ chấp nhận một số đầu vào mà sau đó nó sẽ ngay lập tức chuyển sang Pin.
kevin cline

9

Tránh nghĩa kép

Bạn đã cố tình chọn một từ có nhiều hơn một nghĩa và quyết định đầu tiên là vấn đề. Có rất nhiều từ gây rắc rối cho các lập trình viên. Một ví dụ khác sẽ là phone. Bạn có thể phoneai đó, hoặc bạn có thể có một phonetrong túi của bạn.

Sử dụng Getters và Setters

Việc đặt tên tiêu chuẩn cho hầu hết các đối tượng là các phương thức getters / settings cho các thuộc tính.

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

Thuộc tính là trạng thái không phải danh từ

Tôi nghĩ rằng bạn đang nhầm lẫn bằng cách phân loại các thuộc tính đối tượng là danh từ và các biến cũng có thể được nghĩ về các trạng thái. Họ là những quốc gia có liên quan đến phạm vi địa phương của sự tồn tại của họ.

Bạn có thể mô tả giá trị mà họ giữ như một danh từ, nhưng tôi không chắc điều đó đúng trong mọi trường hợp.

Trong thuật ngữ đối tượng OOP mô tả trạng thái của đối tượng đó. Trong trường hợp của bạn Battery, nó là một đối tượng và nó Chargelà một trạng thái. Vì vậy, đó sẽ là một tài sản của đối tượng, nhưng điều này phụ thuộc vào bối cảnh sử dụng nó như thế nào.

Nếu bạn cần có khả năng sử Chargedụng pin, và cũng biết nó Chargelà gì thì bạn có vấn đề.

Sử dụng phạm vi để thực thi bối cảnh

Bối cảnh là những gì sẽ làm rõ nghĩa của một từ bạn dự định một phương pháp hoặc tài sản để truyền đạt. Phạm vi là thiết lập khả năng truy cập của một thuộc tính / phương thức từ bên ngoài đối tượng.

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

Phương pháp là động từ

Bạn có thể mô tả phương thức của một đối tượng như một động từ, nhưng hành động từ phù hợp hơn. Trong thuật ngữ OOP, bạn thực hiện các hành động trên các đối tượng bằng các phương thức của chúng. Đó là hình thức xấu để sửa đổi thuộc tính của đối tượng từ bên ngoài đối tượng. Nên gọi một phương thức thực hiện các hành động cần thiết khiến trạng thái của nó thay đổi.

Từ Chargenày là một động từ, nhưng nó cũng là một danh từ. Khi được sử dụng để gọi phương thức của một hành động, nó trở nên rõ ràng rằng động từ đang được sử dụng Battery.Charge(....).

Nhưng, bối cảnh là rất quan trọng. Trong khi từ Charge()này là một động từ thì nó không có ý nghĩa như startCharging().

Phương pháp giá trị Batterycó thể bao gồm Charging, Discharging, setCharge, getCharge, hasCharge, DischargeCharged.

Các phương thức một từ đơn giản thường không nêu rõ hành động của chúng một cách rõ ràng, nhưng có một số trường hợp như opencloseyêu cầu giải thích ít.

Vì vậy, thực sự không có câu trả lời chính xác về cách đặt tên cho các loại thuộc tính / phương thức này. Ngoại trừ việc bạn cần sử dụng các kỹ thuật trên một cách khôn ngoan để đảm bảo không có sự nhầm lẫn.


2
Đối với hồ sơ, khách hàng là người đang sử dụng thuật ngữ mơ hồ. Tôi đã không tạo ra mớ hỗn độn đó. :-) Tôi đã đưa ra câu hỏi vì tôi nghĩ tôi có thể không phải là người duy nhất bước vào tình huống như vậy. Bạn có một số điểm hợp lệ trong câu trả lời của bạn. Trong trường hợp cụ thể này, chúng tôi không làm việc ở mức độ chi tiết của thời gian StartCharge()EndCharge()sẽ ngụ ý. Trong thực tế, thuật ngữ đó sẽ thêm chi phí đáng kể để xử lý hệ thống pin. Ở mỗi khoảng thời gian, nó có thể Charge()hoặc Discharge().

1
Cuộc đấu tranh chính là trong việc giữ cho ngữ nghĩa lập trình nội bộ đồng bộ với thuật ngữ mà khách hàng đang sử dụng. Chargetình cờ là từ mơ hồ dễ hiểu nhất cho miền này. Có một số người khác.

6

Chuẩn bị chúng với các động từ sẽ làm cho chúng một động từ hoặc một danh từ.

Battery.doCharge()

Battery.getCharge()

4

Đối với trường hợp động từ, tôi nghĩ Chargelà OK. Đối với trường hợp danh từ, sẽ getCurrentChargeLevellàm việc cho bạn?


Không chắc chắn về điều đó. Vì chúng tôi đang sử dụng C #, chúng tôi có thể khai báo get và set trên Thuộc tính thay vì cần các chức năng riêng biệt. Bất kể điều đó, tôi quan tâm đến việc bảo trì và nó sẽ trông như thế nào một khi tôi quên những gì tôi đã viết. Sẽ không getCurrentChargeLevel()cần phải đề cập đến một biến nội bộ Battery, và tên của biến đó sẽ là gì?

đang sạc điện áp hay phần trăm?
mhoran_psprep

1
@ GlenH7: À, tôi hiểu rồi. Bạn đã không chỉ định C # và bộ não của tôi ở chế độ Java. Dù sao đi nữa, tôi nghĩ rằng đối với danh từ đại diện cho lượng điện tích hiện tại trong pin, một cái gì đó dọc theo dòng Battery.currentChargeLevelcó thể hoạt động. Bạn có thể thử sử dụng Battery.coloumbshoặc Battery.ampereHoursnhưng điều đó có thể không rõ ràng ...
Thất vọngWithFormsDesigner

1
@mhoran_psprep - cũng không. ;-) ChargeEnergyđó là Power(Volts * Amps == Watts) nhân với thời gian. Vì vậy, trong trường hợp này, phí là một con số. Ngoài ra còn có một trạng thái tính phí là một phần trăm.

@FrustratedWithFormsDesigner - vâng, tôi đã bỏ C # vì tôi nghĩ trường hợp góc rộng hơn có thể áp dụng bất kể ngôn ngữ. Watt*timechắc chắn sẽ không phù hợp với các cuộc trò chuyện thiết kế, nhưng ChargeLevelsẽ.

0

Trong hầu hết các trường hợp, việc thêm một động từ trợ giúp, trạng từ hoặc tính từ là đủ tốt để phân biệt chúng và thực sự có thể giúp hiểu. Với trường hợp Sạc và Sạc () của bạn trên pin, làm cho DeltaCharge () có thể hiển thị rằng đó là chức năng có thể xử lý sạc hoặc xả.

Delta (trong trường hợp có thay đổi nhưng không rõ ràng) là công cụ sửa đổi mà tôi sử dụng và đề xuất cho người khác mọi lúc để xử lý thay đổi trạng thái (ngay cả khi động từ là bán rõ ràng).


0

Ký hiệu Hungary để giải cứu. Bạn có thể có intChargefcnCharge(value), do đó tránh nhầm lẫn và không thêm một tên dài điên rồ khi ba chữ cái sẽ hoạt động tốt.

Hoặc bạn chỉ có thể sử dụng cùng tên và để IDE xử lý nó. Việc tạo một tên dài hơn hoặc khác nhau có thể gây nhầm lẫn trong thời gian dài.


+1 cho phối cảnh độc đáo về câu trả lời. Đáng tiếc, ký hiệu Hungary rõ ràng là verboten theo hướng dẫn kiểu mã của chúng tôi. Điều đó không thay đổi giá trị tiềm năng của câu trả lời của bạn, chỉ là tôi không thể sử dụng nó làm giải pháp thực tế của mình.
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.