2010-03-15 44 views
12

Tôi đang học c++0x, ít nhất là các phần được hỗ trợ bởi Visual C++ Express 2010 Beta. Đây là câu hỏi về phong cách thay vì cách hoạt động. Có lẽ còn quá sớm để phong cách và thực hành tốt vẫn chưa phát triển được cho một tiêu chuẩn chưa được phát hành ...Kiểu trả về kiểu hàm

Trong c++0x bạn có thể xác định kiểu trả về của một phương thức bằng cách sử dụng -> loại ở cuối của thay vì đặt loại ở đầu. Tôi tin rằng cú pháp thay đổi này là bắt buộc do lambdas và một số trường hợp sử dụng của từ khóa decltype mới, nhưng bạn có thể sử dụng nó ở bất cứ đâu theo như tôi biết.

// Old style 
int add1(int a, int b) 
{ 
return a + b; 
} 

// New style return type 
auto add2(int a, int b) -> int 
{ 
return a + b; 
} 

Câu hỏi của tôi thực sự được cho là một số chức năng cần được xác định theo cách mới nhất quán? Hay tôi chỉ nên sử dụng nó khi cần thiết?

+5

Dao cạo của Occam: Cho hai cấu trúc mã tương đương, cách đơn giản nhất là tốt nhất. –

+0

Btw, Visual Studio 2010 RC1 đã được phát hành – abatishchev

+0

Có RC1 (express) mà tôi đang sử dụng. Tôi đã nhận được phiên bản sai trong bài viết của tôi – jcoder

Trả lời

18

Không phù hợp với phong cách chỉ để nhất quán. Mã phải có thể đọc được, tức là dễ hiểu, đó là thước đo thực sự duy nhất. Việc thêm lộn xộn vào 95% các phương thức để phù hợp với 5% khác, tốt, điều đó không đúng với tôi.

+0

Chấp nhận câu trả lời này vì nó tổng kết cuộc thảo luận và có nhiều phiếu bầu cao nhất. Các câu trả lời khác là tất cả tốt mặc dù, cảm ơn – jcoder

2

Dường như với tôi như nó sẽ thay đổi thói quen của một đời cho rất nhiều lập trình viên C++ (và những người thích C khác).

Nếu bạn sử dụng phong cách cho mỗi chức năng duy nhất sau đó bạn có thể là người duy nhất làm việc đó :-)

5

Có một codebase lớn mà sử dụng/quy định hiện hành 'già'. Tôi cá là sẽ lâu như vậy. Vấn đề nhất quán là hai lần: bạn sẽ nhất quán với ai, một vài mã sẽ yêu cầu cú pháp mới hoặc tất cả mã hiện có?

Tôi sẽ giữ nguyên cú pháp cũ khi cú pháp mới không được yêu cầu cho một chút, nhưng sau đó một lần nữa, chỉ có thời gian mới cho biết điều gì sẽ trở thành cách sử dụng phổ biến. Cũng lưu ý rằng cú pháp mới vẫn còn hơi lạ: bạn khai báo kiểu trả về là auto và sau đó xác định những gì auto có nghĩa là ở cuối khai báo chữ ký ... Nó không cảm thấy tự nhiên (ngay cả khi bạn không so sánh nó với kinh nghiệm của riêng bạn)

2

Tôi sẽ đoán rằng tiêu chuẩn hiện tại sẽ thắng, vì nó đã cho đến nay với mọi thay đổi được đề xuất khác cho định nghĩa. Nó đã được mở rộng, chắc chắn, nhưng ngữ nghĩa thiết yếu của C++ là quá chi tiết đến nỗi tôi không nghĩ rằng chúng đáng thay đổi. Họ đã ảnh hưởng rất nhiều ngôn ngữ và phong cách hướng dẫn của nó vô lý.

Đối với câu hỏi của bạn, tôi sẽ thử và tách mã thành các mô-đun để làm rõ nơi bạn đang sử dụng kiểu cũ so với kiểu mới. Trường hợp hai hỗn hợp tôi sẽ đảm bảo và phân định nó càng nhiều càng tốt. Nhóm chúng lại với nhau, v.v.

[ý kiến ​​cá nhân] Tôi thấy nó thực sự khó khăn khi lướt qua các tệp và xem phong cách chuyển đổi qua lại hoặc thay đổi hoàn toàn. Nó chỉ làm cho tôi tự hỏi những gì khác là ẩn giấu trong đó [/ cá nhân ý kiến]

5

Cá nhân, tôi sẽ sử dụng nó khi nó là cần thiết. Cũng giống như this-> chỉ cần thiết khi truy cập các thành viên của một mẫu lớp cơ sở (hoặc khi chúng được ẩn khác), do đó, auto fn() -> type chỉ cần thiết khi không thể xác định loại trả về trước khi phần còn lại của chữ ký chức năng hiển thị.

Sử dụng quy tắc này có thể sẽ giúp phần lớn người đọc mã, những người có thể nghĩ "tại sao tác giả nghĩ rằng chúng tôi cần viết tuyên bố theo cách này?" nếu không thì.

1

Thay đổi phong cách tốt - nếu bạn không tin tôi, hãy xem phong cách tốt trong 98 là gì và bây giờ - và rất khó để biết điều gì sẽ được coi là phong cách tốt và tại sao. IMHO, hiện tại tất cả mọi thứ liên quan đến C++ 0X là thử nghiệm và phong cách tốt hay xấu chỉ chưa áp dụng.

5

Tôi không nghĩ cần sử dụng nó cho các chức năng thông thường. Nó có các ứng dụng đặc biệt, cho phép bạn làm một cách dễ dàng những gì có thể đã khá khó xử trước đây. Ví dụ:

template <class Container, class T> 
auto find(Container& c, const T& t) -> decltype(c.begin()); 

Ở đây chúng ta không biết nếu container là const hay không, do đó cho dù các kiểu trả về sẽ là Container::iterator hoặc Container::const_iterator (có thể được xác định từ những gì begin() sẽ quay trở lại).

Các vấn đề liên quan