2010-07-29 28 views
5

Tôi đã được hỏi câu hỏi này: Tôi không thể trả lời - Mọi câu trả lời ở đây?Điều gì có thể nói về lớp java này?

Điều gì có thể nói về lớp java có 1000 dòng mã, với phương pháp 1-n có 100 dòng và n + 1 đến m phương thức có 200 dòng mã?

Tôi nghĩ, các lớp học sẽ ổn khi có 1000 dòng mã và phương pháp cũng được phép có 100-200 dòng mã - Vì vậy, tôi đã không trả lời xem xét rằng lớp học là hoàn toàn ổn.

Có hiệu suất thời gian biên dịch đã biết có liên quan đến số dòng mà lớp java có không? hoặc một phương thức java có? có bất kỳ tiêu chuẩn nào - nếu có, làm thế nào một người có thể biện minh về mặt kỹ thuật?

cảm ơn!

+12

"phương pháp cũng được phép có 100-200 dòng mã" - er, không. –

+4

Đối với tôi, các phương pháp dài hơn 40 dòng chắc chắn không ổn, nhưng ít nhất phải có lý do chính đáng. – MRalwasser

+0

Phản hồi tuyệt vời từ cộng đồng java. Tái cấu trúc lại là câu trả lời. Cảm ơn mọi người. – gekrish

Trả lời

14

Điều gì có thể nói về lớp này là nó phải được cấu trúc lại. Nó có quá nhiều dòng mã trên mỗi lớp và mỗi phương thức. Nó không gây ra bất kỳ vấn đề kỹ thuật nào, nhưng nó gây ra các vấn đề về khả năng đọc và hỗ trợ.

4

Tôi nghĩ rằng vấn đề chính ở đây không phải là hiệu suất biên dịch. Lớp 1000 dòng khó đọc và dễ hiểu.

Có lẽ lớp nên được phân tách trong các lớp khác (hoặc lớp con, nếu trong trường hợp thừa kế của bạn có giá trị hơn thành phần), vì vậy mỗi lớp đều có trách nhiệm được xác định rõ trong hệ thống.

Nhưng tôi không thể nói nhiều về vấn đề này nếu tôi không thể xem triển khai của lớp học.

Có rất nhiều sách hay giải thích cách giải quyết vấn đề này và các vấn đề khác về thiết kế. Hai cuốn sách nổi tiếng là Code Complete 2nd Edition by Steve McConnellRefactoring by Martin Fowler et al.

+0

+1 Để đề cập đến vấn đề trách nhiệm. – helpermethod

3

gì nói đến cái tâm của tôi:

n = 0, m-n = 5 --> 5 methods 
n = 2, m-n = 4 --> 6 methods 
n = 4, m-n = 3 --> 7 methods 
n = 6, m-n = 2 --> 8 methods 
n = 8, m-n = 1 --> 9 methods 
n = 10, m-n = 0 --> 10 methods 

Mọi thứ khác đã được đề cập trong các câu trả lời khác.

+0

Nó có thể là một lớp với một hàm tạo dòng 1000 và phương thức zero. – emory

+0

Ông ấy tôi quên mất điều đó: P À OK, tôi giả định rằng lớp đó là 1000 dòng mà không có (các) nhà xây dựng =) – George

+0

... và các trường ... và dòng trống ... và nhận xét . Và tất cả các đồ trang trí (nhập, xác định, vv) Rất nhiều điều để giả định, ngay cả việc khai báo lớp cũng mất một hoặc hai dòng: P – nanda

1

Có thể nói gì? Vâng, có thể nói rằng số phương thức trong lớp đó là: m < = 5 + n/2

0

Điều đó có nghĩa là mặc dù bạn đã sử dụng ngôn ngữ OOP, bạn vẫn mã hóa như bạn thường làm trong bất kỳ ngôn ngữ lập trình không cấu trúc tầm thường.

2

Đây không phải là thời gian biên soạn mà bạn cần lưu ý, mà là vấn đề bảo trì. Gần đây tôi đã phải đối mặt với vấn đề tồi tệ hơn - tôi đã tiếp quản mã nơi lớp chính dài khoảng 6000 dòng, với các phương pháp rất dài, vòng lặp lồng nhau và câu lệnh if… Tin tưởng tôi, phải mất một nỗ lực để nhà phát triển mới hiểu được điều gì đang xảy ra trên đó.

Lý tưởng nhất là mỗi lớp/phương pháp chỉ nên có một trách nhiệm và chỉ thực hiện một tác vụ duy nhất. Vì vậy, nếu tôi là bạn tôi chắc chắn sẽ trả lời rằng lớp này thực sự cần phải được refactored!

0

Điều có thể nói là lớp học là ứng cử viên cho tái cấu trúc. Nhưng, tất nhiên, không có quy tắc cứng nhắc và nhanh chóng về mức độ lớn của một lớp học, hoặc các phương pháp của nó.

0

1. Phương pháp của Class là Ứng viên cho Refactoring

này không có nghĩa là phương pháp sẽ tự động được refactored. Có những trường hợp hợp pháp mà một phương pháp được thiết kế tốt có thể dài 100 hoặc thậm chí 200 dòng. Hãy xem xét một phương pháp thực hiện một chức năng toán học cao hơn trong đó sử dụng mảng lớn như bảng tra cứu để xử lý tốc độ cho các trường hợp phổ biến. Các mảng này hoàn toàn nằm bên trong phần thân của phương thức, có thể kéo dài nhiều dòng mã, nhưng có thể không thực sự thêm tất cả những gì vào sự phức tạp của các phương thức.

Tuy nhiên những trường hợp này hiếm, và phần lớn thời gian bạn có thể nói phương pháp kéo dài 100 dòng cần được chia nhỏ để phù hợp với thiết kế tốt cho nhiều lý do đã đề cập ở đây (dễ đọc, testability, tái sử dụng , v.v.) Hiểu và lưu ý "trường hợp góc" khi độ dài này thực sự hợp lý, và không nhảy ngay vào các phép tuyệt đối của "bất cứ lúc nào một thứ gì đó là X dòng bạn dài phải do Y" gần như chắc chắn sẽ phản ánh tốt hơn cho bạn.

2. The Class chính nó là một Candidate cho Refactoring

Theo ghi nhận của others, không có tuyệt đối khi nói đến cách lớn một lớp nên về dòng mã. Tuy nhiên, các Single Responsibility Principle nói rằng một lớp học nên làm một điều tốt và một điều duy nhất. Đó là một giả định hợp lý rằng lớp này đang làm nhiều thứ, chỉ dựa trên chiều dài của nó, và rằng thiết kế sẽ được hưởng lợi từ việc chia nhỏ nó trong một số lớp nhỏ hơn. Tuy nhiên, điều này không phải là đảm bảo. Một ngàn dòng không phải là vô lý dài, và có thể được đánh giá cao trong một số trường hợp. Chiều dài của các phương thức hầu như luôn là mối quan tâm lớn hơn chiều dài (theo dòng mã) của lớp.

3. Các kết luận về nội dung của lớp

Trong khi tôi nghi ngờ có thể có một lỗi đánh máy trong mô tả của OP của vấn đề: phương pháp 1-n có 100 dòng và n + 1 (xem xét nếu n là một số nguyên dương lớn hơn 1 --- bạn kết thúc với số âm 100 phương thức đường). Bạn có thể bắt đầu lý do về lớp học nếu bạn có thể tính toán nhanh về số lượng từng loại phương pháp.

Ví dụ, nếu 2 * a + b = 5 (nơi một là # 100 phương pháp dòng và b là # 200 phương pháp dòng), sau đó bạn biết rằng toàn bộ lớp là bao gồm không có gì ngoài những phương pháp này, bởi vì tổng số dòng trong chúng sẽ = 1000. Trong trường hợp đó, bạn biết lớp không có hàm tạo, trường hoặc khởi tạo. Biết được điều này, nó tuân theo mọi phương thức phải là static. Sau đó, bạn có một lớp chỉ tồn tại để cung cấp một số phương thức tĩnh dài hơn: âm thanh như một lớp tiện ích/trợ giúp cho tôi.

Bạn cũng biết trò chuyện: nếu 2 * a + b!= 5, lớp phải có ít nhất một trường, khối khởi tạo hoặc khối khởi tạo.

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