Lý do đặt loại hàm và tên phương thức trên các dòng khác nhau trong C


16

Tôi mới bắt đầu tại một công ty và một trong những nhận xét về phong cách trong bài đánh giá mã đầu tiên của tôi là loại trả về và tên phương thức phải nằm trên các dòng khác nhau. Ví dụ, cái này

void foo() {
}

nên là cái này

void
foo() {
}

Tôi đã luôn sử dụng phong cách đầu tiên, và tôi đã tự hỏi liệu có lý do nào khác ngoài sở thích cá nhân tại sao mọi người sử dụng phong cách thứ hai không? Tôi không nghĩ rằng cái đầu tiên làm tổn thương khả năng đọc. Là một phổ biến hơn so với cái khác với các lập trình viên C và các dự án nguồn mở lớn?


3
Đây là trong tiêu chuẩn GNU (không nhất thiết phải nói rằng đó là một điều tốt, kiểu giằng là lạ). gnu.org/prep/stiterias/stiterias.html#Formatted
Gauthier

Câu trả lời:


19

đã tự hỏi nếu có bất kỳ lý do khác ngoài sở thích cá nhân tại sao mọi người sử dụng phong cách thứ hai?

Đó là một phong cách đã trở lại phổ biến trong những ngày đầu của C, vì vậy lý do có thể là vì họ đã làm nó trong một thời gian rất dài, họ đã có rất nhiều mã giống như vậy, và đó là những gì mọi người đều quen Không có nhiều sở thích cá nhân như động lực của công ty.

Một lý do khác là tên hàm luôn bắt đầu trong cột đầu tiên. Các kiểu trả về có độ dài khác nhau và có thể hơi phức tạp - việc đặt loại trên dòng riêng của nó làm cho tên hàm dễ tìm hơn.

Nếu công ty có một phong cách thiết lập, họ cũng có thể có một tài liệu tiêu chuẩn mã hóa. Yêu cầu nó. Nó có thể giải thích (các) lý do cho lựa chọn này và việc có một bản sao sẽ giúp bạn tránh các vấn đề tương tự trong các đánh giá trong tương lai.


2
Tôi đoán nó cũng được kết nối với giới hạn dòng 80 ký tự vẫn được sử dụng và bảo vệ bởi nhiều lập trình viên. Nếu bạn muốn có giới hạn 80 ký tự và bạn muốn sử dụng tên phương thức / hàm mô tả, bạn phải thực hiện một số thỏa hiệp. Tách tiêu đề phương thức là một trong số đó.
Sulthan

Tuyên bố cũng có thể dài hơn - suy nghĩ về các công cụ sửa đổi (không chuẩn) khác nhau, như gọi định danh quy ước (stdcall, v.v.), thông tin về khả năng hiển thị biểu tượng (DLLEXPORT) hoặc __attributes. Và sau đó khi nhìn vào C ++, bạn có thể có các kiểu trả về tương đối phức tạp, do đó, ở đâu đó người ta có thể phải thêm ngắt dòng.
johannes

@Sulthan Không chỉ các lập trình viên (những người đã quen với các cửa sổ đầu cuối và sử dụng các trình soạn thảo đầu cuối), thật thú vị. Trong sắp chữ, 72-80 ký tự thường được coi là chiều rộng lý tưởng cho một cột văn bản về khả năng đọc. (Do đó, tại sao TeX và các dẫn xuất của nó mặc định với những gì một số người cho là các cột hẹp một cách kỳ lạ.)
JAB

1
@JAB Tôi thực sự bây giờ mà. Tôi cũng biết rằng đọc một văn bản hợp lý và đọc mã nguồn là hai điều rất khác nhau và hầu như không có gì chung do đó chiều rộng lý tưởng là không liên quan.
Sulthan

1
"Một lý do khác là tên hàm luôn bắt đầu trong cột đầu tiên [và vì vậy] dễ tìm hơn." Và điều này không chỉ đơn thuần là một lợi ích trực quan: Bây giờ chúng ta có thể tìm kiếm biểu thức chính quy ^start_of_a_long_funcvà được đưa ngay đến chức năng mà chúng ta đang tìm kiếm.
gạch dưới

7

Đây là khá nhiều quy tắc định dạng mã duy nhất mà tôi đã tìm thấy thực sự có tác động đáng chú ý đến khả năng đọc và hầu như không mất công sức (giả sử trình soạn thảo mã của bạn không bắt đầu cuộc chiến với bạn về nó).

Đó là thiết kế ngôn ngữ lập trình tốt để có tên xuất hiện ở vị trí nhất quán trong khai báo / định nghĩa. Cơ sở lý luận rất đơn giản: bạn có một mỏ neo trực quan đẹp (nẹp xoăn hoặc chỉ là một vết lõm treo) mà bạn có thể sử dụng để tìm ngay phần đầu của tên. Bạn không cần phải phân tích ngôn ngữ khi quét qua tệp tìm tên.

Nó giống như khi bạn định dạng một tài liệu: khi bạn bắt đầu một phần mới, bạn đặt tên lên phía trước in đậm - thường trên dòng riêng của nó - không bị chôn vùi ở đâu đó, không phân biệt, trong một câu dài.

Đầu C có chữ ký rất ngắn gọn: kiểu trả về là tùy chọn và kiểu đối số được khai báo sau chữ ký. Tên cũng có xu hướng rất ngắn. Điều này giảm nhẹ tác động của việc có một loại trả lại thỉnh thoảng bù đắp tên.

double dot(x, y);

Vẫn còn tiêu hóa.

C ++ làm cho điều này tồi tệ hơn một chút. Nó chuyển các đặc tả loại đối số thành chữ ký làm cho chữ ký dài hơn. Cú pháp này sau đó đã được thông qua trong quá trình tiêu chuẩn hóa C.

static struct origin *find_origin(struct scoreboard *sb,
                  struct commit *parent,
                  struct origin *origin)

ít tiêu hóa, nhưng không quá tệ. (Trích từ Git)

Bây giờ hãy xem xét các thực tiễn lập trình hiện đại với các tên dài, mô tả và các loại tham số và xem lựa chọn này đã trở thành thảm họa như thế nào. Một ví dụ từ tiêu đề Boost:

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}

Nếu bạn đang viết mã chung, chữ ký như thế thậm chí không bình thường. Bạn có thể tìm thấy các ví dụ về các trường hợp tồi tệ hơn nhiều so với điều này mà không cần cố gắng quá nhiều.

C, C ++ và các dẫn xuất của chúng, Java và C #, dường như là ngoại lệ để có các khai báo / định nghĩa có thể đọc được. Người tiền nhiệm và đồng nghiệp nổi tiếng của họ (Fortran, ALGOL, Pascal) đã đặt tên trước các loại kết quả và, may mắn thay, nhiều người kế nhiệm của họ (Go, Scala, TypeScript và Swift để đặt tên cho một số) cũng đã chọn các cú pháp dễ đọc hơn.


1
Hãy biết ơn vì bạn không phải viết các chương trình Fortran. Tôi nói với bạn, việc khai báo riêng các đối số chức năng của bạn sẽ khiến bạn lo lắng khá nhanh sau khi bạn buộc phải làm điều đó. Đặc biệt là khi cố gắng đọc chữ ký hàm để hiểu các đối số mà nó mong đợi: C ++ đặt các loại đúng nơi chúng thuộc về, Fortran buộc bạn phải bắt đầu tìm kiếm từ khóa trực quan cho tên biến để xác định loại của nó.
cmaster - phục hồi monica

2
Việc đặt các kiểu trong khai báo hàm có thực sự được phát minh bởi C ++ không? Tôi chưa bao giờ nghe về trường hợp đó và đang vật lộn để tìm trích dẫn.
gạch dưới

1
Xem Sự phát triển của ngôn ngữ C . Trong phần Tiêu chuẩn hóa, Ritchie đề cập cú pháp được mượn từ C ++.
user2313838

5

Lần đầu tiên tôi gặp phong cách này vào năm thứ 19 làm việc với C & C ++. Đã có khá nhiều trở ngại về việc ai đó có thể phát minh ra điều xấu xa này.

Điểm tích cực duy nhất (có khả năng) tôi có thể tìm thấy là bạn có thể tìm thấy định nghĩa funciton bằng grep ^ FuncName. Có thể là yếu tố có liên quan thập kỷ + trước đây trong một số cộng đồng ghét công cụ thực sự ... Tại nơi tôi thấy nó được áp dụng cho C ++ và các funcitons thành viên lớp, điều đó giết chết ngay cả thuộc tính này.

Đoán ý kiến ​​của tôi. :)


1
grep -P '^(\w+::)?FuncName'
Kyle Strand

Vâng, các loại lớp trong tên hàm không cản trở việc sử dụng này. Vì vậy, nó vẫn là một điều hữu ích để điều hướng nhanh chóng các tệp nguồn. Đối với nó trông xấu xa hoặc bất cứ điều gì, ý kiến ​​là ý kiến: Tôi đã nghĩ rằng nó trông tốt hơn.
gạch dưới
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.