con trỏ không tùy chọn so với tham chiếu không const trong C ++


12

Trong các Tính năng C ++ khác, Đối số tham chiếu của Hướng dẫn kiểu Google C ++ , tôi đọc rằng các tham chiếu không phải là không được sử dụng.

Tất cả các tham số thông qua tham chiếu phải được dán nhãn const.

Rõ ràng là việc xem các lệnh gọi hàm sử dụng các tham chiếu làm đối số là hoàn toàn khó hiểu đối với các lập trình viên C, nhưng C và C ++ là các ngôn ngữ khác nhau. Nếu một tham số đầu ra là bắt buộc , sử dụng một con trỏ cho tham số đầu ra được yêu cầu, có thể khiến toàn bộ thân hàm bị bỏ qua, điều này làm cho việc thực hiện một hàm phức tạp hơn (chính thức làm tăng độ phức tạpđộ sâu của chu kỳ của hàm).

Tôi muốn làm cho mã C ++ dễ hiểu / duy trì nhất có thể, vì vậy tôi thường thích đọc hướng dẫn về phong cách mã hóa. Nhưng để thích nghi với các thực tiễn tốt nhất trong một nhóm, tôi nghĩ rằng việc hiểu được sự hợp lý đằng sau các yếu tố hướng dẫn phong cách là một yếu tố quan trọng.

Là tài liệu tham khảo không const thực sự xấu? Là cấm họ chỉ cụ thể Google hay đó là một quy tắc thường được chấp nhận? Điều gì biện minh cho nỗ lực bổ sung để thực hiện các tham số đầu ra như con trỏ?


1
"Sử dụng một con trỏ cho nó làm cho toàn bộ cơ thể chức năng bị bỏ qua" er, cái gì?
ratchet freak

@ratchetfreak Tôi đã cố gắng làm rõ điều này. Tôi thừa nhận rằng các chức năng như thế này có thể hiển thị một số lỗi thiết kế. Một con trỏ luôn luôn là tùy chọn chính thức vì vậy nó phải được kiểm tra trước khi hủy bỏ nó.
Sói

3
Hướng dẫn về phong cách C ++ của Google khá lạc hậu. Theo ý kiến ​​chủ quan của tôi, nó nên được đốt cháy.
Siyuan Ren

Đối với mục cụ thể này, tôi nghĩ lý do là việc buộc các lập trình viên phải viết một dấu và khi các đối số có thể bị thay đổi cho thấy mục đích rõ ràng hơn.
Siyuan Ren

3
Hướng dẫn về Phong cách của Google được viết như vậy, để hỗ trợ mã đồng nhất trong các dự án cũ của Google. Nếu bạn không làm việc với các dự án cũ (được viết bằng hướng dẫn kiểu này ngay từ đầu), có lẽ bạn không nên sử dụng nó (nó chỉ định rất nhiều quy tắc không tốt cho mã mới (c ++ 11, c ++ 14 , c ++ 17)).
utnapistim

Câu trả lời:


17

Lý do đằng sau hướng dẫn kiểu của Google chỉ đơn giản là làm cho nó rõ ràng khỏi trang gọi của hàm cho dù tham số là tham số đầu vào hay tham số đầu ra. (Xem ở đây để thảo luận thêm.) Các ngôn ngữ khác đưa ra các tham số rõ ràng theo thiết kế; C #, ví dụ, có một outtừ khóa phải được sử dụng tại trang web cuộc gọi . Vì C ++ không làm cho nó rõ ràng, Google đã chọn sử dụng const ref. so với con trỏ để làm cho nó rõ ràng.

Đây chỉ là một quy tắc của Google? Không, nhưng tôi nghi ngờ nó rất phổ biến. Tôi không nghĩ rằng tôi đã thấy nó bên ngoài hướng dẫn về phong cách của Google và các nhóm tuân thủ rõ ràng các phần của hướng dẫn về phong cách Google. (Ví dụ: tôi thích ý tưởng này khi lần đầu tiên đọc hướng dẫn về phong cách Google nhiều năm trước và đã sử dụng nó cho một số mã của riêng tôi.)

Cụ thể, Nguyên tắc cốt lõi C ++ mới được công bố thích các giá trị trả về cho các tham số đầu ra cho (hầu hết) mọi thứ và sử dụng các tham chiếu không phải là const cho phần còn lại. Việc sử dụng con trỏ của Google so với tham chiếu có thể làm cho các tham số đầu ra rõ ràng hơn, nhưng giá trị trả về vẫn rõ ràng hơn. Giờ đây, C ++ 11 đã có các bước di chuyển được tiêu chuẩn hóa (tham chiếu giá trị, &&để trả về nhiều loại giá rẻ) và bộ dữ liệu (cho phép một cách dễ dàng để trả về nhiều giá trị), nhiều trường hợp sử dụng cho các tham số ngoài không còn được áp dụng.

Nguyên tắc cốt lõi C ++ có một số tên tuổi lớn (Bjarne Stroustrup, Herb Sutter) đằng sau chúng, được Microsoft hỗ trợ và nắm lấy các tính năng C ++ mới nhất (không giống như hướng dẫn về phong cách của Google), vì vậy tôi hy vọng các đề xuất của nó sẽ phổ biến hơn so với Google.


Cảm ơn câu trả lời của bạn (cũng cho chuyến tham quan ngắn đến C #). Tất nhiên, dễ dàng xem xét là một điểm quan trọng, đặc biệt là trong các dự án Nguồn mở. Với lợi nhuận rẻ trong C ++ hiện đại, những cân nhắc này sẽ mất tầm quan trọng của chúng. Với phần mềm cũ hơn và trình biên dịch cũ, nó có thể vẫn hữu ích.
Sói

Tôi đã không quên điều đó, nhưng Nguyên tắc cốt lõi của C ++ không nhanh chóng có được. Thật thú vị khi Triết học cho thấy sự hợp lý đằng sau các quy tắc và cũng là một quan điểm hiện đại hóa về lập trình ("Thể hiện ý tưởng trực tiếp bằng mã" đọc một chút giống như Zen của trăn) như một cách để giao tiếp.
Sói

1

Có 2 tùy chọn để xử lý một con trỏ không hợp lệ được truyền vào, kiểm tra đầu tiên và trả về sớm hoặc để nó là hành vi không xác định (nếu bạn quan tâm nhiều hơn đến tốc độ hơn là sự mạnh mẽ).

Kiểm tra đơn giản như:

void foo(void* buffer){
    if(buffer == nullptr)
        return;

    //actually foo

    // note no increase in indentation required

}

Loại kiểm tra này thường được chấp nhận như một kiểm tra tham số. Nếu bạn thấy mã thì khá rõ ràng rằng bạn mong đợi một con trỏ không null được truyền vào và quay lại sớm nếu không. Điều này cho phép bạn không lo lắng quá nhiều về con trỏ không hợp lệ.


Vâng, tôi nghĩ về mô hình này và thấy nó hoàn toàn hợp lý. Đáng buồn thay, nó trông không rõ ràng như assert(buffer);Biết rằng khẳng định chỉ hoạt động cho phiên bản gỡ lỗi, đôi khi tôi muốn có một rt_assert(buffer);ngoại lệ ném ra một ngoại lệ. Việc thụt vào có returnvẻ hơi nguy hiểm ... BTW: đoạn mã của bạn là một minh họa tốt cho câu hỏi của tôi về con trỏ cho đầu ra.
Sói

1

Nó đi xuống để quan sát của bạn If an output parameter is required.

Nơi duy nhất mà chữ ký hàm được yêu cầu phải có tham số đầu ra là khi nó được chỉ định bởi API bên ngoài và trong trường hợp như vậy, bạn chỉ cần bọc API bên ngoài trong một cái gì đó đảm bảo luôn có một điểm chính xác.

Trong nội bộ, bạn tránh các tham số đầu ra bằng cách mở rộng loại trả về thành một tổng hợp của tất cả các "bên ngoài"


Ý bạn là, nơi duy nhất mà tôi không thể cung cấp một con trỏ không bắt buộc? Đúng, nhưng tôi không chắc liệu quy tắc của bạn The only place where...có thực sự phù hợp với mọi trường hợp hay không. Những gì bạn đề xuất trông giống như: tránh các tham số đầu ra trong các chức năng của các chương trình của riêng bạn. Đúng cho các chương trình mới.
Sói

Có, tránh các tham số đầu ra, thích các loại trả về tổng hợp, được chỉnh sửa để làm cho rõ ràng hơn
Caleth
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.