Tôi không nhớ bất kỳ sự can thiệp nào đối với điều này trong hướng dẫn kiểu cho mã hạt nhân. Tuy nhiên, nó nói rằng các chức năng nên càng nhỏ càng tốt, và chỉ làm một việc. Điều này sẽ giải thích tại sao một hỗn hợp của các tờ khai và mã là hiếm.
Trong một chức năng nhỏ, khai báo các biến ở đầu phạm vi hoạt động như một loại Introit, cho bạn biết điều gì đó sắp diễn ra sau đó. Trong trường hợp này, chuyển động của khai báo biến rất hạn chế đến mức nó có khả năng không có hiệu lực, hoặc phục vụ để che giấu một số thông tin về chức năng bằng cách đẩy barker vào đám đông, để nói. Có một lý do là sự xuất hiện của một vị vua được tuyên bố là trước khi ông vào một căn phòng.
OTOH, một hàm phải trộn các biến và mã có thể đọc được có thể quá lớn. Đây là một trong các dấu hiệu (cùng với các khối quá lồng nhau, các bình luận nội dòng và các thứ khác) rằng một số phần của hàm cần được tóm tắt thành các hàm riêng biệt (và được khai báo là static
, vì vậy trình tối ưu hóa có thể nội tuyến chúng).
Một lý do khác để giữ các khai báo ở đầu các hàm: nếu bạn cần sắp xếp lại việc thực hiện các câu lệnh trong mã, bạn có thể di chuyển một biến ra khỏi phạm vi của nó mà không nhận ra nó, vì phạm vi của một biến được khai báo trong giữa mã không phải là hiển nhiên trong thụt đầu dòng (trừ khi bạn sử dụng một khối để hiển thị phạm vi). Điều này là dễ dàng cố định, do đó, nó chỉ là một khó chịu, nhưng mã mới thường trải qua loại chuyển đổi, và khó chịu có thể được tích lũy.
Và một lý do khác: bạn có thể bị cám dỗ để khai báo một biến để lấy mã lỗi lại từ một chức năng, như vậy:
void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }
điều hoàn toàn hợp lý để làm. Nhưng:
void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }
....
int ret = another_func_may_fail();
if (ret) { handle_other_fail(ret); }
Rất tiếc! ret
được xác định hai lần. "Vậy, bỏ tờ khai thứ hai đi." bạn nói. Nhưng điều này làm cho mã không đối xứng, và bạn kết thúc với nhiều hạn chế tái cấu trúc hơn.
Tất nhiên, tôi kết hợp các khai báo và tự viết mã; không có lý do để giáo điều về nó (hoặc nghiệp lực của bạn có thể chạy trên giáo điều của bạn :-). Nhưng bạn nên biết những vấn đề đồng thời là gì.
Tôi thực sự * không thích * các khai báo hỗn hợp vì chúng làm cho mã ít đọc và gây khó khăn hơn để xem lỗi. –
Justin, tôi không thể không đồng ý nhiều hơn với chỉnh sửa của bạn. Tôi * ghét * nhìn thấy một tiêu đề (phông chữ lớn, đậm) có thể áp dụng cho nhiều ngôn ngữ và phải tìm một nơi khác trên màn hình cho các thẻ được viết bằng phông chữ nhỏ, tương phản để biết tôi có gì không để nói về câu hỏi. Tiêu đề mơ hồ được định hướng chỉ bởi các thẻ là một cơn ác mộng khả năng sử dụng. Và về chủ đề khả năng sử dụng, các thẻ thường thêm thông tin, thay vì di chuyển nó. –
@Carl, @Eduardo Tôi nghĩ rằng bạn vừa phóng đại những lỗi có thể gây ra bởi phong cách ưa thích của người khác. Các biến chức năng phạm vi dẫn đến sự thối mã khi mã được loại bỏ và các biến trở nên không được sử dụng, trong khi khối phạm vi có thể dẫn đến biến đổi bóng nếu không cẩn thận về cách đặt tên. Cả hai vấn đề đều bị bắt bởi một cảnh báo trình biên dịch tốt, nhưng phạm vi hẹp vẫn vượt trội vì nó giúp dễ dàng tìm ra các mẫu sử dụng dữ liệu daft ... do đó dẫn đến mã tốt hơn, dễ hiểu hơn. –