2010-04-06 26 views
10

Tôi thực sự đánh giá cao khả năng xác định các vùng trong mã của bạn, vì nó cải thiện khả năng đọc một cách điên rồ.Bất kỳ ý tưởng quy ước '#region chỉ thị' nào của .NET?

Anyways, tôi muốn có tất cả mọi người sử dụng cùng một ước trong mọi tầng lớp (với thứ tự được xác định trước của tất cả các vùng) như:

  • Private Fields
  • Constructors
  • Lớp Thuộc tính
  • Trình xử lý sự kiện
  • ...

Bạn có bất kỳ đề xuất nào về việc phân chia này có thể trông như thế nào (Những vùng nào có ý nghĩa và họ nên có tên nào) và theo thứ tự nào chúng sẽ được xác định?

+4

Câu hỏi này có thể được hưởng lợi từ việc bị gắn cờ là "Wiki cộng đồng", vì không có câu trả lời đúng ... –

+1

Câu trả lời rất đơn giản: Nhận ra rằng giả định cơ bản của bạn "vì nó cải thiện khả năng đọc" thực sự là một sai lầm. Câu trả lời sau đó trở thành "vô giá trị" và bạn đã đơn giản hóa cuộc sống của chính mình và đặc biệt là tất cả các chaps nghèo nhìn thấy nó sau đó. Khu vực là từ địa ngục. Chúng không thể được tự động thực thi/kiểm tra và do đó chúng là một yếu tố rất lớn trong mã không đọc được. Trong tên của tất cả những điều thánh thiện và đúng trong thế giới này: Do. Không phải. Sử dụng. Họ. –

+0

Điều luôn làm dễ dàng sau đó; Tôi đã làm việc trên rất nhiều ứng dụng doanh nghiệp và hơn thế nữa thì 50% số lớp học có thêm vài trăm dòng mã, từ 20-30% trở lên có 100 dòng mã. Những người ủng hộ khu vực bắt đầu không có khu vực và sau vài năm kết thúc có các lớp học với hàng trăm dòng mã với mã spaghetti, các loại phân tán ở khắp mọi nơi. – akjoshi

Trả lời

36

Quy ước của tôi không được sử dụng chúng.

Nếu bạn thấy lớp học của mình quá lớn đến mức bạn cần phải ẩn các phần lớn của nó qua các khu vực, tôi đề xuất lớp học của bạn quá phức tạp và nên tách rời nhau.

+2

+1, http://www.google.com/search?q=c%23+regions+are+bad&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox- a – mxmissile

+2

OK nhưng hãy giả sử rằng chúng ta có một WinForm đơn giản có khoảng 20 EventHandlers trong mã của nó đằng sau. Thực sự ẩn chúng trong trường hợp này là vô nghĩa? –

+2

@ PaN1C_Showt1Me Vâng, đó là những gì một phần lớp học cho. –

11

Có người đã từng nói rằng có một quy ước như trên:

  • Private Fields
  • Constructors
  • Lớp Thuộc tính
  • Event Handlers
  • vv ...

cũng giống như đặt một bảng nơi tất cả các tấm được với nhau, tất cả các thìa được với nhau, tất cả các dao được với nhau và tất cả các dĩa được với nhau.

Sự cố của tôi đối với vấn đề #region là đặt các phương thức liên quan, định nghĩa sự kiện và thuộc tính cùng nhau trong một khu vực. Tuy nhiên, phải làm điều này ở tất cả sẽ chỉ ra một mùi mã (hoặc là lớp của bạn là quá lớn hoặc không quá nhiều thứ) nhưng đây là một bước đầu tiên tốt để tái cấu trúc nó vào một lớp tốt hơn.

+13

Mà sẽ làm cho rất nhiều ý nghĩa nếu bạn sẽ ăn mã. –

+3

Vâng, tôi hy vọng mã này rất ngon. –

+1

Tuy nhiên ... mặc dù nghi ngờ của tôi về phép ẩn dụ trong loại tranh luận này, tôi phải nói rằng bất cứ ai bạn trích dẫn, họ đều có một điểm tốt! –

1

Bạn có thể quan tâm đến điều này do you say no to c# regions.

Tôi nghĩ rằng miễn là bạn nhất quán trong suốt dự án của bạn, nó không quan trọng quá nhiều thứ tự bạn viết chúng. Cũng rất rất thận trọng khi lạm dụng chúng (do đó liên kết ban đầu!).

Không có gì tệ hơn việc tìm một khu vực nhà xây dựng kín đang ẩn chỉ một dòng mã.

Tôi nghĩ rằng cuối cùng nó thuộc về sở thích cá nhân. Như tôi đã nói, tính nhất quán là chìa khóa!

+1

Tôi cũng muốn phản ứng trên bài viết .. họ nói rằng mã được thiết kế tốt không cần khu vực. Dù sao .. nếu bạn có 5 constructor quá tải - nó sẽ không được dễ dàng hơn cho bất cứ ai mở file.cs để xem chỉ 1 dòng 'Constructors' thay cho 5 nhà xây dựng thực sự? –

+0

Tôi nghĩ rằng trường hợp bạn đề cập đến chắc chắn là một nơi tốt để biện minh cho việc sử dụng của họ. Tôi chỉ cảnh giác với họ khi tôi thấy điều này được thực hiện từ một nơi mà chúng hữu ích vào những nơi khác mà chúng che khuất mã. – RYFN

+0

Vấn đề là họ sẽ không bao giờ bao giờ nhất quán. Tại sao? Bởi vì không có cách nào để thực thi một phong cách nhất định và tất cả các quy ước mà bạn thực hiện liên quan đến #regions đều bị thối từ lúc khởi phát. Vùng là công cụ chỉ được sử dụng bởi nghiệp dư HOẶC tách mã trong các tệp không có tùy chọn khác. –

2

Hãy coi chúng như một dạng nhận xét khác: thông tin bổ sung được trộn lẫn với mã của bạn, có không có kiểm tra chính thức nào được thực hiện trên đó. Do đó nó có khả năng sẽ trôi ra khỏi ngày với mã.

Vì vậy, KHÔNG BAO GIỜ trùng lặp trong các nhận xét hoặc chỉ thị khu vực đã được nêu trong mã.

Chỉ thêm thông tin bổ sung.

Đặc biệt, sử dụng các vùng để phục hồi sự thật là các thành viên nhất định là tài sản, sự kiện, v.v. là hoàn toàn vô nghĩa. Vấn đề thường gặp nhất là bạn tạo một vùng cho "các phương thức riêng", và sau đó bạn chỉnh sửa một trong số chúng để công khai nó. Bây giờ bạn phải di chuyển nó, có nghĩa là trong một khác biệt với phiên bản cũ, sự thay đổi đơn giản là khó khăn hơn nhiều để phân biệt.

3
#region Lotsa boring code and lookup tables 

tôi sử dụng nó để tiết kiệm màn hình bất động sản, không có gì khác :)

+0

Tập trung của bạn thực sự không nên trên màn hình bất động sản như một lập trình viên .. Nó nên được trên cơ cấu thi hành. Các vùng không thêm giá trị nào, nó trừ giá trị –

6

Bất cứ khi nào tôi thấy khu vực tôi nghĩ rằng mã hoặc là tạo ra hoặc có nhu cầu tái bao thanh toán.

Tránh sử dụng chúng và khi bạn cảm thấy cần thiết cho chúng, kiểm tra lại những gì bạn đang làm và cố gắng chia lớp học của bạn thành những lớp nhỏ hơn. Cuối cùng điều này sẽ giúp với khả năng đọc của ứng dụng nhiều hơn sử dụng các vùng sẽ.

1

tôi đã viết đoạn mã vùng của riêng tôi cho VS 2008 mà tôi luôn luôn sử dụng:

<?xml version="1.0" encoding="utf-8" ?> 
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
<CodeSnippet Format="1.0.0"> 
    <Header> 
     <Title>#class region</Title> 
     <Shortcut>#classregion</Shortcut> 
     <Description>Code snippet for #region in classes</Description> 
     <Author>Simon Linder</Author> 
     <SnippetTypes> 
      <SnippetType>Expansion</SnippetType> 
      <SnippetType>SurroundsWith</SnippetType> 
     </SnippetTypes> 
    </Header> 
    <Snippet> 
     <Declarations> 
      <Literal> 
       <ID>name</ID> 
       <ToolTip>Region name</ToolTip> 
       <Default>MyRegion</Default> 
      </Literal> 
     </Declarations> 
     <Code Language="csharp"> 
      <![CDATA[#region Variables 
        $selected$ $end$ 
       #endregion 

      #region Construction/Destruction 
        $selected$ $end$ 
       #endregion 

      #region Properties 
        $selected$ $end$ 
       #endregion 

      #region Public Methods 
        $selected$ $end$ 
       #endregion 

      #region Private/Proteced Methods 
        $selected$ $end$ 
       #endregion]]> 
     </Code> 
    </Snippet> 
</CodeSnippet> 

Như bạn có thể thấy tôi sử dụng các khu vực cho Variables, Construction/Destruction, Properties, PublicPrivate phương pháp. Tôi thường thêm một tiểu vùng khác vào khu vực riêng được gọi là events. Thứ tự các khu vực cũng hoạt động tốt với StyleCop.

+3

Và bên cạnh dòng 'n ++;' bạn có đặt '// increment n' –

+0

Chắc chắn ... Luôn luôn! –

6

Cá nhân tôi không khuyên bạn nên tạo các vùng mã trong quy ước mã của bạn. Lý do chính là rằng vùng ẩn mã, mà có thể dẫn đến các vấn đề như:

Developers
  • có thể bỏ lỡ một số quan trọng một phần của mã nguồn
  • trung bình lượng LỘC trong cùng một tập tin có xu hướng để tăng

Nếu bạn quan tâm đến việc thực thi quy ước kiểu mã trong nhóm của bạn, hãy xem Microsoft StyleCop. Lưu ý rằng công cụ hiện chỉ hoạt động với C#.

3

tôi sử dụng các khu vực sau:

Private Member Variables 
Constructor 
Public Properties 
Private Methods 
Public Methods 
Events 

Lý do là vì tổ chức tốt hơn mã.
Tôi làm việc với các tệp có thể có hơn 2000 dòng mã và rất khó duy trì mã không có vùng.

+3

"Tôi làm việc với các tệp có thể có hơn 2000 dòng mã và rất khó để duy trì mã không có vùng". Đây là một gợi ý. Không làm việc với các tệp có hơn 2000 dòng mã. –

+1

Tôi có thể biết tại sao tôi bị downvote :) –

+2

@Danel Earwicker, tôi làm việc trong một nhóm viết hệ thống thông tin cho các công ty bảo hiểm. Dự án rất phức tạp và phức tạp. Tôi không thể nói "Tôi sẽ không làm việc trên dự án này cho đến khi các tập tin không được dưới 500 dòng mã". :) Có một người quản lý dự án quyết định mọi thứ, không phải tôi. Tôi vừa đưa ra một ví dụ. –

3

Tôi nghĩ rằng không cần thiết ở các khu vực. Chúng không rõ ràng. Nếu bạn cần (suy nghĩ, bạn thực sự cần?) Một mã số tiền trong lớp học của bạn, bạn có thể sử dụng lớp 'một phần' để chia các đơn vị logic lớp.

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