Thiết kế tệp tiêu đề C ++: giống như xác định API?


8

Tôi là người mới phát triển phần mềm quy mô lớn trong C ++ và tôi đã tự hỏi về mặt thiết kế của mọi thứ.

Tôi đã đọc câu hỏi này và tôi nghĩ rằng, về tổng thể, một khi chúng ta vượt qua các định nghĩa không đổi và các vấn đề tầm thường khác, các tệp tiêu đề C ++ chỉ là các định nghĩa API :

Họ định nghĩa những gì các lập trình viên khác (hoặc chính bạn từ các mô-đun khác) sẽ có thể sử dụng (các lớp, hàm công khai), nhưng không có lớp hoặc hàm riêng nào được định nghĩa trong nó. Nó giống như tệp tiêu đề xác định các tóm tắt (giao diện ...) và tệp nguồn thực hiện nó. Khi tệp nguồn được biên dịch, các chi tiết triển khai sẽ bị ẩn đi và vẫn là các tiêu đề có sẵn công khai xác định những gì mô-đun có thể làm.

Tôi cảm thấy quan điểm phân tách tệp tiêu đề / nguồn này dễ hiểu và dễ hiểu hơn nhiều so với các giải thích thông thường, vì bạn chỉ có thể nghĩ rằng "sẽ XXXlà tài liệu API có sẵn công khai hoặc là một chi tiết làm xúc xích được ẩn đi trong một tập tin nguồn không được tiết lộ? "

Là mô hình tinh thần của tôi về các tập tin tiêu đề gần đúng? Tôi đã bỏ lở những gì ?


Đồng thời xem UML cho một hệ thống được tạo để giúp thiết kế phần mềm - các lớp của nó hiển thị các phương thức và dữ liệu API (thuộc tính) trong sơ đồ lớp
gbjbaanb

Hãy tin tôi, tôi biết về UML! = p Đó chỉ là cách suy nghĩ của C ++, tôi gặp khó khăn trong việc quấn đầu. Tôi "đến từ thế giới Python", với tất cả những thành kiến ​​về suy nghĩ "Tại sao một ngôn ngữ sẽ cần các tệp tiêu đề?" =)
Jiby

Câu trả lời:


10

Đây không phải là một mô hình tinh thần tồi để sử dụng như một hướng dẫn, nhưng thật không may vì lý do lịch sử / kỹ thuật mà các tiêu đề C ++ thể hiện giao diện và thực hiện theo cách mà mô hình tinh thần đơn giản này không nắm bắt được đầy đủ.

Để đưa ra quyết định thiết kế vật lý tốt khi mọi thứ trở nên phức tạp hơn một chút, thông thường cần phải hiểu cách các tiêu đề hoạt động trong C ++ ở mức chi tiết hơn.

Để đưa ra một ví dụ: từ chế độ xem API của bạn, tệp tiêu đề không được bao gồm định nghĩa của lớp triển khai riêng. Tuy nhiên, trong thực tế, các định nghĩa lớp như vậy sẽ thường xuất hiện trong một tệp tiêu đề vì trình biên dịch sẽ cần biết kích thước của chúng nếu chúng được chứa trong bất kỳ lớp công khai nào. Các kỹ thuật tồn tại để phá vỡ loại phụ thuộc này nhưng chúng thường áp đặt một chi phí về độ phức tạp của mã, hiệu suất hoặc cả hai. Hiểu khi nào thì phù hợp để sử dụng một trong những kỹ thuật này đòi hỏi sự hiểu biết sâu sắc hơn về cách các tiêu đề hoạt động trong C ++.


Tôi đã suy nghĩ về các định nghĩa chuyển tiếp của các lớp riêng: chúng ta có thể gian lận bằng cách đặt chúng vào một tệp tiêu đề "ẩn" riêng biệt và bao gồm chúng không? Bằng cách này, bạn sẽ giữ được "tiêu đề API đơn giản" và một "thủ thuật riêng tư bẩn". Không chắc chắn rằng nó sẽ làm nhiều tốt mặc dù.
Jiby

@Jiby Một tiêu đề "chi tiết" riêng biệt là một cách khá phổ biến để phân tách các chi tiết triển khai riêng tư vì vậy, đó có thể là một cách tiếp cận tốt. Việc đặt các chi tiết triển khai trong một detailkhông gian tên lồng nhau cũng khá phổ biến để chúng không gây ô nhiễm không gian tên thư viện chính và để làm rõ rằng chúng không được sử dụng trực tiếp.
mattnewport

3

Khá nhiều, có một chút khác biệt giữa tệp tiêu đề và giao diện được sử dụng bởi các ngôn ngữ khác cho phần chính. Rõ ràng mặc dù có sự khác biệt trong việc triển khai trong đó tiêu đề cũng sẽ chứa thông tin riêng tư, nhưng về cơ bản chúng được sử dụng để mô tả các tính năng mà lớp hoặc mô-đun sẽ cung cấp.

Theo một cách nào đó, nó cũng là một mô hình tinh thần của các cấu trúc dữ liệu kết hợp với API để nó có thể hữu ích hơn khi bạn thực hiện kiểu thiết kế ban đầu mà bạn mô tả.

Lý tưởng nhất là một tiêu đề xác định API sẽ chỉ chứa giao diện thuần túy nhưng vì C ++ không có ABI, nên điều này không thực sự quan trọng. Nếu bạn xây dựng một hệ thống cấp cao hơn cung cấp giao diện máy khách thuần túy, bạn sẽ sử dụng một cơ chế khác như IDL hoặc WSDL để xác định điều đó.



-1

Tệp tiêu đề như một giao diện thuần túy hoạt động tốt hơn hoặc ít hơn với các lớp. Ngay khi các mẫu xuất hiện, mô hình này sẽ ngừng hoạt động. Các mẫu không thể biên dịch được và toàn bộ triển khai mẫu phải xuất hiện trong tiêu đề.


Chúng ta có thể gian lận bằng cách viết mã liên quan đến mẫu trong một tiêu đề riêng và bao gồm nó không?
Jiby
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.