Tên phương pháp lấy dữ liệu [đã đóng]


103

Cảnh báo: Đây không phải là một câu hỏi / thảo luận không quá nghiêm trọng mà tôi đang đăng ... nhưng tôi sẵn sàng cá rằng hầu hết các nhà phát triển đã cân nhắc "vấn đề" này ...

Luôn muốn nhận được các ý kiến ​​khác về quy ước đặt tên cho các phương thức đã đi và lấy dữ liệu từ đâu đó và trả về ...

Hầu hết các tên phương thức đều đơn giản và rõ ràng ... SaveEaffee (), DeleteOrder (), UploadDocument (). Tất nhiên với các lớp, bạn rất có thể sẽ sử dụng dạng rút gọn ... Lưu (), Xóa (), Tải lên () tương ứng.

Tuy nhiên, tôi luôn phải vật lộn với hành động ban đầu ... làm thế nào để lấy dữ liệu. Có vẻ như đối với mọi dự án, cuối cùng tôi phải nhảy giữa các quy ước đặt tên khác nhau bởi vì tôi không bao giờ hài lòng với cái cuối cùng mà tôi đã sử dụng. Theo như tôi có thể nói đây là những khả năng ->

  • GetBooks ()
  • FetchBooks ()
  • Truy xuất Sách ()
  • FindBooks ()
  • LoadBooks ()

Bạn nghĩ gì?

Câu trả lời:


126

Đó là tất cả về ngữ nghĩa nhất quán ;

Trong tiêu đề câu hỏi của bạn, bạn sử dụng lấy dữ liệu . Điều này cực kỳ chung chung theo nghĩa là bạn cần phải xác định nhận được nghĩa là gì về mặt ngữ nghĩa một cách rõ ràng. Tôi đưa ra các ví dụ sau để hy vọng đưa bạn đi đúng hướng khi nghĩ đến việc đặt tên cho mọi thứ.

  1. getBooks() là khi bạn nhận được tất cả các sách được liên kết với một đối tượng, điều đó có nghĩa là tiêu chí cho bộ sách đã được xác định và chúng đến từ đâu là một chi tiết ẩn.
  2. findBooks(criteria) là khi bạn đang cố gắng tìm một tập hợp con của sách dựa trên các tham số của lệnh gọi phương thức, điều này thường sẽ bị quá tải với các tiêu chí tìm kiếm khác nhau
  3. loadBooks(source) là khi bạn đang tải từ một nguồn bên ngoài, chẳng hạn như tệp hoặc db.
  4. Tôi sẽ không sử dụng tìm nạp / truy xuất vì chúng quá mơ hồ và bị nhầm lẫn với get và không có ngữ nghĩa rõ ràng được liên kết với các điều khoản.

Ví dụ: fetch ngụ ý rằng một thực thể nào đó cần phải đi lấy thứ gì đó ở xa và mang nó trở lại. Chó tìm nạp một cây gậy, và truy xuất là một từ đồng nghĩa với tìm nạp với ngữ nghĩa bổ sung mà bạn có thể đã sở hữu thứ trước đó. get là một từ đồng nghĩa với có được cũng có nghĩa là bạn phải sở hữu duy nhất của một cái gì đó và không ai có thể có được nó cùng một lúc.

Ngữ nghĩa cực kỳ quan trọng:

ngành ngôn ngữ học và logic học liên quan đến ý nghĩa

Các nhận xét là bằng chứng cho thấy các thuật ngữ chung chung như getfetch không có ngữ nghĩa cụ thể và được những người khác nhau hiểu theo cách khác nhau. Chọn một ngữ nghĩa cho một thuật ngữ, ghi lại những gì nó định ngụ ý nếu ngữ nghĩa đó không rõ ràng và phù hợp với việc sử dụng nó.

những từ có ý nghĩa mơ hồ hoặc tham vọng được những người khác nhau đưa ra những ngữ nghĩa khác nhau vì định kiến ​​và định kiến ​​dựa trên ý kiến ​​cá nhân của họ và điều đó sẽ không bao giờ kết thúc tốt đẹp.


4
Tôi muốn thêm rằng tôi muốn sử dụng lấy / lấy nếu các dữ liệu đã được lấy ra từ một cơ sở dữ liệu
Liz Albin

1
Hừ! Bạn có phân biệt được tiêu chí ký tự đại diện và tiêu chí cụ thể không. Ví dụ: bạn có sử dụng FindBooks (nhà xuất bản) khi tìm sách từ một nhà xuất bản cụ thể không? Hoặc có thể GetBooksFromPublisher (nhà xuất bản)?
Jason

5
Publisher.getBooks () sẽ là cách làm được ưa thích, trong đó nhà xuất bản là một phiên bản cụ thể của Nhà xuất bản. Library.getBooks (nhà xuất bản) nơi nhà xuất bản triển khai giao diện BookSearchCriteria. Tương tự với Library.getBooks (tác giả), nơi tác giả đã triển khai giao diện BookSearchCriteria. Bạn cũng sẽ có một cách logic Library.getPublishers () là một phương pháp nhà máy

3
Cảm ơn bạn vì câu trả lời này. Chắc chắn thêm một số rõ ràng. Về bản chất, bạn đang nói rằng các phương thức truy xuất bởi một bộ lọc cụ thể nên ở lại với đối tượng. Giao diện sẽ được sử dụng theo cách nào? Ví dụ: giao diện BookSearchCriteria. Bạn có thể cung cấp một số mã mẫu?
Jason

2
thường đặt tên cũng giống như fetchkhi dữ liệu thời gian truy cậpthấp , tức là trên cùng một thiết bị, từ cơ sở dữ liệu địa phương, từ bộ nhớ. loadhoặc downloadnếu thời gian truy cập cao hơn , từ Internet, DB bên ngoài, từ tệp
János

13

Thành thật mà nói, bạn chỉ nên quyết định với nhóm của mình nên sử dụng quy ước đặt tên nào. Nhưng để giải trí, hãy xem luồng suy nghĩ của bạn sẽ ra sao để quyết định bất kỳ điều nào trong số này:

  • GetBooks ()

Phương pháp này thuộc về một nguồn dữ liệu và chúng tôi không quan tâm cách nó lấy chúng, chúng tôi chỉ muốn Lấy chúng từ nguồn dữ liệu.

  • FetchBooks ()

Bạn coi nguồn dữ liệu của mình như một con chó săn, và nhiệm vụ của anh ta là lấy sách của bạn. Tôi đoán bạn nên tự mình quyết định xem anh ta có thể nhét bao nhiêu chiếc vào miệng cùng một lúc.

  • FindBooks ()

Nguồn dữ liệu của bạn là một thủ thư và sẽ sử dụng hệ thống Dewey Decimal để tìm sách của bạn.

  • LoadBooks ()

Những cuốn sách này thuộc một loại "túi sách điện tử" nào đó và phải được xếp vào đó. Đảm bảo gọi ZipClosed () sau khi tải để tránh làm mất chúng.

  • Truy xuất Sách ()

Tôi không có gì cả.


1
Câu trả lời được chấp nhận không phân biệt rõ giữa "get" và "fetch" cũng như câu trả lời này. Tìm nạp ngụ ý rằng nó phải được thực hiện bởi người khác vì nó sẽ mất một thời gian hoặc yêu cầu một số chuyên môn để hoàn thành, trong khi có được ngụ ý rằng nó ngay lập tức và có sẵn nguyên văn hoặc "không có sẵn".
Sridhar Sarnobat

Tôi cũng đang gặp khó khăn với câu trả lời được chấp nhận ngày hôm nay. Đối với dự án của tôi (dựa trên React / Redux), tôi tin rằng điều quan trọng là phải phân biệt giữa dữ liệu được lấy từ cửa hàng Redux so với cơ sở dữ liệu của ứng dụng và API của bên thứ ba. Làm đúng điều này chắc chắn sẽ giúp cải thiện khả năng đọc trong tương lai. Nhà phát triển ban đầu được sử dụng addcho cả ghi vào cơ sở dữ liệu và ghi vào Store. Bây giờ tôi đang cố gắng tách chúng ra, và đó là một nỗi đau.
tim.rohrer

9

Câu trả lời là chỉ cần bám vào những gì bạn cảm thấy thoải mái và nhất quán.

Nếu bạn có một trang web barnes và quý tộc và bạn sử dụng GetBooks (), thì nếu bạn có một mục khác như thực thể Phim, hãy sử dụng GetMovies (). Vì vậy, bất cứ điều gì bạn và nhóm của bạn thích và nhất quán.


22
Ít nhất thì bạn cũng nhất quán về lỗi chính tả. ;-)
Wim Hollebrandse

1
Rất nhất quán với nhất quán ... :)
JonH

Không bị xúc phạm chút nào ... cảm ơn bạn đã chỉ ra nó.
Jason

2

Trong OO (C ++ / Java), tôi có xu hướng sử dụng getSomething và setSomething vì rất thường xuyên, nếu không phải lúc nào tôi cũng nhận thuộc tính private từ lớp đại diện cho đối tượng dữ liệu đó hoặc thiết lập nó - cặp getter / setter. Như một điểm cộng, Eclipse tạo chúng cho bạn.

Tôi có xu hướng chỉ sử dụng Tải khi ý tôi là tệp - như trong "tải vào bộ nhớ" và điều đó thường ngụ ý tải vào nguyên thủy, cấu trúc (C) hoặc đối tượng. Tôi sử dụng gửi / nhận cho web.

Như đã nói ở trên, tính nhất quán là tất cả mọi thứ và bao gồm cả các nhà phát triển chéo.


1

Không rõ ý bạn là "lấy dữ liệu". Từ cơ sở dữ liệu? Một tập tin? Ký ức?

Quan điểm của tôi về việc đặt tên phương thức là vai trò của nó là loại bỏ bất kỳ sự mơ hồ nào và lý tưởng là cần tra cứu tài liệu. Tôi tin rằng điều này nên được thực hiện ngay cả khi các tên phương thức dài hơn. Theo các nghiên cứu, hầu hết các nhà phát triển trung cấp + có thể đọc nhiều từ trong trường hợp lạc đà. Với IDE và tự động hoàn thành, việc viết các tên phương thức dài cũng không phải là vấn đề.

Do đó, khi tôi nhìn thấy "fetchBooks", trừ khi ngữ cảnh rất rõ ràng (ví dụ: một lớp có tên BookFetcherFromDatabase), thì nó rất mơ hồ. Tìm nạp nó từ đâu? Sự khác biệt giữa tìm nạp và tìm kiếm là gì? Bạn cũng đang mạo hiểm với vấn đề rằng một số nhà phát triển sẽ liên kết ngữ nghĩa với các từ khóa nhất định. Ví dụ: tìm nạp cho cơ sở dữ liệu (hoặc bộ nhớ) so với tải (từ tệp) hoặc tải xuống (từ web).

Tôi muốn nhìn thấy một cái gì đó như "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection", v.v. Nó ít dễ nhìn hơn, nhưng một khi bạn vượt qua độ dài, nó sẽ rõ ràng. Mọi người đọc cái này sẽ hiểu ngay những gì bạn đang cố gắng làm.


4
Vấn đề với fetchBooksFromDatabase là khi bạn muốn tạo yếu tố / tổng quát hóa và tìm nạpBooks thì có thể là một số kéo dữ liệu từ XML nói trên. Tôi cũng thích các chi tiết cụ thể nhưng sau đó bạn thấy mình tách biệt chức năng giống nhau trên các tên chức năng khác nhau . Và đó không phải là mát mẻ!
JonH

Tôi nghĩ rằng sự khác biệt giữa Get và Find có xu hướng rõ ràng nhưng tôi băn khoăn về câu hỏi liên quan đến Get so với Fetch. Địa ngục..có sự khác biệt không?
Jason

@JonH: Tôi đồng ý với bạn về điều đó. Tuy nhiên, nếu bạn biết trước rằng bạn sẽ có các kiểu tìm nạp khác nhau, bạn sẽ mã hóa nó trong cách đặt tên lớp (vì vậy bạn có thể giải thích ý nghĩa từ ngữ cảnh, ví dụ: DatabaseConnector so với XmlConnector).
Uri

7
@Jason: Bởi vì "getters" rất phổ biến (và là một phần của các khuôn khổ như JavaBeans), nhiều lập trình viên có xu hướng coi chúng như một phương tiện gần như minh bạch để truy cập vào một trường dữ liệu. Mặt khác, "Fetch" chỉ ra cho một số lập trình viên một quyền truy cập dài hơn liên quan đến việc chuyển dữ liệu từ nơi này sang nơi khác (tìm nạp CPU) hoặc tìm nạp cơ sở dữ liệu. Ví dụ, ngôn ngữ truy vấn của Hibernate có cấu trúc Tìm nạp. Các nhà phát triển thường sử dụng các phương pháp dựa trên kỳ vọng của họ về tên hơn là bằng cách đọc tài liệu, vì vậy việc tránh gửi tín hiệu sai là rất quan trọng.
Uri
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.