2010-08-05 79 views
14

Có thực hành chung nào khi nói đến cách tổ chức các lớp học của bạn trong C#? Nên chỉ có một lớp chung cho mỗi tệp .cs? Tôi thấy rằng tôi có Form1.cs bao gồm tất cả các lớp có liên quan đến "Form1". Tuy nhiên tôi có thể tạo một tệp có tên là Misc.cs bao gồm tất cả các lớp misc. Không chắc chắn cách nào để đi vì vậy mọi thứ vẫn được tổ chức.Cách tổ chức các lớp học C#

Hoặc tôi có nên tổ chức chúng theo cách cụ thể không? Ví dụ, tôi đang truy cập cơ sở dữ liệu MySQL, vì vậy tôi đang tạo một trình bao bọc MySQL mà tôi sẽ lưu trữ trong MysqlWrapper.cs và đặt tên cho lớp đó để phù hợp với nó. Tôi có nên tạo một .cs mới cho mỗi lớp tôi tạo không?

Hoặc tôi chỉ nên kết hợp những người sử dụng các không gian tên "sử dụng" tương tự như System.Text; bằng System.Windows.Forms; v.v.

Trả lời

15

Chỉnh sửa - câu trả lời này nhằm bổ sung các câu trả lời hay mà những người khác đã đăng.

Mọi người khác dường như đang trả lời các chi tiết cụ thể. Tôi nghĩ bạn sẽ có nhiều câu hỏi thiết kế "thực hành tốt nhất".

Các hướng dẫn chính thức có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-us/library/czefa0ke(VS.71).aspx

Đặc biệt, thâm nhập vào các nguyên tắc đặt tên, và sau đó vào Namespace Naming chủ trương, nguyên tắc đặt tên Class.

Và, như những người khác đã đề cập, vui lòng, mỗi lớp một tệp. Nó làm cho mọi thứ dễ dàng hơn trên các nhà phát triển bảo trì nghèo người sẽ theo bạn.

+4

+1 để biết hướng dẫn chính thức liên kết – onof

+0

Nguyên tắc thiết kế thư viện lớp chỉ xác định nguyên tắc API, nhưng không thực sự chỉ định nguyên tắc tổ chức tệp. –

+1

Tất cả đều là về cách thiết kế API của bạn, nhưng để lại chi tiết riêng tư, triển khai (bao gồm cả cấu trúc tệp) hoàn toàn. –

13

Thông thường, tôi tạo tệp .cs riêng biệt cho mỗi lớp. Ngoài ra, tôi tổ chức các tập tin để phù hợp với không gian tên lớp.

Khi các dự án trở nên lớn hơn nhiều, điều này đơn giản hóa tổ chức, vì bạn luôn biết nơi để tìm một lớp trong dự án. Điều này trở nên quan trọng hơn vì càng có nhiều người đang làm việc trên giải pháp. Một lớp cho mỗi tệp cũng có thể có lợi vì cấu trúc thư mục cung cấp cho bạn cảm giác phức tạp của không gian tên, điều này đã giúp tôi nhận ra khi nào tôi cần chia tách các không gian tên vì chúng quá phức tạp.


tôi thấy rằng tôi có Form1.cs trong đó bao gồm tất cả các lớp học liên quan đến "Form1".

Thay vì tổ chức theo cách này, tôi khuyên bạn nên tách chúng thành các tệp riêng biệt. Nếu bạn có khá một vài lớp liên quan đến một hoạt động cụ thể (được thực hiện bởi, hoặc truy cập qua, Form1), tôi sẽ xem xét việc đưa chúng vào không gian tên riêng của chúng. Tôi cũng khuyên bạn nên đổi tên "Form1" thành một cái gì đó có ý nghĩa hơn, chẳng hạn như "EmployeeForm". Điều này sẽ giúp bạn hiểu và duy trì mã của mình dễ dàng hơn.

+1

Tôi phá quy tắc cho các loại rất nhỏ. Ví dụ, tôi thường tạo một "Enums.class", chứa nhiều loại enum. –

+0

@Brian S: Tôi từng làm điều đó, nhưng bây giờ tôi đang quản lý một dự án quy mô lớn hơn với nhiều nhà phát triển ở nhiều địa điểm, tôi làm một tệp riêng cho mỗi loại, bao gồm cả enums đơn giản. Điều đó đang được nói, tôi không nghĩ rằng có bất cứ điều gì sai trái với việc có "enums.cs" và tương tự, nhưng tôi đã tìm thấy nó đã cứu tôi đau đầu theo thời gian để giữ chúng tách biệt. –

+2

Cá nhân, tôi cảm thấy rằng API càng thay đổi, thì điều quan trọng hơn là tách biệt. Khi bạn có 5 enums trong một tập tin, thật dễ dàng để có một công việc refactor để lại trong một enum tiềm năng không sử dụng, ... –

4

Một lớp cho mỗi tệp thường được chấp nhận. Một số lớp được trải rộng trên nhiều tệp bằng từ khóa "một phần". Cấu trúc thư mục của tôi kết hợp một cách lỏng lẻo với cấu trúc vùng tên.

+0

Trong C#, không gian tên sẽ tự động được nối thêm với tên của thư mục. –

+5

@Steven - ý của bạn là "Trong Visual Studio" thay vì "Trong C#". –

+0

Tôi có? Tôi không nhớ tính năng không gian tên/thư mục lần cuối cùng tôi đã làm VC + +, nhưng sau đó một lần nữa, nó là một dự án nhỏ. Tôi không thể nói một cách hay cách khác về VB, bởi vì tôi cố gắng tránh nó. Chưa đủ F # để biết. Nhưng nếu bạn nói đó là một tính năng VS, thì ok. –

1

Tôi không tuân thủ nghiêm ngặt quy tắc một lớp cho mỗi tệp. Nếu tôi đang đối phó với một lớp rất lớn với rất nhiều mã, tôi có thể cung cấp cho nó tập tin riêng của nó ,. Nói chung, mặc dù, tôi không có một vấn đề với việc giữ nhiều lớp trong cùng một tệp miễn là chúng có liên quan với nhau theo một cách hợp lý. Điều này có xu hướng làm việc tốt nhất với các lớp học nhỏ, nhưng có thể không phải là ý tưởng tốt nhất cho những lớp học lớn.

1

Như một quy tắc chung, mã của bạn dễ bảo trì hơn (dễ đọc hơn cho những người khác) nếu bạn có một loại cho mỗi tệp. (class/struct/enum).

Tuy nhiên, với các lớp học một phần, đôi khi tôi thực sự sẽ chia các lớp lớn thành nhiều tệp, dựa trên các phần chính của chức năng. Nếu một lớp có các kiểu lồng nhau riêng tư, tôi hầu như luôn đặt những kiểu lồng nhau đó trong các tệp riêng biệt.

+0

nếu bạn thực sự có thể chia lớp thành các phần riêng biệt chức năng, có một cơ hội tốt bạn nên thực sự tái cấu trúc lớp vào các lớp riêng biệt . –

1

Tôi thường có một lớp cho mỗi tệp. Ngoại lệ duy nhất cho điều đó có thể là nếu một lớp có một lớp lồng nhau riêng và tôi thường giữ nó trong cùng một tệp thay vì tách nó ra thành một lớp khác bằng cách sử dụng từ khóa một phần. Bằng cách này, tôi tìm thấy những thứ dễ tìm hơn.

0

Một vài nguyên tắc là tất cả các bạn cần:

năng bảo trì: Nó sẽ được dễ dàng để giữ dự án up-to-date và sửa lỗi. Câu hỏi: Liệu có cần nhiều tuổi để tìm một lớp/chức năng nhất định không? Nếu có lỗi, có khả năng xảy ra khi lập trình viên (người không nhất thiết phải là người viết) sẽ trông không?

Tính phức tạp: Cần phải rõ ràng chương trình làm gì. Đôi khi chia nhỏ nó giúp ích. Đôi khi việc giữ mọi thứ lại giúp nhau. Câu hỏi: Một người nào đó sẽ bị nhầm lẫn khi họ nhìn vào nó? Họ sẽ tự hỏi tất cả các bộ phận là gì?

Đó thực sự là cảm giác thông thường. Ngoài ra, lưu ý rằng một số công cụ IDE nhất định sẽ cho phép bạn để mọi thứ trong trạng thái lộn xộn và vẫn có thể tìm được nội dung (ví dụ như trình tìm kiếm tham chiếu). Bạn phải quyết định mức độ lộn xộn nào có thể chấp nhận được, và khi đó là thời gian để tái cấu trúc.

0

Bạn không nên kết hợp các lớp sử dụng các không gian tên "sử dụng" tương tự trong một tệp, bởi vì, nếu bạn phải thay đổi việc triển khai lớp, bạn phải chuyển lớp sang tệp khác.

Tôi giữ một tệp cho mỗi lớp, vì rất hữu ích với hệ thống kiểm soát nguồn. Bên cạnh đó, tôi tránh càng nhiều càng tốt các lớp học một phần. Nếu một lớp quá lớn, có gì đó sai trong thiết kế.

2

Tôi có thể bị lỗi khi nói điều này, nhưng ít nhất trong Visual Studio, nó có thể không quan trọng như một vấn đề như trước đây.

Hầu hết các tệp của tôi chỉ có một lớp, nhưng đối với những thứ như tầm thường và các lớp lưu trữ đơn giản chỉ được sử dụng bởi một lớp khác, tôi chỉ đặt chúng vào cùng một tệp với lớp chính. Nếu không, nếu tôi muốn sử dụng cùng một lớp ở một nơi khác, tôi sẽ chuyển nhiều tệp và cố gắng đoán những tệp nào tôi cần.

Bạn có thể nhấp chuột phải vào số nhận dạng và nhấp vào Chuyển đến định nghĩa để điều hướng đến nó, bạn có thể nhấn ctrl + dấu phẩy để tìm kiếm hoặc bạn có thể sử dụng Chế độ xem lớp.

Tôi làm các tệp .cs liên quan đến nhóm thành các thư mục - điều đó có vẻ quan trọng hơn một chút. Tôi cũng đảm bảo tên thư mục luôn khớp với không gian tên, tức là tôi giữ các không gian tên mặc định mà Visual Studio cung cấp khi bạn tạo một tệp lớp mới trong một thư mục.

+1

Vâng, tôi đồng ý với các tính năng mới của VS 2010 và tiện ích mở rộng Pro Power Tools, điều quan trọng không phải là cách bạn tổ chức các tệp của mình. Quan trọng hơn là kiến ​​trúc hướng đối tượng của các lớp của bạn. – Agzam

+0

Có Tôi đồng ý với điều này – GibboK

0

Tôi cũng đôi khi kết hợp các tệp lớp tương tự vào một nhánh trong VS.

Ví dụ - nếu bạn có 3 file: Message.xaml, Message.xaml.cs, MessageButton.cs, MessageImage.cs, MessageResult.cs.

Message.xaml.cs đã được hiển thị bên trong phân cấp của tệp đầu tiên.Bạn cũng có thể thêm người khác, chỉ cần chỉnh sửa tập tin của dự án bằng notepad. Bạn chỉ cần thêm

<DependentUpon> </DependentUpon> 

thẻ khi cần.

Tôi không biết nếu có bất kỳ phần mở rộng nào để VS thực hiện điều đó theo cách dễ dàng hơn nhiều hay không.

Và đây là một điều. Mặc dù điều đó sẽ giúp bạn sắp xếp các tệp của mình trong một dự án, bạn sẽ không thể đổi tên lớp của bạn chỉ bằng cách nhấp hai lần vào tên tệp trong VS.

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