Nhược điểm có thể có của việc đưa các khai báo vào các khối bên trong, thay vì ở đầu chức năng là gì?


9

Tại nơi tôi làm việc, có các hướng dẫn rõ ràng để đặt khai báo các biến. Theo đó, cần phải đặt chúng ở cấp độ toàn cầu và / hoặc ở đầu các chức năng, chứ không phải trong các khối bên trong (chẳng hạn như vòng lặp for). Vì họ đã được chỉ định bởi những người có kinh nghiệm hơn tôi, tôi chắc chắn rằng phải có lý do chính đáng cho điều đó, nhưng tôi không thể tìm ra điều đó có thể là gì. Sẽ thật tuyệt nếu biết có bất kỳ lợi thế thời gian biên dịch / thời gian chạy nào khi chúng được khai báo ở phạm vi lớn hơn.

Câu trả lời:


8

Tôi thấy hai ưu điểm chính:

  • Việc sử dụng lại tên biến với một loại khác nhau được ngăn chặn.
  • Nó trở nên rõ ràng vào thời điểm sớm hơn rằng một thói quen cần phải được tái cấu trúc. Các biến ở đầu trở thành một mớ hỗn độn khá nhanh và mớ hỗn độn này rất dễ nhận ra.

Bất kỳ trình biên dịch nào có giá trị muối của nó sẽ tối ưu hóa phạm vi của các biến, vì vậy đây hoàn toàn là một vấn đề định dạng.

Đối với hai xu của tôi, tôi vẫn thích khai báo biến trong cùng của biến để chuyển ý định phạm vi sang trình biên dịch. Nếu bạn dự định chỉ có một biến chỉ được truy cập trong một vòng lặp, bạn có thể bắt bất kỳ tham chiếu nào sau này tại thời điểm biên dịch khi bạn khai báo biến trong vòng lặp.


3

Ưu điểm duy nhất tôi tìm thấy cho đến nay là mã đơn giản. Youalways biết nơi để tìm các khai báo biến và mọi người trong nhóm đều áp dụng cùng một kiểu mã hóa. Những điều này làm cho việc bảo trì mã dễ dàng hơn nhưng tôi không chắc rằng chúng giúp việc viết mã tốt hơn dễ dàng hơn. Tôi không có nghĩa là bạn chỉ viết mã tệ hơn mà đôi khi viết mã càng khó. Tuy nhiên, nếu nhóm phát triển lớn hoặc các thành viên của nó thay đổi thường xuyên bằng cách sử dụng các tiêu chuẩn mã là hữu ích.


3

Điều này nghe có vẻ như một quyết định để bảo tồn tính nhất quán. Nó cũng ngăn chặn việc sử dụng cùng tên cho các biến khác nhau trong phạm vi lân cận và tăng khả năng đọc. Như Gus chỉ ra, bạn cũng sẽ biết nơi để tìm kiếm các biến. Tôi nghĩ rằng nguyên tắc phạm vi hẹp nhất là tốt hơn bởi vì nó ngăn chặn sự lộn xộn biến ở đầu. Khai báo ngoài cùng giống như tuyên bố các thành viên tư nhân của một IMO lớp đầu tiên.


3

Mỗi ngôn ngữ có thể khác nhau về sở thích của phong cách và thực hành. Tiếp theo là từ các quy tắc JSF-AV , mà Stroustrup chỉ ra là các tiêu chuẩn mã hóa mà anh ta thích.

Quy tắc AV 136
Declarations should be at the smallest feasible scope

Lý do cho việc này được mô tả là

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Nếu bạn đang ở trong C ++, khai báo biến khi bạn cần chúng được ưu tiên.


3

Không chắc chắn nếu bạn có thể gọi đây là một thực hành tốt nhất. Khi tôi thiết lập các hướng dẫn cho một dự án C mới, tôi luôn tuyên bố rằng tốt hơn là khai báo các biến gần với nơi chúng được sử dụng. Vì hai lý do, việc tái cấu trúc mã sau này dễ dàng hơn (nghĩa là khi trích xuất một phương thức). Nó cũng giúp trình biên dịch thực hiện tối ưu hóa tốt hơn.

Tôi không đơn độc với ý kiến ​​này. Đây là một câu hỏi giải quyết vấn đề tương tự: /software/56585/where-do-you-declare-variabled-the-top-of-a-method-or-when-you-need -them Câu trả lời ở đây là khai báo chúng ở nơi bạn sử dụng chúng. Cách làm tương tự được mô tả trong cuốn sách 'Clean Code' của Robert C. Martin.

Tuy nhiên, nếu bạn sử dụng tiêu chuẩn C cũ hơn (C-89), bạn phải xác định các biến cục bộ ở đầu hàm. Vậy có lẽ hướng dẫn là tàn dư từ thời điểm C-89 được sử dụng? Có lẽ tốt hơn để hỏi người đã viết các hướng dẫn tại sao quy tắc vẫn còn trong đó.


2

Nếu khai báo nằm trong mệnh đề if hiếm khi (nếu có) được thực thi, nhưng cần nhiều bộ nhớ, dấu chân bộ nhớ của bạn nhỏ hơn (hầu hết thời gian) so với khi bạn phân bổ mọi thứ khi bắt đầu hàm.

Nếu nó nằm trong một vòng lặp thì bạn phải phân bổ lại bộ nhớ nhiều lần, điều này có thể tốn kém về mặt hiệu suất.

Có nhiều lý do để làm mọi thứ cả hai cách.


1

Tiêu chuẩn C cũ năm 1989 chỉ cho phép khai báo biến khi bắt đầu một khối.

Chỉ kể từ khi khai báo C99 được cho phép bất cứ nơi nào. Có thể địa điểm của bạn chưa thực hiện chuyển đổi sang C99.


Chúng tôi sử dụng C99 - nhưng quan trọng hơn, tôi đang tìm kiếm ý nghĩa của việc khai báo nó trong khối trong cùng, thay vì ở đầu chức năng. Có lẽ, tôi đã không đủ rõ ràng ...
TCSGrad

1

Có vẻ như những người đưa ra quyết định này được sử dụng đến một thời điểm khi đặt các tuyên bố lên hàng đầu là tiêu chuẩn và đã chọn không chuyển sang một ưu tiên để tuyên bố gần hơn với nơi nó đang được sử dụng.

Tôi không chắc mức độ nhất quán này là hữu ích như thế nào. Một số IDE có thể làm cho việc tìm kiếm mọi thứ dễ dàng hơn những cái khác. Đối với các biến toàn cục, điều này có ý nghĩa, nhưng nếu hàm của bạn quá dài, điều đó làm cho việc tìm khai báo biến trở nên khó khăn, bạn có vấn đề lớn hơn.

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.