2009-03-04 41 views
6

Thận trọng để phá vỡ chức năng dài thành chức năng chính và chức năng trợ giúp.Khi nào tôi nên phá vỡ một chức năng?

Tôi biết rằng chỉ có chức năng chính của mô-đun bên ngoài sẽ được gọi, nhưng thời lượng dài của nó có thể chứng minh là đáng sợ.

Sách giáo khoa đặt giới hạn về số lượng dòng, nhưng tôi cảm thấy rằng điều này quá cứng nhắc.

P.S. Tôi đang lập trình bằng Python và cần xử lý các thư đến. Hàm trả về một tuple chứa thông điệp nhưng trong các kiểu dữ liệu nội bộ của Python. Vì vậy, bạn có thể thấy mã phần nào độc lập cho từng loại thông báo.

Duplicate Câu hỏi

When is a function too long?

Trả lời

4

Tôi nghĩ bạn cần phải giải quyết vấn đề này từ đầu kia của vấn đề. Hãy suy nghĩ từ dưới lên. Xác định các đơn vị công việc nhỏ, càng nhỏ càng tốt, và bắt đầu soạn mã của bạn theo cách đó. Bạn sẽ chỉ gặp phải các vấn đề về mã spaghetti khi bạn mã hóa từ trên xuống và không giữ một cách tiếp cận có cấu trúc.

Nếu bạn đã có mã spaghetti và cần phải tái cấu trúc, bạn phải bắt đầu lại từ đầu. Nó có lẽ là nhiều công việc để phá vỡ mã spaghetti hiện có hơn để viết lại nó, và kết quả có thể không được tốt.

Tôi không nghĩ rằng cần có một số khó cho các dòng mã trong một phương thức, nhưng mã được viết tốt không có phương thức có từ 5 đến 10 dòng trong các lớp thấp hơn và từ 20 đến 30 dòng trong logic nghiệp vụ. Để cung cấp cho bạn một số loại số liệu.

+0

khi đề cập đến số dòng mã, bạn không bao gồm khoảng cách, bình luận và ngắt dòng (thêm trả về vận chuyển sau phần tử mảng và tham số phương thức, v.v.) phải không? – koeder

3

Một nguyên tắc nhỏ là nếu nó không phù hợp trên một màn hình duy nhất đó là giá trị nghĩ về việc tách nó lên. Nhưng chỉ khi nó có ý nghĩa để tách nó ra, một số chức năng dài là hoàn toàn có thể đọc được và nó không làm cho bất kỳ ý nghĩa để slavishly chia chúng thành nhiều chức năng chỉ vì lợi ích của nó.

3

Tôi không phải là một fan hâm mộ lớn của việc phá vỡ một chức năng thành nhiều chức năng không cần thiết. Nó không phải là một điều khó khăn và nhanh chóng - nếu có những thứ có vẻ như các đơn vị logic riêng biệt, sau đó bằng mọi cách, phá vỡ chúng ra và suy nghĩ về chúng một cách riêng biệt. Nhưng không chỉ phá vỡ mọi thứ ra vì lợi ích của một số hướng dẫn như "một trang cho mỗi chức năng" hoặc "N dòng cho mỗi chức năng".

1

Gần đây tôi đã thảo luận điều này với một người bạn. Ông đề nghị tái cấu trúc để tách rời những lo ngại và tôi phải nói rằng tôi phải đồng ý. Đó là, một chức năng nên làm một điều, nếu nó làm nhiều hơn một điều, chia nó ra. Nếu không, để cho nó được với nhau, nó làm cho không có ý nghĩa để phân chia một chức năng, chỉ để có nó obfuscate ý nghĩa. Sau khi tất cả, một chức năng là một khối mã mà làm một điều!

+0

Vâng "một điều" là khá chủ quan. Tôi hỏi về việc đột nhập vào chức năng chính và chức năng trợ giúp. Vì vậy, ở đây bạn thấy một chức năng chính đang làm nhiều thứ. – Xolve

+0

Ok. Tôi sẽ nói rằng một chức năng chính với những người giúp đỡ là ok, miễn là nhiệm vụ mà chức năng chính có thể được chia thành các bước hợp lý, mỗi trong số đó đại diện cho một mối quan tâm riêng biệt. – batbrat

+0

Tôi cũng sẽ tránh bị bẻ cong thành các chức năng, khi chức năng chính được lồng sâu trong các vòng lặp. – batbrat

1

Giới hạn về số lượng các dòng thường không thực tế do nó không giải thích cho khả năng đọc. Tốt hơn là cố gắng phân tách các nhóm mã chỉ có một vài đầu vào và chỉ một vài kết quả đầu ra và biến nó thành một functon riêng biệt. Nó không phải luôn luôn có thể - sau đó nó thường khôn ngoan để chỉ cần để lại mã như nó là và không để tái cấu trúc vì lợi ích của tái cấu trúc.

0

cá nhân tôi phá vỡ chức năng nếu nó lưu tổng số dòng hoặc tổng thời gian xử lý.

nếu tôi chỉ chạy trình trợ giúp một lần cho mỗi chức năng chính, tôi không bận tâm

0

Vấn đề là hiệu trưởng tốt hơn nên có các chức năng đặc biệt. Nhưng một nơi đặt giới hạn phụ thuộc rất nhiều vào 1) kiểu lập trình "thông thường" ở một số ngôn ngữ nhất định. (người ta có thể quan sát thấy rằng, langau hướng đối tượng có xu hướng ngắn hơn thủ tục hơn chúng ta hãy nói C hoặc tương tự 2) nó phụ thuộc vào cách lập trình của bạn. Mỗi giới hạn cứng phải được đặt câu hỏi. IMHO. Nói chung có lẽ sẽ có một số chương trình phân phối "tự nhiên" 3) Tôi nghĩ rằng một điều nên lưu ý là một chức năng nên thực hiện một nhiệm vụ nào đó, ví dụ một số chức năng để phân tích cú pháp thường dài hơn một hàm lĩnh vực trong một cấu trúc. Hoặc quay trở lại chỉ xem xét cách một vòng lặp sự kiện trong API Windows có thể xem xét. Vì vậy, tất cả đều gợi ý rằng có thể có lý do chính đáng cho các phương pháp dài ...

0

Nếu có mã độc lập (trong trường hợp cụ thể của bạn cho từng loại thư) thì các khu vực đó sẽ bị chia nhỏ.

0

Kích thước không quan trọng. Đánh giá tôi bằng kích thước của tôi, đúng không? - Yoda

Mối quan tâm chính của bạn là dễ đọc, đơn giản và bảo trì. Một chỉ báo tốt là nếu bạn cần viết bình luận để giải thích một phần của một hàm thì phần đó là một ứng cử viên tốt cho một hàm riêng biệt.

0

Nếu bạn không viết và nó đã được sản xuất: KHÔNG BAO GIỜ !!! Nếu bạn phá vỡ nó, bạn có khả năng phá vỡ nó, nó đơn giản.

Nếu bạn đang viết nó và bạn không chắc chắn, quy tắc trên màn hình táo như những người khác đã nói.

+1

Tôi hoàn toàn không đồng ý. Viết đơn vị kiểm tra và sau đó refactor. –

+2

Gaaa .. đó là cách mã "cũ" vẫn là mã cũ. Mã lỗi phải luôn được xem xét để tái cấu trúc. –

+0

Tôi rất không đồng ý. Mã lỗi phải luôn được cấu trúc lại. Dự án sống lâu sẽ trở thành cơn ác mộng nếu không được tái cấu trúc. Yêu cầu sẽ luôn thay đổi, ngay cả đối với mã hiện có. Viết các bài kiểm tra đơn vị trước khi tái cấu trúc và sau đó đảm bảo rằng các thử nghiệm đó chạy qua sau khi tái cấu trúc. – jgauffin

0

Có nhiều lý do để phá vỡ chức năng dài thành các phần cấu thành của nó. quan trọng nhất là:

  • dễ đọc
  • trì
  • rõ ràng mã/ý định

Một số chức năng đơn giản không thể bị phá vỡ thành từng mảnh nhỏ hơn mà không ảnh hưởng tiêu cực đến mục tiêu niêm yết, vì vậy không có hard- và quy tắc nhanh.

2

Không bao giờ viết chức năng, khi được in trên giấy bịt mắt, cao hơn bạn.

+0

+1 cho giá trị lol .. lol –

+0

Đó là lời khuyên thực sự, nhưng đó là một vài thập kỷ lỗi thời. – joeforker

+1

bạn có ý nghĩa cao hơn bạn khi mở ra không? hoặc vẫn gấp lại? :-) – Andy

1

Vì tôi đang viết mã bằng Python nên tôi có quyền tự do viết chức năng bên trong các hàm, không giống như C, C++ hoặc Java. Điều này tôi cảm thấy là một sự lựa chọn tốt hơn.

2

Tôi thích quy tắc ngón tay cái mà bạn nên thoát ra khỏi chức năng phụ nếu bạn có thể nghĩ ra tên tốt tên miền có liên quan cho nó.

Khi ai đó có thể hiểu được chức năng cấp cao nhất mà không nhất thiết phải tìm kiếm định nghĩa về chức năng phụ, bạn có thể kiếm được lợi nhuận ròng. (Nhưng khi bạn phá vỡ nó quá xa, tên của bạn bắt đầu đề cập đến hiện vật triển khai của bạn chứ không phải là tên miền)

Các vấn đề liên quan