Tôi có thể nghĩ về ít nhất hai đối số có lợi cho các hàm dài:
Nó có nghĩa là bạn có rất nhiều bối cảnh xung quanh mỗi dòng. Một cách để chính thức hóa điều này: vẽ biểu đồ luồng điều khiển của mã của bạn. Tại một đỉnh (~ = line) giữa chức năng nhập và thoát chức năng, bạn biết tất cả các cạnh đến. Hàm càng dài thì càng có nhiều đỉnh như vậy.
Nhiều chức năng nhỏ có nghĩa là có một biểu đồ cuộc gọi lớn hơn và phức tạp hơn. Chọn một dòng ngẫu nhiên trong một hàm ngẫu nhiên và trả lời câu hỏi "dòng này được thực thi trong bối cảnh nào?" Điều này trở nên khó hơn khi biểu đồ cuộc gọi càng lớn và phức tạp hơn, bởi vì bạn phải nhìn vào nhiều đỉnh hơn trong biểu đồ đó.
Ngoài ra còn có các đối số chống lại các chức năng dài Các lò xo có thể kiểm tra đơn vị. Sử dụng th̶e̶ f̶o̶r̶c̶e̶ kinh nghiệm của bạn khi lựa chọn giữa cái này và cái khác.
Lưu ý: Tôi không nói rằng sếp của bạn đúng, chỉ có điều quan điểm của anh ta có thể không hoàn toàn không có giá trị.
Tôi nghĩ rằng quan điểm của tôi là tham số tối ưu hóa tốt không phải là chiều dài chức năng. Tôi nghĩ rằng một desiderata hữu ích hơn để nghĩ theo nghĩa như sau: tất cả những thứ khác đều bằng nhau, tốt hơn là có thể đọc ra mã mô tả cấp cao về cả logic nghiệp vụ và việc triển khai. (Chi tiết triển khai cấp thấp luôn có thể được đọc nếu bạn có thể tìm thấy đoạn mã có liên quan.)
Nhận xét về câu trả lời của David Arno :
Viết các hàm nhỏ là một nỗi đau vì nó buộc bạn phải di chuyển vào từng hàm nhỏ để xem mã đang làm gì.
Nếu chức năng được đặt tên tốt, đây không phải là trường hợp. isApplicationIn Producttion là hiển nhiên và không cần thiết phải kiểm tra mã để xem nó làm gì. Trong thực tế thì điều ngược lại là đúng: kiểm tra mã tiết lộ ít về ý định hơn tên hàm thực hiện (đó là lý do tại sao sếp của bạn phải dùng đến các bình luận).
Tên này cho thấy rõ giá trị trả về nghĩa là gì , nhưng nó không nói gì về tác động của việc thực thi mã (= những gì mã làm ). Tên (chỉ) truyền đạt thông tin về ý định , mã truyền tải thông tin về hành vi (từ đó các phần của ý định đôi khi có thể được suy ra).
Đôi khi bạn muốn cái này, đôi khi cái kia, vì vậy quan sát này không tạo ra quy tắc quyết định hợp lệ một chiều.
Đặt mọi thứ trong một vòng lặp lớn chính ngay cả khi vòng lặp chính dài hơn 300 dòng, đọc nhanh hơn
Có thể nhanh hơn để quét qua, nhưng để thực sự "đọc" mã, bạn cần có khả năng thực thi nó một cách hiệu quả trong đầu. Điều đó thật dễ dàng với các hàm nhỏ và thực sự rất khó với các phương thức dài 100 dòng.
Tôi đồng ý rằng bạn phải thực hiện nó trong đầu của bạn. Nếu bạn có 500 dòng chức năng trong một chức năng lớn so với nhiều chức năng nhỏ, tôi không rõ tại sao việc này trở nên dễ dàng hơn.
Giả sử trường hợp cực đoan của 500 dòng mã hiệu ứng phụ theo đường thẳng và bạn muốn biết hiệu ứng A xảy ra trước hay sau hiệu ứng B. Trong trường hợp chức năng lớn, hãy sử dụng Trang Lên / Xuống để xác định hai dòng rồi so sánh số dòng. Trong trường hợp nhiều hàm nhỏ, bạn phải nhớ các hiệu ứng xảy ra ở đâu trong cây cuộc gọi và nếu bạn quên bạn phải dành một lượng thời gian không đáng kể để khám phá lại cấu trúc của cây này.
Khi đi qua cây cuộc gọi của các chức năng hỗ trợ, bạn cũng phải đối mặt với thách thức xác định khi nào bạn đi từ logic kinh doanh đến các chi tiết triển khai. Tôi khẳng định không có bằng chứng * rằng biểu đồ cuộc gọi càng đơn giản thì càng dễ tạo ra sự khác biệt này.
(*) Ít nhất tôi thành thật về điều đó ;-)
Một lần nữa, tôi nghĩ cả hai cách tiếp cận đều có điểm mạnh và điểm yếu.
Chỉ viết các hàm nhỏ nếu bạn phải sao chép mã
Tôi không đồng ý. Như ví dụ mã của bạn cho thấy, các hàm nhỏ, được đặt tên tốt sẽ cải thiện khả năng đọc mã và nên được sử dụng bất cứ khi nào [ví dụ] bạn không quan tâm đến "làm thế nào", chỉ "cái gì" của một chức năng.
Cho dù bạn quan tâm đến "làm thế nào" hay "cái gì" là một chức năng của mục đích mà bạn đang đọc mã (ví dụ: lấy ý tưởng chung so với theo dõi lỗi). Mục đích mà bạn đang đọc mã không có sẵn trong khi viết chương trình, và rất có thể bạn sẽ đọc mã cho các mục đích khác nhau; quyết định khác nhau sẽ tối ưu hóa cho các mục đích khác nhau.
Điều đó nói rằng, đây là một phần trong quan điểm của ông chủ mà tôi có thể không đồng ý nhất.
Đừng viết một hàm với tên của bình luận, hãy đặt dòng mã phức tạp của bạn (3-4 dòng) với một nhận xét ở trên. Như thế này bạn có thể sửa đổi mã lỗi trực tiếp
Tôi thực sự không thể hiểu lý do đằng sau điều này, cho rằng nó thực sự nghiêm trọng. [...] Nhận xét có một lỗ hổng cơ bản: chúng không được biên dịch / giải thích và do đó không thể được kiểm tra đơn vị. Mã được sửa đổi và bình luận bị bỏ lại một mình và cuối cùng bạn không biết cái nào đúng.
Trình biên dịch chỉ so sánh tên cho sự bình đẳng, chúng không bao giờ cung cấp cho bạn một MisleadNameError. Ngoài ra, vì một số trang web cuộc gọi có thể gọi một chức năng nhất định theo tên, đôi khi việc thay đổi tên trở nên khó khăn và dễ bị lỗi hơn. Bình luận không có vấn đề này. Tuy nhiên, điều này có phần suy đoán; để thực sự giải quyết điều này, có lẽ người ta sẽ cần dữ liệu về việc các lập trình viên có thể cập nhật các bình luận sai lệch so với các tên gây hiểu lầm hay không và tôi không có điều đó.