2009-03-02 46 views
35

Có cách nào tiêu chuẩn để đặt một tệp C#? Như trong, Fields, sau đó Properties, sau đó Constructors, vv?Cách tốt nhất để bố trí lớp C# là gì?

Đây là những gì tôi thường làm, nhưng tôi tự hỏi nếu có một cách tiêu chuẩn?

  1. lớp lồng nhau hoặc Enums
  2. Fields
  3. Thuộc tính
  4. Sự kiện
  5. Constructors
  6. Phương pháp Công
  7. cá nhân Phương pháp

Do người nhóm lĩnh vực của họ với nhau, hoặc d o họ đặt chúng với các thuộc tính? Hay mọi người không lo lắng về một đơn đặt hàng? Visual Studio dường như làm cho nó khó khăn như vậy để làm.

Sửa: Moved phần khác về ReSharper đây: Make Resharper respect your preference for code order.

+0

Bạn có thể sử dụng XArrange 2012, miễn phí. Tải xuống tại: http://visualstudiogallery.msdn.microsoft.com/43a29648-409a-4225-988c-a64d01eb8386 Phương pháp, phân loại tài sản ... có thể là ... –

Trả lời

51

tôi có xu hướng sử dụng Microsoft StyleCop, trong đó có một trật tự thiết lập theo quy tắc SA1201:

Nguyên nhân Một yếu tố trong mã C# tập tin là ra khỏi trật tự liên quan đến các yếu tố khác trong mã.

Rule Description Vi phạm quy tắc này xảy ra khi các yếu tố mã bên trong một file không tuân theo sơ đồ đặt hàng tiêu chuẩn.

Tuân thủ quy tắc này, các yếu tố tại cấp độ tập tin gốc hoặc trong một không gian tên phải được bố trí trong theo trình tự sau:

  • extern Bí danh Chỉ
  • sử dụng Directive
  • Namespaces
  • Đại biểu
  • Enums
  • Giao diện
  • Struct
  • Lớp

Trong một lớp học, cấu trúc, hoặc giao diện, yếu tố này phải được bố trí trong theo trình tự sau:

  • Fields
  • Constructors
  • Người kết thúc (Destructors)
  • đại biểu
  • Sự kiện
  • Enums
  • Giao diện
  • Thuộc tính
  • Indexer
  • Phương pháp
  • Struct
  • Lớp

Tuân thủ các tiêu chuẩn đặt hàngĐề ándựa trên loại phần tử có thể tăng khả năng đọc và khả năng bảo trì của tệp và khuyến khích sử dụng lại mã.

Khi triển khai giao diện, nó là đôi khi muốn nhóm tất cả thành viên của giao diện bên cạnh một cách khác. Điều này đôi khi sẽ yêu cầu vi phạm quy tắc này, nếu giao diện chứa các thành phần thuộc các loại khác nhau. Vấn đề này có thể được giải quyết thông qua việc sử dụng các lớp học một phần.

  1. Thêm thuộc tính một phần vào lớp, nếu lớp học chưa là một phần.

  2. Thêm một lớp học thứ hai có cùng tên. Có thể đặt mục này trong cùng một tệp, ngay dưới lớp gốc hoặc trong tệp thứ hai.

  3. Di chuyển thừa kế giao diện và tất cả các thành viên của giao diện triển khai vào phần thứ hai của lớp học.

+1

Thật không may StyleCop cũng có các quy tắc đặt hàng bổ sung ảnh hưởng đến cấu trúc này. Ví dụ, nó khuyến cáo rằng tất cả các thành viên tĩnh được nhóm lại với nhau. –

+1

Cá nhân tôi coi đó là một điều tốt ... nhưng tôi chắc chắn có thể hiểu được những lý lẽ chống lại. – chills42

7

Tôi nghĩ rằng không có tốt nhất cách. Có hai điều quan trọng cần xem xét khi nói đến bố cục. Điều quan trọng đầu tiên là tính nhất quán. Chọn cách tiếp cận và đảm bảo rằng toàn bộ nhóm đồng ý và áp dụng bố cục. Thứ hai, nếu lớp học của bạn đủ lớn để bạn tìm kiếm nơi những thuộc tính pesky đó sống (hoặc phải thực hiện các vùng để dễ tìm hơn), thì lớp của bạn có lẽ quá lớn. Hãy xem xét đánh hơi nó, và tái cấu trúc dựa trên những gì bạn ngửi thấy.

Để trả lời câu hỏi reshaper, kiểm tra dưới Loại thành viên Layout trong Tùy chọn (dưới C# nút). Nó không đơn giản, nhưng có thể thay đổi thứ tự bố trí.

+0

Cảm ơn, xin lỗi tôi đã chuyển phần chia sẻ lại của câu hỏi dựa trên JaredPar's Phản hồi. Đăng phần thứ hai của câu trả lời ở đó và tôi sẽ cho bạn một phiếu bầu khác. – Ray

+0

Khu vực cũng giới thiệu một cấu trúc nhất quán (đặc biệt là trong bối cảnh này). –

+0

@scott đã đồng ý, nhưng chúng trở nên cần thiết hơn vì kích thước tệp lớp lớn hơn. Sự tiến triển của badness là: 1) không có khu vực, 2) khu vực, 3) một phần các lớp –

1

Tôi có xu hướng gộp dữ liệu riêng tư và có xu hướng gộp các phương pháp/thuộc tính liên quan trong các nhóm chức năng.

public class Whatever { 
    // private data here 
    int _someVal = kSomeConstant; 

    // constructor(s) 
    public Whatever() { } 

#region FabulousTrick // sometimes regionize it 
    // fabulous trick code 
    private int SupportMethodOne() { } 
    private double SupportMethodTwo() { } 
    public void PerformFabulousTrick(Dog spot) { 
     int herrings = SupportMethodOne(); 
     double pieces = SupportMethodTwo(); 
     // etc 
    } 
#endregion FabulousTrick 
    // etc 
} 
0

Điều gì làm cho hiệu quả hơn. Một số giống như các trường tư nhân bên cạnh các trình truy cập thuộc tính, một số trường giống như các trường bên trên các hàm tạo. Điều lớn nhất có thể giúp là nhóm các yếu tố "thích". Cá nhân tôi thích tập hợp các phương thức riêng tư, tài sản riêng tư, v.v.

Hãy thử một vài thứ, bất cứ điều gì bạn cảm thấy làm cho bạn hiệu quả hơn và giúp bạn duy trì mã của mình.

2

Tôi không tin rằng các vùng nhất thiết phải là dấu hiệu của mã xấu. Nhưng để xác định rằng bạn sẽ phải xem lại những gì bạn có. Như tôi đã nói here đây là cách tôi khu vực mã của tôi.


Enumerations
khai báo
Constructors
Phương pháp
Event Handlers
Thuộc tính

Nhưng điều chủ yếu là giữ cho nó phù hợp và có mục đích.

+2

Tôi thấy (lớn) khu vực chủ yếu là một chỉ số để sử dụng một phần các lớp học trong nhiều tập tin. Một ví dụ phổ biến là đặt tất cả dữ liệu trong một tệp và các thuật toán trong một tệp và thuật toán khác. Điều đó cũng mở đường cho việc chia lớp ra khỏi dòng. –

+1

Tôi thích xem các sự kiện-thuộc tính bộ đôi đến trên phương pháp :) – nawfal

+1

@DavidSchmitt: (Tôi nhận ra bài đăng này là khá cũ, nhưng ..) sẽ không phải là một khu vực lớn (hoặc lớp) được nhiều hơn một chỉ số của mã refactoring? – Paul

0

Mỗi của riêng mình, nhưng tôi có xu hướng làm theo thứ tự mà MSDN giúp sau.

Tôi cũng không thích lồng lớp hoặc enums, thay vào đó tạo các tệp riêng biệt cho chúng, điều này cũng giúp kiểm tra đơn vị viết dễ dàng hơn (vì dễ dàng tìm thấy tệp kiểm tra liên quan khi bạn cần thêm/sửa/refactor kiểm tra).

IMHO đơn đặt hàng không quan trọng vì VS giúp mọi người dễ dàng tìm thấy tất cả thành viên (đặc biệt nếu bạn làm theo một lớp/giao diện/enum cho mỗi phương pháp tệp) và Sandcastle sẽ nhóm chúng nếu bạn muốn xây dựng tài liệu , vì vậy tôi sẽ quan tâm hơn đến việc mang lại cho họ những cái tên đầy ý nghĩa.

+0

Đơn đặt hàng vẫn quan trọng vì nó giới thiệu tính nhất quán. Bởi luôn luôn theo cùng một bố trí trong tất cả các lớp học của bạn, nó trở nên dễ dàng hơn để xác định vị trí mọi thứ. –

+0

Đó là quan điểm của tôi về VS, nếu bạn đang điều hướng qua nguồn thay vì thông qua danh sách Thành viên thả xuống, thì đối với bất kỳ lớp học tầm thường nào, bạn đang lãng phí thời gian. Dấu trang cũng tăng tốc độ chuyển đổi phát triển giữa các thành viên và/hoặc các loại. Đồng ý về tính nhất quán, đó là lý do tại sao tôi làm theo thứ tự MSDN :) – si618

0

Ngày đầu giữ một tập quán của vùng trong các tập tin lớp học của bạn, tôi giữ tất cả các thành phần của một khu vực trong thứ tự chữ cái. Tôi có xu hướng có một chút "bộ nhớ trực quan" khi nói đến mã đọc và nó khiến tôi phát điên khi phải sử dụng menu thả xuống để tìm mã trong một tệp vì nó ở khắp mọi nơi.

0

tôi sử dụng cách bố trí như sau:

sự kiện globals/lĩnh vực tầm cỡ rộng tin/nội tính phương pháp công/bảo vệ tính phương pháp lớp lồng nhau (mặc dù tôi cố gắng tránh những bất cứ khi nào có thể)

Tôi cũng tin tưởng chắc chắn trong 1 mã "điều" (lớp, giao diện hoặc enum) cho mỗi tệp, với tên tệp giống với tên "điều". Có, nó làm cho một dự án lớn hơn nhưng nó làm cho nó infinately dễ dàng hơn để tìm những thứ.

1

Bạn có thể thử Regionerate để trợ giúp việc này. Tôi thực sự thích nó và đó là một lựa chọn Scott Hanselman.

1

Như đã nói, tôi không nghĩ có cách tốt nhất như vậy. Nhưng một số tổ chức không giúp bạn lập trình viên.

Thường xuyên trong một dự án dài, bạn đã dành thời gian đi lên và xuống một hoặc nhiều tệp nguồn đang cố gắng tìm một trong các chức năng của bạn.

Vì vậy, tôi tận dụng các #region rất nhiều để trong loại này cách -

  1. khu vực Sự kiện: Tất cả các tài liệu tham khảo trường hợp lớp này sử dụng (ít nhất là trong lớp một phần đặc biệt này) .

  2. vùng Điều khiển: Tất cả các chức năng tương tác trực tiếp với điều khiển trên biểu mẫu.

  3. khu vực MDI: thiết lập các MDI lên

    Sau đó sẽ có một số để làm với chức năng chứ không phải là giao diện,

  4. khu vực Regex tìm kiếm

tôi loại làm cho nó lên như tôi đi cùng, nhưng sử dụng cùng một khuôn mẫu tôi luôn sử dụng. Tôi phải nói rằng tôi đã được một số lập trình viên kể lại rằng tôi dễ dàng theo dõi và làm việc với những người khác.

Bạn có thể làm hài lòng một nửa số người nửa thời gian và nửa phần còn lại của thời gian và một phần tư thời gian bạn làm cho mọi người nhầm lẫn bao gồm cả chính bạn. Tôi nghĩ Winston Chrchil đã nói vậy.

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