2009-05-11 18 views
16

Một nguyên tắc nhỏ của ngón tay cái là tôi thông minh tái cấu trúc bất kỳ phương pháp nào trên 50 dòng.Trong C# có bao nhiêu dòng trước khi một lớp nên được xem xét để được tái cấu trúc?

Số không bao gồm nhận xét và khoảng trắng nhưng mã thực tế. Lý do tôi cũng nói một cách thông minh là có rất nhiều lần một lớp trên 50 dòng được chấp nhận và không thể hoặc không nên thay đổi.

Tôi không có quy tắc chung cho lớp học. Nói chung tôi không kiểm tra các lớp để xem liệu chúng có nên được tái cấu trúc hay không.

Trong dự án hiện tại của tôi, tôi sắp hoàn thành một lớp dài gần 4000 dòng. Tuy nhiên không có phương pháp nào trên 50, và hầu hết các dòng và phương thức là riêng tư và không hành động trên bất kỳ dữ liệu nào bên ngoài lớp.

Quy tắc chung cho các lớp tái cấu trúc là gì?

+4

Hãy chỉ cho chúng ta một phương pháp 50-line mà không thể được giảm bớt. –

+1

Tôi sẽ phạt một, tuy nhiên phương pháp 50 dòng không liên quan đến cuộc thảo luận này vì vậy tôi sẽ không thêm nó. Đó sẽ là một bài đăng trên blog. –

+0

Longhorn213: Tôi nghĩ bạn nên xem xét việc đưa ra một phương pháp 50 dòng mà không thể giảm. Việc phân tích những gì có thể được thực hiện có thể cung cấp cho bạn rất nhiều cái nhìn sâu sắc về cách chính lớp đó có thể được tái cấu trúc. Tôi chưa gặp một phương pháp 50 dòng mà không thể bị phá vỡ một cách có ý nghĩa. –

Trả lời

40

Khi lớp học vi phạm SRP, đã đến lúc thiết kế lại.

+0

Tôi yêu SRP. Nice bình luận. –

+0

Câu trả lời hay. ;) – DaDa

+0

Longhorn213: Đúng vậy. Nếu nó thực sự không vi phạm SRP, sau đó phá vỡ nó thành một lớp riêng biệt là phản tác dụng. Tuy nhiên, bạn có thể cấu trúc lại lớp đó thành các phương thức nhỏ hơn. –

1

Tái cấu trúc không phải là quá nhiều về việc giảm số lượng LOC, mặc dù đó là một tác dụng phụ, nhưng cải thiện chất lượng. Đặc biệt, bạn muốn cố gắng tuân theo nguyên tắc DRY (Don't Repeat Yourself) càng nhiều càng tốt, hợp lý.

5

Tôi sẽ không nói rằng có bất kỳ "quy tắc ngón tay cái" nào để tái cấu trúc các lớp học lớn. Đôi khi một lớp thực sự đóng gói rất nhiều logic kinh doanh và nên lớn như nó được. Tuy nhiên, bạn có thể xem xét tự hỏi mình một vài câu hỏi:

  1. (Giả sử bạn đang viết mã hướng đối tượng) Mã của tôi có thực sự hướng đối tượng không? Nghĩa là, nó có tuân theo Nguyên tắc Trách nhiệm Duy nhất không (cảm ơn, Nebakanezer)? Lớp này có phải là lớp trợ giúp không? Nếu vậy, làm thế nào tôi có thể cấu trúc lại các phương thức của nó thành các lớp đối tượng thích hợp hơn?

  2. Tôi có kiến ​​trúc vững chắc không? Đó là, tôi đang sử dụng trừu tượng và thừa kế hơn là tái phát minh ra bánh xe trong mỗi lớp? Các phương thức quá tải có gọi phương thức cơ sở là thích hợp không?

  3. Tôi có thực sự cần tất cả mã này không? Có thể một số logic được bên ngoài bằng cách sử dụng xpath, biểu thức lambda, hoặc một số dạng biểu thức cơ sở dữ liệu điều khiển?

  4. Mã có thể mở rộng không? Có dễ bảo trì không? Nó có được cấu trúc tốt ngay từ đầu hay chúng tôi luôn tạo ra các bản vá nhỏ để cố gắng khắc phục sự cố?

Tôi hy vọng điều này sẽ giúp ích một chút; nó có thể khó khăn để tái cấu trúc các lớp học lớn, nhưng tôi nghĩ nếu bạn bắt đầu xem xét các câu hỏi của tôi, bạn có thể thấy khá nhanh rằng có chỗ để cải thiện mã của bạn ... Tôi biết tôi thường làm.

Đặc biệt nhìn vào # 1 - nó thực sự phổ biến cho mọi người để tạo ra một tấn các lớp học trợ giúp trên khắp nơi, đó là rất chống đối tượng theo định hướng (theo ý kiến ​​của tôi). Đó là một chủ đề khác, nhưng bạn có thể muốn xem những gì thực sự - trong lớp bạn đã làm và những gì có thể/nên ở đâu đó khác.

Theo quy tắc chung, nếu lớp học có thể duy trì và linh hoạt, có thể không cần phải thay đổi. :)

+0

Tôi sẽ thêm, 5. Lớp học của tôi có thể dễ dàng kiểm tra được không. Các lớp lớn cồng kềnh thường khó kiểm tra đơn vị có thể là một dấu hiệu nó làm quá nhiều. – user441521

4

Trong C#, quy tắc chung của tôi cho các lớp học là bất cứ điều gì trên 500 dòng là quá dài. Tôi thực sự thích các phương pháp dưới 10 dòng, và tôi đoán dưới 20 là chấp nhận được.Tôi nghĩ nó thực sự phụ thuộc vào bối cảnh.

1

Quy tắc chung của tôi là dành cho các phương pháp, nhiều hơn lớp học - Nếu tôi không thể thấy toàn bộ phương pháp trên màn hình, nó cần phải được cấu trúc lại. Tất nhiên, áp dụng traditional smells.

2

Refactor bất cứ khi nào bạn có cơ hội để:

  • giới thiệu các mẫu thiết kế thích hợp thay cho mã spaghetti
  • giảm mã phức tạp và gia tăng khả năng đọc
  • loại bỏ mã dư thừa bằng cách giới thiệu một phương pháp gọi đơn
  • mở rộng giao diện người dùng khỏi logic nghiệp vụ

v.v ...

EDIT: Rõ ràng, quyết định cấu trúc lại nên tính đến thời gian tài khoản, tiềm năng pay-off, trách nhiệm khác, vv

8

Đừng để LỘC được chính số liệu của bạn. 50 dòng có vẻ thực sự nhỏ với tôi. Với 50 tập tin dòng, bạn sẽ kết thúc có một số lượng không thân thiện của các tập tin lớp học trong các giải pháp. Năng suất của bạn sẽ được giảm bớt bởi tất cả các điều hướng bạn sẽ làm giữa các tập tin và IDE của bạn sẽ luôn luôn được rải rác với quá nhiều tab. Cá nhân tôi cố gắng tổ chức các lớp học thành các nhóm logic theo không gian tên trước tiên. Trên cơ sở lớp học theo lớp, tôi cố gắng làm cho mã nhỏ hơn và dễ đọc hơn. Đôi khi, các tệp lớp học trở nên lớn. Tôi bắt đầu cảm thấy bị bệnh khi tệp lớp là 2000+ dòng. Bất cứ điều gì ít hơn thế, tôi đối phó với từng trường hợp cụ thể.

+0

Tôi thích lựa chọn từ của bạn - một cảm giác bị bệnh. Haha. Tôi có cảm giác tương tự bất cứ khi nào tôi thấy mọi người thực hiện thuật toán sắp xếp của riêng họ chỉ để sắp xếp một mảng các số. :) –

+1

LOC không phải là điểm chính (+1) nhưng với một IDE tốt, bạn sẽ không bao giờ bị buộc phải biết mã thực sự ở đâu. Bạn hiếm khi nên điều hướng theo tên tệp/số dòng hoặc thậm chí "ở trên blaa trong tệp bất kỳ" – BCS

+0

Đối với Visual Studio, Resharper FTW. Điều hướng dễ dàng với Resharper (CTRL + SHIFT + T). –

1

Tôi có xu hướng xem xét độ phức tạp chu kỳ của từng thành viên thay vì số dòng mã cho toàn bộ lớp.

0

Lớp này có thể là một ứng cử viên cho bài tập tái cấu trúc "trích xuất một đối tượng mà bạn không nghĩ là có"?

Có lẽ, ví dụ, bạn có thể trích xuất đối tượng phương thức cho phép bạn tái cấu trúc một số phương thức 50 dòng thành các thành viên của một lớp được trích xuất? Ngoài ra, việc đóng gói một số phương pháp riêng có chứa logic nghiệp vụ trong một đối tượng mới hợp tác với một đối tượng mới có thể cung cấp một cách mới để sử dụng lại đối tượng này hoặc đối tượng được trích xuất.

Một dòng là đủ để xem xét tái cấu trúc. 40 mỗi 50 dòng phương pháp bắt đầu hét lên "Tôi quá phức tạp, có một đối tượng khác ẩn ở đây" để tai của tôi.

16

Nếu họ đã phá vỡ một trong những điều sau đây ... đó là thời gian để tái cấu trúc. Này, anh chàng bạn đang tìm kiếm RẮN ... screencasts are here

  • S RP: Độc thân Trách nhiệm Nguyên tắc, CÓ NÊN KHÔNG BAO GIỜ LÀ HƠN MỘT LÝ DO CHO MỘT LỚP ĐỂ THAY ĐỔI

  • O CP: Mở Nguyên tắc đóng, PHẦN MỀM ENTITIES (CLASSES, MODULES, FUNCTIONS, ETC.) Nên được mở cho HẠN NHƯNG CLOSED CHO VIỆC SỬA ĐỔI

  • L SP: Liskov Substitution Nguyên tắc, chức năng sử dụng ... tham chiếu đến lớp cơ sở phải có khả năng sử dụng đối tượng của các lớp thừa mà không biết.

  • tôi SP: Giao diện Tách riêng Nguyên tắc, KHÁCH HÀNG KHÔNG NÊN bị buộc phải phụ thuộc vào giao diện mà họ không sử dụng

  • D IP: Dependency Inversion Nguyên tắc,

    A. CAO CẤP MODULES KHÔNG NÊN CHẤP NHẬN CÁC MODULES MỨC ĐỘ CAO. QUÝ VỊ NÊN PHỤ LỤC CẤP TÓM TẮT

    B. TÍNH NĂNG KHÔNG NÊN TIỀN CHI TIẾT. CHI TIẾT nên phụ thuộc vào trừu tượng

Và đó là tất cả, vui vẻ :)

+1

Tôi đã đề xuất SOLID như là một đường cơ sở bản thân mình, nhưng bạn đánh bại tôi với nó. ;) – Tracker1

+11

Capslock của bạn vẫn bật. –

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