Tôi có nên lồng các hàm trong các ngôn ngữ cho phép tôi làm điều đó hay tôi nên tránh nó?


12

Trong JavaScript, PL / SQL và một số ngôn ngữ khác, các hàm có thể được lồng nhau, tức là được khai báo trong một hàm khác. Điều này có thể được sử dụng để phá vỡ một chức năng lớn thành các phần nhỏ hơn, nhưng giữ các phần đó trong bối cảnh của chức năng lớn hơn.

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Trong một số trường hợp, khi các hàm nhỏ hơn đó không sử dụng các biến cục bộ của hàm lớn hơn, điều này có thể dễ dàng thay đổi thành phiên bản mà tất cả các hàm không được kiểm tra.

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Giả sử rằng các hàm lồng nhau này sẽ không được sử dụng ở bất kỳ nơi nào khác, tốt hơn là giữ chúng trong bối cảnh của hàm lớn hay nó xấu bởi vì đây chính xác là điều làm cho hàm lớn, tốt, lớn?

Câu trả lời:


8

Đó là một vấn đề về quan điểm, nhưng tôi sẽ tránh các chức năng lồng nhau trừ khi nó thực sự là một phần cần thiết và có chủ ý trong thiết kế của bạn.

Khi bạn lồng các hàm, trong hầu hết các ngôn ngữ, bạn sẽ có một số hiệu ứng cơ học. Phổ biến nhất và thú vị nhất là đóng trên phạm vi từ vựng của một biến có thể được sử dụng bên trong cơ thể, nhưng các yếu tố khác (ví dụ: khả năng hiển thị của chức năng) cũng xuất hiện đôi khi.

Đó là những công cụ tuyệt vời, khi được sử dụng đúng - nhưng chúng là những công cụ phức tạp, bởi vì chúng có thể dẫn đến các hiệu ứng không cục bộ hoặc không rõ ràng khi bạn lần đầu tiên nhìn vào mã.

Nếu bạn không sử dụng chúng, nhiều người sẽ đọc mã và không thấy bất cứ điều gì làm điều đó - vì vậy sẽ cho rằng họ đã bỏ lỡ nó, và nhìn lại, cố gắng tìm ra lý do tại sao bạn làm như vậy, và không ở một phạm vi riêng biệt.

Bạn cũng có nguy cơ rằng các lập trình viên trong tương lai sẽ cố tình hoặc thậm chí vô tình đóng lại một cái gì đó họ không có ý định, bằng cách không nhận thấy rủi ro ngay tại đó.

Cuối cùng, nếu khai báo hàm của bạn khai báo một hàm được đặt tên ngoài phạm vi của hàm kèm theo, chỉ cần tránh nó. Đó là siêu khó hiểu với tất cả mọi người.

Lưu ý cuối cùng: bởi vì các hàm riêng lẻ giúp phân định mã, các hàm lồng nhau ít rắc rối hơn một hàm khổng lồ, nhưng cuối cùng, điều đó có nghĩa là đọc nhiều mã hơn để hiểu doTooMuch()- đặc biệt là nếu bạn có thể ẩn mã giữa các khai báo hàm lồng nhau, hoặc cần kiểm tra mà không ai làm


-1: Javascript không phải là "hầu hết các ngôn ngữ". Các hàm lồng nhau trong Javascript là thực tế bình thường.
kevin cline

2
Các hàm lồng nhau @kevincline trong JavaScript là một thực tiễn xấu phổ biến
Raynos

@Raynos: Nếu bạn không lồng chúng, bạn sẽ đặt chúng ở đâu? Các ngươi không có lớp để chứa chúng. Đây là một số mã tiêu biểu:jquery(function($){ $('#id').click(function(){...}); }
kevin cline

@kevincline ... Mã điển hình cho noobs, bạn cần các hàm lồng nhau sâu. Và đó là vì javascript không có phạm vi mô-đun, vì vậy bạn cần đóng cửa ẩn danh đó.
Raynos

Và nếu nhấp chuột đó thực hiện một cuộc gọi Ajax, với một cuộc gọi lại hoàn thành? Bây giờ bạn có chức năng lồng nhau hai cấp độ. Chắc chắn, bạn có thể giới hạn việc lồng nhau bằng cách gán các bao đóng ẩn danh cho các biến. Điều đó thực sự tốt hơn?
kevin cline

2

Đây là một trong những câu hỏi không có câu trả lời đúng và các từ như "sở thích cá nhân", "thực hành nhóm" xuất hiện trong đầu. Theo tôi, các chức năng nhỏ (hiện tại đây là một thứ chủ quan khác) không được sử dụng ở bất kỳ đâu thuộc về chức năng cha mẹ của chúng, đặc biệt là khi chúng có thể không được đặt tên.


0

Câu hỏi này không có câu trả lời đúng, vì không lựa chọn nào tối đa hóa việc đóng gói. Nếu bạn lồng chúng, chúng vẫn có quyền truy cập vào các biến mà chúng không nên. Nếu bạn không, thì các chức năng khác có quyền truy cập vào các chức năng mà họ không nên. Dù bằng cách nào, bạn sẽ thua.

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.