Câu hỏi này được xây dựng trên this one asked earlier và cũng this one, nhưng đề cập đến một điểm tinh tế hơn, cụ thể, những gì được tính là "lớp nội bộ"?dấu gạch dưới dẫn đầu trong tên lớp Python
Đây là tình huống của tôi. Tôi đang xây dựng một thư viện Python để thao tác các tệp MS Office, trong đó nhiều lớp không được xây dựng bên ngoài, nhưng nhiều phương thức của chúng là các phần quan trọng của API. Ví dụ:
class _Slide(object):
def add_shape(self):
...
_Slide
không phải là để được xây dựng bên ngoài, như một người dùng cuối của thư viện bạn sẽ có được một slide mới bằng cách gọi Presentation.add_slide()
. Tuy nhiên, một khi bạn có một slide bạn chắc chắn muốn có thể gọi add_shape()
. Vì vậy, phương thức này là một phần của API nhưng hàm tạo không phải là. Tình huống này phát sinh hàng chục lần trong thư viện bởi vì chỉ có lớp Presentation có một hàm tạo bên ngoài/API.
PEP8 không rõ ràng về điểm này, tham chiếu đến "các lớp nội bộ" mà không cần tính toán những gì được tính là lớp nội bộ. Trong trường hợp này tôi giả sử người ta có thể nói rằng lớp học là "một phần nội bộ".
Vấn đề là tôi chỉ có hai ký hiệu để phân biệt ít nhất ba tình huống khác nhau:
- Các nhà xây dựng và "công cộng/API" phương thức của lớp đều có sẵn để sử dụng.
- Hàm tạo không được sử dụng, nhưng phương thức "công khai/API" của lớp là.
- Lớp học thực sự là nội bộ, không có API công khai và tôi có quyền thay đổi hoặc xóa lớp đó trong bản phát hành trong tương lai.
Tôi lưu ý rằng từ góc độ giao tiếp, có xung đột giữa biểu hiện rõ ràng của API bên ngoài (đối tượng người dùng cuối thư viện) và API nội bộ (đối tượng nhà phát triển). Đối với người dùng cuối, gọi số _Slide()
là rủi ro do chính mình gây ra. Tuy nhiên, đây là thành viên hài lòng của API nội bộ và khác với _random_helper_method()
chỉ nên được gọi từ trong số _Slide()
.
Bạn có quan điểm về câu hỏi này có thể giúp tôi không? Quy ước có chỉ ra rằng tôi sử dụng đạn "đơn hàng đầu" dưới tên lớp để đấu tranh cho sự rõ ràng trong API người dùng cuối hay tôi có thể cảm thấy tốt khi đặt nó để giao tiếp với bản thân và các nhà phát triển khác. riêng tư và không được sử dụng, ví dụ, bởi các đối tượng bên ngoài mô-đun mà nó tồn tại bởi vì nó là chi tiết triển khai có thể thay đổi?
UPDATE: Sau một vài năm phản ánh thêm, tôi đã giải quyết thành công ước của việc sử dụng một dấu gạch dưới hàng đầu khi đặt tên lớp mà không được dự định để được truy cập như là một lớp bên ngoài mô-đun của họ (tập tin). Truy cập như vậy thường để khởi tạo một đối tượng của lớp đó hoặc để truy cập một phương thức lớp học, v.v.
Điều này cung cấp cho người dùng mô-đun (thường là bản thân bạn :) chỉ báo cơ bản: "Nếu tên lớp có dấu gạch dưới hàng đầu xuất hiện trong câu lệnh nhập, bạn đang làm gì đó sai. " (Các mô-đun thử nghiệm đơn vị là ngoại lệ đối với quy tắc này, các lần nhập như vậy thường có thể xuất hiện trong các bài kiểm tra đơn vị cho lớp "nội bộ").
Lưu ý rằng đây là quyền truy cập vào lớp.Truy cập vào một đối tượng của loại đó (loại) bên ngoài mô-đun, có thể được cung cấp bởi một nhà máy hoặc bất cứ điều gì, là hoàn toàn tốt và có thể mong đợi. Tôi nghĩ rằng sự thất bại này để phân biệt các lớp từ các đối tượng được tạo ra từ chúng là những gì đã dẫn đến sự nhầm lẫn ban đầu của tôi.
Quy ước này cũng có lợi ích phụ không bao gồm các lớp này khi đưa ra tuyên bố from module import *
. Mặc dù tôi không bao giờ sử dụng chúng trong mã của riêng tôi và khuyên bạn nên tránh chúng, nó là một hành vi thích hợp bởi vì những định danh lớp không có ý định là một phần của giao diện mô-đun.
Đây là "thực hành tốt nhất" cá nhân của tôi sau nhiều năm dùng thử và dĩ nhiên không phải là cách "đúng". Số dặm của bạn có thể thay đổi.
Tôi mất một chút để quyết định rằng điều này không được tính là chủ yếu dựa trên ý kiến. Các từ ngữ có thể được cải thiện, mặc dù. – user2357112
Sau khi gọi 'Presentation.add_slide()', trang trình bày được tạo ra như thế nào? Nếu nó thông qua một cá thể '_Slide()' mà người dùng có, '_Slide' là một lớp công khai hiệu quả. – martineau
@martineau: Tôi nghĩ rằng đây là câu trả lời khá nhiều. Kết luận tôi đã đưa ra sau khi bạn đề cập đến điều này là một lớp là nội bộ nếu không có phần nào của nó (hàm tạo, phương thức) được sử dụng * bên ngoài mô đun của nó *. Và đó là dấu gạch dưới hàng đầu trong tên lớp sẽ được sử dụng cho các lớp học đáp ứng mô tả này. Nếu bạn sẽ đưa vào một câu trả lời tôi sẽ chấp nhận nó. – scanny