Tại điểm / phạm vi nào là một tệp mã quá lớn?


36

Tôi đang tìm thấy rất nhiều tệp dòng 2-3k và thực sự không cảm thấy chúng nên lớn như vậy.

Một tiêu chí tốt để gọi một cách khách quan một tập tin mã nguồn là "quá lớn" là gì?


Đồng nghiệp của bạn cho bạn biết sau khi xem lại mã. "Bạn không thể tự xác định điều này vì bạn biết nhiều về tác giả hơn là mã tự nói. Máy tính không thể cho bạn biết, vì những lý do tương tự mà nó không thể biết liệu một bức tranh có phải là nghệ thuật hay không. Do đó, bạn cần một người khác có khả năng về việc duy trì phần mềm - để xem những gì bạn đã viết và đưa ra ý kiến ​​của người đó ... "
gnat

Một số trình biên dịch được sử dụng để có các giới hạn kỳ lạ về kích thước mã nguồn: độ dài dòng tối đa hoặc số dòng tối đa. Khi trình biên dịch phàn nàn, đây là một chỉ báo khách quan cho thấy mã quá lớn (hoặc đã đến lúc nâng cấp).
mouviciel

2
Tách càng nhiều càng tốt, nhưng không phá vỡ tính toàn vẹn của các tệp. Mỗi tệp (hoặc cặp tệp tiêu đề / nguồn) phải luôn là một tổng thể được làm tròn, độc lập với việc thực hiện bên trong của các tệp khác. Nếu điều này có nghĩa là một số tệp sẽ lớn bởi vì chúng thực hiện một cái gì đó phức tạp, vì vậy hãy là nó.
Ambroz Bizjak

Lưu ý rằng sự phức tạp không chỉ là về số lượng, mà còn về cấu trúc. Ví dụ: tôi muốn nói rằng python zen "phẳng tốt hơn lồng nhau": một danh sách phẳng gồm 100 trường hợp đơn giản hơn một hệ thống phân cấp (bạn sẽ không nhớ tất cả 100 trường hợp nhưng bạn dễ dàng nhớ rằng có 100 lựa chọn thay thế) . Và một hệ thống phân cấp "thông thường" trong đó các nhánh có cùng cấu trúc so với anh chị em của chúng đơn giản hơn so với hệ thống phân cấp có cấu trúc phụ không đều.
Juh_

"Có phải đó là mã nguồn?" "Không, đó là tệp thực hiện, Mã nguồn nằm trong các xe tải theo sau".
mckenzm

Câu trả lời:


26

Là một mô hình lý tưởng, tôi sử dụng các tiêu chí sau (với lý do tương tự với những gì Martin Beckett đề xuất, nghĩa là suy nghĩ theo cấu trúc logic chứ không phải về các dòng mã):

Quy tắc 1

Một lớp cho mỗi tệp (trong C ++: một lớp -> một tiêu đề và một tệp thực hiện).

Quy tắc 2

Seven được coi là số lượng vật phẩm mà não của chúng ta có thể quan sát cùng một lúc mà không bị nhầm lẫn. Trên 7 chúng tôi thấy khó khăn để giữ một cái nhìn tổng quan về những gì chúng ta thấy. Do đó: mỗi lớp không nên có nhiều hơn 7-10 phương thức. Một lớp có hơn 10 phương thức có lẽ quá phức tạp và bạn nên thử tách nó ra. Chia tách là một phương pháp rất hiệu quả bởi vì mỗi lần bạn tách một lớp, bạn sẽ giảm độ phức tạp của từng lớp ít nhất là 2 lần.

Quy tắc 3

Phần thân phương thức không vừa với một hoặc hai màn hình là quá lớn (tôi giả sử rằng cửa sổ màn hình / trình chỉnh sửa có khoảng 50 dòng). Lý tưởng nhất, bạn có thể thấy toàn bộ phương thức trong một cửa sổ. Nếu đây không phải là trường hợp, bạn chỉ cần cuộn lên xuống một chút, mà không quên phần phương thức bị ẩn. Vì vậy, nếu bạn phải cuộn nhiều hơn một màn hình lên hoặc xuống để đọc toàn bộ thân phương thức, phương thức của bạn có thể quá lớn và bạn có thể dễ dàng mất tổng quan.

Một lần nữa, các phương thức phân tách sử dụng các phương thức trợ giúp riêng có thể giảm độ phức tạp của phương thức rất nhanh (ở mỗi lần phân tách, độ phức tạp ít nhất là giảm một nửa). Nếu bạn giới thiệu quá nhiều phương thức trợ giúp riêng tư, bạn có thể xem xét việc tạo một lớp riêng để thu thập chúng (nếu bạn có nhiều phương thức riêng tư hơn phương thức công khai, có thể lớp thứ hai đang ẩn bên trong lớp chính của bạn).

Tổng hợp những ước tính rất thô sơ này:

  • Nhiều nhất một lớp cho mỗi tệp nguồn.
  • Nhiều nhất là 10 phương thức công khai cho mỗi lớp.
  • Tối đa 10 phương thức riêng cho mỗi lớp.
  • Tối đa 100 dòng trên mỗi phương thức.

Vì vậy, một tệp nguồn có hơn 2000 dòng có lẽ là quá lớn và bắt đầu quá lộn xộn.

Đây thực sự là một ước tính rất sơ bộ và tôi không tuân theo các tiêu chí này một cách có hệ thống (đặc biệt là vì không phải lúc nào cũng có đủ thời gian để thực hiện tái cấu trúc đúng cách). Ngoài ra, như Martin Beckett đã đề xuất, có những tình huống trong đó một lớp là một tập hợp lớn các phương thức và sẽ không có ý nghĩa gì khi tách chúng theo một cách nhân tạo chỉ để làm cho lớp nhỏ hơn.

Dù sao, theo kinh nghiệm của tôi, một tệp bắt đầu không thể đọc được khi một trong các tham số trên không được tôn trọng (ví dụ: thân phương thức 300 dòng kéo dài sáu màn hình hoặc tệp nguồn có 5000 dòng mã).


1
Tôi cũng sẽ cố gắng cho các phương thức không quá 10 dòng ... giúp dễ đọc / hiểu phương thức đang làm gì và giảm độ phức tạp có thể dễ dàng xảy ra trong các phương thức lớn ...
Zack Macomber

4
Rule2 là vô lý nếu bạn làm theo nó để kết luận. Bạn không nên có nhiều hơn 7 tệp trong một thư mục để bạn phải giữ các tệp của mình lớn để bạn không bị nhầm lẫn giữa hàng chục hoặc hàng trăm tệp trong dự án của bạn. Tương tự, cấu trúc thư mục lồng nhau rất khó hiểu, vì vậy tốt hơn là giữ một vài tệp lớn trong một thư mục hơn là phân tán mọi thứ xung quanh.
hasen

1
Tôi xin lỗi câu trả lời này dựa trên số liệu hoàn toàn tùy ý. "7 mục" rõ ràng là nhảm nhí, nếu không bạn sẽ không thể sử dụng bảng chữ cái. Kích thước của đối tượng nên dựa trên sự phân tách các mối quan tâm, trách nhiệm đơn lẻ, sự gắn kết cao - khớp nối thấp và các nguyên tắc tương tự, không phải là số tùy ý.
JacquesB

1
@JacquesB 7 mục thường là 7 thông tin không liên quan. Nếu bộ não của bạn có thể liên kết hoặc nhóm thông tin, theo nghĩa thực tế, đó là 1 thông tin có thể dẫn đến nhiều hơn nếu bạn cố nhớ lại (thực tế "bảng chữ cái" là một ký hiệu, không phải tất cả 26 chữ cái). Một ví dụ tốt hơn sẽ là cố nhớ một số gồm 7 chữ số được nói với bạn qua điện thoại mà không có sẵn bút và giấy. Các phương thức rõ ràng không phải là số tùy ý, nhưng nếu các phương thức đó có liên quan đến những gì bạn đang mã hóa, bạn có thể mong đợi sau 7, bạn sẽ phải tìm nó trước khi bạn có thể nhớ lại chính xác.
Neil

3
@Neil: Nếu các phương thức trong một lớp là những mẩu thông tin ngẫu nhiên không liên quan, thì bạn có vấn đề lớn hơn trong thiết kế lớp của bạn so với số lượng phương thức.
JacquesB

33

Không - không phải về dòng mã. Các trình điều khiển nên được nhóm hợp lý. Ví dụ, chắc chắn không nên có nhiều lớp trong một tệp lớn

Nếu bạn có một lớp hợp pháp có vài trăm phương thức (không thể nói là mô hình 3D), việc chia nó thành các tệp tùy ý sẽ không thuận tiện hơn nhiều. Chúng ta thường phải làm điều này khi bộ nhớ khan hiếm và bộ xử lý chậm hơn - và đó là một nỗi đau, liên tục tìm kiếm định nghĩa hàm.


2
Không phải một lớp học với hàng trăm phương pháp sẽ là một triệu chứng của sự đố kị của lớp, thiếu sự gắn kết, thiết kế kém, vi phạm nguyên tắc trách nhiệm duy nhất, v.v.?
Tulains Córdova

2
@ user1598390: thông thường, nhưng không phải lúc nào cũng vậy.
whatsisname

4
@ user1598390 - nói chung là mô hình gis / 3d có rất nhiều thao tác bạn có thể thực hiện và sau đó chúng bị quá tải cho tín hiệu 2d, 3d, 4d, 3d +, sau đó float / double / số, v.v. - các mẫu giúp một chút nhưng hiệu quả nhiều hoạt động thường tốt hơn một người thừa kế giai cấp khá
Martin Beckett

2
@ tp1 - và bạn sử dụng một phông chữ nhỏ để chúng không chiếm nhiều dung lượng?
Martin Beckett

2
@ tp1 Anh bạn, tôi xin lỗi, tôi thực sự không có ý bất kính, nhưng tôi cảm thấy tiếc cho bất cứ ai làm việc với bạn. Nếu bạn có 1200 lớp, hãy sử dụng quy ước thư mục, nếu bạn có quá nhiều thư mục, hãy chia chúng thành các mô-đun / thư viện độc lập.
dukeofgaming

8

Khi mã trong nó trở nên không thể nhầm lẫn. tức là: bạn không thể biết chỉ bằng cách xem mã nếu phương thức / lớp / hàm bạn đang tìm kiếm (và phải chỉnh sửa / gỡ lỗi) có ở đó hay không, và nếu vậy, nó ở đâu.

Mặc dù vậy, lựa chọn và tính năng IDE / Editor của bạn sẽ ảnh hưởng đến định lượng thực tế của giới hạn trên này. Mã gấp , liệt kê chức năng / phương pháp và tra cứu sẽ hoãn lại thời điểm kịch bản phát triển này xuất hiện.

Nhưng khi nó xảy ra, đã đến lúc chia tách nó.


2

Đây là một cái nhìn khác: bạn đang hỏi về cách giới hạn kích thước tệp. Ý kiến ​​của tôi là có nhiều yếu tố làm cho các tệp mã lớn rất có vấn đề. Đôi khi tệp mã rất lớn nhưng nội dung của nó được phân cụm tốt và mã cực kỳ sạch sẽ, do đó kích thước không gây ra bất kỳ vấn đề đáng kể nào. Tôi đã thấy rất nhiều tệp rất dễ đọc mặc dù LỘC cao.

Thay vì nhấn vào số liệu LỘC, tôi thà nghĩ về việc sử dụng dữ liệu lịch sử để hiểu tần suất mã bị hỏng trong các tệp lớn đó. Thông thường lý do cho điều đó là các nhà phát triển không có thời gian kiên nhẫn để kiểm tra các địa điểm khác có liên quan trong cùng một tệp và thực hiện thay đổi với tâm lý "sửa nhanh" mà không đủ hiểu biết.

Mối nguy hiểm lớn hơn là sự hiện diện của mã sao chép-dán. Sao chép-dán mã hóa tự nhiên cũng tăng tốc độ tăng trưởng LỘC. Tôi nghĩ rằng việc loại bỏ sao chép-dán thậm chí còn quan trọng hơn việc giữ LỘC dưới một số phép thuật. Ngoài việc sao chép thuần túy, còn có một mối nguy hiểm thứ hai trong các tệp lớn: chức năng chồng lấp. Tệp càng lớn, càng có nhiều khả năng bạn sẽ thực hiện lại một số đoạn đã có trong một số phần khác của cùng một tệp.

Vì vậy, miễn là tỷ lệ sửa lỗi (tỷ lệ sửa lỗi cam kết với tất cả các cam kết) là thấp đối với các tệp lớn hơn, tình huống có thể chấp nhận được. Vui lòng thử git logvà đọc lướt qua bao nhiêu lần xác nhận có liên quan đến lỗi. Hoặc sử dụng một công cụ có thể tự động phân tích và trực quan hóa nó, ví dụ Softagram .


-1

Hãy xem xét điều này Metaphor. Khi nói đến độ dài mã, tôi nghĩ chúng ta nên xem xét những điều sau:

The Cat in The Hat (50 pp.)

Lord of The Rings (1,178 pp.)

Không có gì sai với Lord of the Rings. Đó là một cuốn sách tuyệt vời. The Cat in the Hatcũng là một cuốn sách tuyệt vời Cả hai có thể được hiểu bởi một đứa trẻ 5 tuổi, nhưng chỉ có một phù hợp hơn do nội dung.

Theo quan điểm của tôi, viết mã nên có ý nghĩa với một đứa trẻ 5 tuổi bất cứ khi nào chúng ta có thể. Cyclomatic Complexitylà một khái niệm quan trọng mà các nhà phát triển có thể cân nhắc khi họ tạo mã. Sử dụng và tạo các thư viện để tăng cường khả năng sử dụng lại mã và mã càng nhiều càng tốt. Bằng cách này, mã của chúng tôi có thể nói nhiều khối lượng hơn những gì chúng ta thấy bằng văn bản.

Hầu hết chúng ta không viết mã lắp ráp . Nhưng gốc của mã của chúng tôi là lắp ráp. Tìm kiếm thông qua lắp ráp 10000 dòng khó hơn 10000 dòng python, nếu nó được thực hiện chính xác.

Nhưng một số công việc yêu cầu viết 500 đến 1000 dòng. Mục tiêu của chúng tôi với mã phải là viết 300 dòng mã sạch.

Là nhà phát triển, chúng tôi muốn viết "Lord of The Rings". Cho đến khi chúng tôi gặp một lỗi và ước chúng tôi viết "Cat in the Hat". Đừng biến mã hóa thành thước đo của bản ngã. Chỉ cần làm cho mọi thứ hoạt động một cách đơn giản.

Các nhà phát triển không muốn viết mã tài liệu, (Tôi thích mã tài liệu cá nhân, tôi không ích kỷ như vậy). Vì vậy, đừng viết mã mà chỉ bạn mới có thể hiểu / đọc. Viết Cat in the Hatmã.

Chúng tôi đều biết bạn là JRR Tolken (trong đầu của bạn). Hãy nhớ rằng bạn sẽ không có gì để chứng minh với mã miễn phí lỗi.

Một lý do khác cho phép ẩn dụ.

Đừng quá mức để người đọc lan truyền sự giàu có. Nếu bạn làm việc với một nhóm người và tất cả họ phải thay đổi cùng một tệp lớn, có lẽ bạn sẽ tự đặt mình vào gitđịa ngục hợp nhất.

Mọi người đều thích nổi loạn.

-> Nói không ai bao giờ!

TL; DR Tập trung vào khả năng đọc. Truyền bá mã của bạn và trợ giúp trên nhiều dòng và tệp nhiều nhất có thể. Đừng ném 8 hoặc 9 lớp vào một tệp, Nó làm cho mã khó đọc và khó bảo trì hơn. Nếu bạn có mã điều kiện hoặc vòng lặp lớn, hãy xem xét thay đổi chúng thành Lambdas nếu ngôn ngữ hỗ trợ nó. Các chức năng tiện ích nên được coi là một con đường tuyệt vời để tăng khả năng đọc mã. Tránh làm tổ nặng.


Không phải là một downvoter, nhưng sự tương tự của bạn là một chút mất đối với tôi. Bạn có nói rằng tốt hơn là trải đều mã của bạn trên nhiều dòng và có ít từ hơn trên mỗi dòng không?
Thức ăn gia súc

Truyền bá mã và trợ giúp trên nhiều dòng và tệp càng nhiều càng tốt. Tập trung vào khả năng đọc. Đừng ném 8 hoặc 9 lớp vào một tệp. Nó làm cho mã khó đọc và khó bảo trì hơn. Nếu bạn có một mã điều kiện lớn hoặc các vòng lặp. Biến chúng thành tiện ích. Tránh làm tổ nặng. Xin vui lòng cho tôi biết nếu điều này giúp giải thích nó.
GetBackerZ

Có lẽ bạn nên chỉnh sửa nó thành câu trả lời của bạn, vì điều đó sẽ làm cho nó rõ ràng hơn những gì bạn muốn nói.
Thức ăn gia súc

Tôi đã sử dụng kịch bản cho Jackie Brown làm thước đo cho các chương trình COBOL z / OS mô-đun. Bạn biết đấy, đối với bữa tiệc cocktail ...
mckenzm

"có ý nghĩa với một đứa trẻ 5 tuổi bất cứ khi nào chúng ta có thể." - đối với các vấn đề trong thế giới thực phải trả các hóa đơn, điều này hiếm khi có thể xảy ra và đang nhắm đến điều sai trái
whatsisname
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.