Theo ý kiến khiêm tốn của tôi, nói chung, đó là điều cần tránh phần lớn cho mã sản xuất bởi vì bạn thường không muốn làm điều đó ngoại trừ trong các chức năng lẻ tẻ thực hiện các nhiệm vụ khác nhau. Tôi có xu hướng làm điều đó trong một số mã phế liệu được sử dụng để kiểm tra mọi thứ, nhưng không tìm thấy sự cám dỗ nào để làm điều đó trong mã sản xuất, nơi tôi đã suy nghĩ trước về việc mỗi chức năng nên làm gì, từ đó chức năng sẽ tự nhiên có phạm vi hạn chế đối với nhà nước địa phương của nó.
Tôi chưa bao giờ thực sự thấy các ví dụ về các khối ẩn danh được sử dụng như thế này (không liên quan đến các điều kiện, một try
khối cho giao dịch, v.v.) để giảm phạm vi theo cách có ý nghĩa trong một chức năng không đặt ra câu hỏi tại sao nó không thể được chia thành các chức năng đơn giản hơn với phạm vi giảm nếu nó thực sự được hưởng lợi thực tế từ quan điểm SE chính hãng từ các khối ẩn danh. Đó thường là mã chiết trung đang thực hiện một loạt những điều liên quan lỏng lẻo hoặc rất không liên quan, nơi chúng ta mong muốn nhất để đạt được điều này.
Ví dụ, nếu bạn đang cố gắng làm điều này để sử dụng lại một biến có tên count
, thì nó gợi ý bạn đang đếm hai thứ khác nhau. Nếu tên biến sẽ ngắn như vậy count
, thì nó có ý nghĩa với tôi để buộc nó vào ngữ cảnh của hàm, có khả năng chỉ là đếm một loại điều. Sau đó, bạn có thể ngay lập tức nhìn vào tên và / hoặc tài liệu của hàm, xem count
và biết ngay ý nghĩa của nó trong ngữ cảnh của hàm đang làm mà không cần phân tích tất cả mã. Tôi thường không tìm thấy một đối số tốt cho một hàm để đếm hai thứ khác nhau sử dụng cùng một tên biến theo cách làm cho phạm vi / khối ẩn danh trở nên hấp dẫn so với các lựa chọn thay thế. Điều đó không có nghĩa là tất cả các chức năng chỉ phải tính một điều. TÔI'kỹ thuật có lợi cho một hàm sử dụng lại cùng một tên biến để đếm hai hoặc nhiều thứ và sử dụng các khối ẩn danh để giới hạn phạm vi của từng số riêng lẻ. Nếu hàm này đơn giản và rõ ràng, thì đó không phải là ngày tận thế có hai biến đếm được đặt tên khác nhau với biến đầu tiên có thể có một vài dòng khả năng hiển thị phạm vi hơn mức yêu cầu lý tưởng. Các hàm như vậy thường không phải là nguồn gốc của các lỗi thiếu các khối ẩn danh như vậy để giảm phạm vi tối thiểu của các biến cục bộ của nó hơn nữa.
Không phải là một gợi ý cho các phương pháp không cần thiết
Điều này không có nghĩa là bạn mạnh mẽ tạo ra các phương thức hoặc chỉ để giảm phạm vi. Điều đó được cho là xấu hoặc tệ hơn, và những gì tôi đề nghị không nên kêu gọi cần một phương pháp "người trợ giúp" riêng tư vụng về hơn bất kỳ nhu cầu nào về phạm vi ẩn danh. Đó là suy nghĩ quá nhiều về mã như hiện tại và làm thế nào để giảm phạm vi của các biến hơn là suy nghĩ về cách giải quyết khái niệm vấn đề ở cấp độ giao diện theo cách mang lại khả năng hiển thị ngắn, rõ ràng của các trạng thái chức năng cục bộ mà không cần lồng sâu vào các khối và hơn 6 cấp độ thụt. Tôi đồng ý với Bruno rằng bạn có thể cản trở khả năng đọc mã bằng cách đẩy mạnh 3 dòng mã vào một chức năng, nhưng điều đó bắt đầu với giả định rằng bạn đang phát triển các chức năng bạn tạo dựa trên triển khai hiện có của bạn, thay vì thiết kế các chức năng mà không bị rối trong việc triển khai. Nếu bạn làm theo cách thứ hai, tôi đã tìm thấy rất ít nhu cầu đối với các khối ẩn danh không phục vụ mục đích nào ngoài việc giảm phạm vi biến trong một phương thức nhất định trừ khi bạn cố gắng hết sức để giảm phạm vi của biến chỉ bằng một vài dòng mã vô hại nơi mà sự giới thiệu kỳ lạ của các khối ẩn danh này được cho là đóng góp nhiều chi phí trí tuệ khi chúng loại bỏ.
Cố gắng giảm phạm vi tối thiểu hơn nữa
Nếu việc giảm phạm vi biến cục bộ xuống mức tối thiểu tuyệt đối là đáng giá, thì cần phải có sự chấp nhận rộng rãi mã như thế này:
ImageIO.write(new Robot("borg").createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())), "png", new File(Db.getUserId(User.handle()).toString()));
... vì điều đó gây ra khả năng hiển thị tối thiểu của trạng thái bằng cách thậm chí không tạo các biến để tham chiếu đến chúng ở vị trí đầu tiên. Tôi không muốn trở thành giáo điều nhưng tôi thực sự nghĩ rằng giải pháp thực dụng là tránh các khối ẩn danh khi có thể giống như để tránh dòng mã khủng khiếp ở trên, và nếu chúng có vẻ rất cần thiết trong bối cảnh sản xuất từ quan điểm về tính đúng đắn và duy trì các bất biến trong một hàm, sau đó tôi chắc chắn nghĩ rằng cách bạn tổ chức mã của mình thành các hàm và thiết kế giao diện của bạn đáng để kiểm tra lại. Đương nhiên, nếu phương thức của bạn dài 400 dòng và phạm vi của biến có thể nhìn thấy hơn 300 dòng mã, đó có thể là một vấn đề kỹ thuật chính hãng, nhưng đó không nhất thiết là vấn đề cần giải quyết với các khối ẩn danh.
Nếu không có gì khác, sử dụng các khối ẩn danh ở khắp mọi nơi là kỳ lạ, không phải là thành ngữ và mã kỳ lạ có nguy cơ bị người khác ghét, nếu không phải là chính bạn, nhiều năm sau đó.
Sự hữu ích thiết thực của việc giảm phạm vi
Tính hữu dụng cuối cùng của việc giảm phạm vi của các biến là cho phép bạn quản lý trạng thái chính xác và giữ đúng và cho phép bạn dễ dàng suy luận về bất kỳ phần nào của một cơ sở mã hóa - để có thể duy trì các bất biến khái niệm. Nếu quản lý trạng thái cục bộ của một hàm phức tạp đến mức bạn phải giảm mạnh phạm vi với một khối ẩn danh trong mã không có nghĩa là hoàn thành và tốt, thì một lần nữa, đó là một dấu hiệu cho tôi rằng chính hàm đó cần phải được kiểm tra lại . Nếu bạn gặp khó khăn trong việc suy luận về việc quản lý trạng thái của các biến trong phạm vi hàm cục bộ, hãy tưởng tượng khó khăn về lý luận về các biến riêng có thể truy cập được đối với mọi phương thức của toàn bộ một lớp. Chúng tôi không thể sử dụng các khối ẩn danh để giảm khả năng hiển thị của chúng. Đối với tôi, điều đó giúp bắt đầu với việc chấp nhận rằng các biến sẽ có xu hướng có phạm vi rộng hơn một chút so với lý tưởng mà chúng cần có trong nhiều ngôn ngữ, miễn là nó không vượt quá tầm với khi bạn gặp khó khăn trong việc duy trì bất biến. Đó không phải là một cái gì đó để giải quyết rất nhiều với các khối ẩn danh như tôi thấy nó là chấp nhận từ quan điểm thực dụng.