it-swarm-vi.com

Là #regions một antipotype hoặc mùi mã?

C # cho phép sử dụng #region/#endregion từ khóa để làm cho các khu vực mã có thể thu gọn trong trình chỉnh sửa. Bất cứ khi nào tôi làm điều này mặc dù tôi làm điều đó để ẩn các đoạn mã lớn có thể được tái cấu trúc thành các lớp hoặc phương thức khác. Ví dụ, tôi đã thấy các phương thức chứa 500 dòng mã với 3 hoặc 4 vùng chỉ để làm cho nó có thể quản lý được.

Vì vậy, việc sử dụng hợp lý các khu vực là một dấu hiệu của rắc rối? Nó dường như là như vậy với tôi.

274
Craig

Mùi mã là một triệu chứng chỉ ra rằng có một vấn đề trong thiết kế sẽ có khả năng làm tăng số lượng lỗi: đây không phải là trường hợp của các vùng, nhưng các vùng có thể góp phần tạo ra mùi mã, như các phương thức dài.

Từ:

Một mô hình chống (hoặc phản mẫu) là một mô hình được sử dụng trong các hoạt động xã hội hoặc kinh doanh hoặc công nghệ phần mềm có thể được sử dụng phổ biến nhưng không hiệu quả và/hoặc phản tác dụng trong thực tế

các vùng chống mẫu. Họ yêu cầu nhiều công việc hơn mà không làm tăng chất lượng hoặc khả năng đọc mã, điều này không làm giảm số lượng lỗi và điều này chỉ có thể làm cho mã phức tạp hơn để tái cấu trúc.

Không sử dụng các vùng bên trong các phương thức; tái cấu trúc thay thế

Phương thức phải ngắn . Nếu chỉ có mười dòng trong một phương thức, có lẽ bạn sẽ không sử dụng các vùng để ẩn năm trong số chúng khi làm việc trên năm dòng khác.

Ngoài ra, mỗi phương thức phải thực hiện một và một điều duy nhất . Mặt khác, các khu vực được dự định phân tách những thứ khác nhau . Nếu phương thức của bạn thực hiện A, thì B, việc tạo hai vùng là hợp lý, nhưng đây là một cách tiếp cận sai; thay vào đó, bạn nên cấu trúc lại phương thức thành hai phương thức riêng biệt.

Sử dụng các vùng trong trường hợp này cũng có thể làm cho việc tái cấu trúc trở nên khó khăn hơn. Hãy tưởng tượng bạn có:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    if (!verification)
    {
        throw new DataCorruptedException();
    }

    Do(data);
    DoSomethingElse(data);
    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine();
    auditEngine.Submit(data);
    #endregion
}

Thu gọn vùng đầu tiên để tập trung vào vùng thứ hai không chỉ có rủi ro: chúng ta có thể dễ dàng quên đi ngoại lệ dừng dòng chảy (có thể có một mệnh đề bảo vệ với return, điều này thậm chí còn khó phát hiện hơn), nhưng cũng sẽ có vấn đề nếu mã được cấu trúc lại theo cách này:

private void DoSomething()
{
    var data = LoadData();
    #region Work with database
    var verification = VerifySomething();
    var info = DoSomethingElse(data);

    if (verification)
    {
        Do(data);
    }

    #endregion

    #region Audit
    var auditEngine = InitializeAuditEngine(info);
    auditEngine.Submit(
        verification ? new AcceptedDataAudit(data) : new CorruptedDataAudit(data));
    #endregion
}

Bây giờ, các khu vực không có ý nghĩa và bạn không thể đọc và hiểu mã trong khu vực thứ hai mà không cần nhìn vào mã trong khu vực đầu tiên.

Một trường hợp khác đôi khi tôi thấy là trường hợp này:

public void DoSomething(string a, int b)
{
    #region Validation of arguments
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }
    #endregion

    #region Do real work
    ...
    #endregion
}

Thật hấp dẫn khi sử dụng các vùng khi xác thực đối số bắt đầu trải rộng hàng chục LỘC, nhưng có một cách tốt hơn để giải quyết vấn đề này: đó là cách được sử dụng bởi mã nguồn .NET Framework:

public void DoSomething(string a, int b)
{
    if (a == null)
    {
        throw new ArgumentNullException("a");
    }

    if (b <= 0)
    {
        throw new ArgumentOutOfScopeException("b", ...);
    }

    InternalDoSomething(a, b);
}

private void InternalDoSomething(string a, int b)
{
    ...
}

Không sử dụng các phương thức bên ngoài để nhóm

  • Một số người sử dụng chúng để nhóm các trường, thuộc tính, v.v. Cách tiếp cận này là sai: nếu mã của bạn tuân thủ StyleCop, thì các trường, thuộc tính, riêng tư phương thức, hàm tạo, v.v ... đã được nhóm lại với nhau và dễ tìm. Nếu không, đã đến lúc bắt đầu suy nghĩ về việc áp dụng các quy tắc đảm bảo tính đồng nhất trên cơ sở mã của bạn.

  • Những người khác sử dụng các vùng để ẩn rất nhiều thực thể tương tự . Ví dụ: khi bạn có một lớp với hàng trăm trường (tạo ra ít nhất 500 dòng mã nếu bạn đếm các bình luận và khoảng trắng), bạn có thể muốn đặt các trường đó vào một vùng, thu gọn nó và quên chúng đi. Một lần nữa, bạn đang làm sai: với rất nhiều trường trong một lớp, bạn nên suy nghĩ tốt hơn về việc sử dụng tính kế thừa hoặc cắt đối tượng thành nhiều đối tượng.

  • Cuối cùng, một số người bị cám dỗ sử dụng các vùng để nhóm các thứ liên quan với nhau : một sự kiện với đại biểu của nó hoặc một phương thức liên quan đến IO với các phương thức khác liên quan đến IO, v.v. Trong trường hợp đầu tiên, nó trở thành một mớ hỗn độn khó bảo trì, đọc và hiểu. Trong trường hợp thứ hai, thiết kế tốt hơn có lẽ sẽ tạo ra một vài lớp.

Có một sử dụng tốt cho các khu vực?

Số. Có một cách sử dụng kế thừa: mã được tạo. Tuy nhiên, các công cụ tạo mã chỉ phải sử dụng các lớp một phần thay thế. Nếu C # có các vùng hỗ trợ, thì chủ yếu là vì sử dụng di sản này và vì hiện tại có quá nhiều người đã sử dụng các vùng trong mã của họ, nên không thể xóa chúng mà không phá vỡ các cơ sở mã hiện có.

Hãy suy nghĩ về nó như là về goto. Thực tế là ngôn ngữ hoặc IDE hỗ trợ một tính năng không có nghĩa là nó nên được sử dụng hàng ngày. Quy tắc StyleCop SA1124 rõ ràng: bạn không nên sử dụng các vùng. Không bao giờ.

Ví dụ

Tôi hiện đang thực hiện đánh giá mã về mã đồng nghiệp của mình. Codebase chứa rất nhiều vùng và thực sự là một ví dụ hoàn hảo về cả cách không sử dụng các vùng và tại sao các vùng dẫn đến mã xấu. Dưới đây là một số ví dụ:

Quái vật 4 000 LỘC:

Gần đây tôi đã đọc ở đâu đó trên Lập trình viên. Khi một tệp chứa quá nhiều usings (sau khi thực hiện lệnh "Xóa sử dụng không sử dụng"), đó là một dấu hiệu tốt cho thấy lớp bên trong tệp này đang hoạt động quá nhiều. Điều tương tự áp dụng cho kích thước của chính tập tin.

Trong khi xem xét mã, tôi đã tìm thấy một tệp 4.000 LỘC. Dường như tác giả của mã này chỉ đơn giản là sao chép cùng một phương thức 15 dòng hàng trăm lần, thay đổi một chút tên của các biến và phương thức được gọi. Một regex đơn giản được phép cắt tập tin từ 4.000 LỘC thành 500 LỘC, chỉ bằng cách thêm một vài khái quát; Tôi khá chắc chắn rằng với một phép tái cấu trúc thông minh hơn, lớp này có thể được giảm xuống còn vài chục dòng.

Bằng cách sử dụng các vùng, tác giả khuyến khích bản thân bỏ qua thực tế là mã không thể duy trì và viết kém, và sao chép mã nhiều thay vì cấu trúc lại mã.

Khu vực Do Do, một khu vực Do Biêu:

Một ví dụ tuyệt vời khác là một phương thức khởi tạo quái vật chỉ đơn giản là thực hiện nhiệm vụ 1, sau đó là nhiệm vụ 2, sau đó là nhiệm vụ 3, v.v. Có năm hoặc sáu nhiệm vụ hoàn toàn độc lập, mỗi nhiệm vụ khởi tạo một thứ gì đó trong lớp container. Tất cả các nhiệm vụ đó được nhóm thành một phương thức và được nhóm thành các khu vực.

Điều này có một lợi thế:

  • Phương pháp này khá rõ ràng để hiểu bằng cách nhìn vào tên khu vực. Điều này đang được nói, cùng một phương pháp một khi được tái cấu trúc sẽ rõ ràng như ban đầu.

Các vấn đề, mặt khác, là nhiều:

  • Không rõ ràng nếu có sự phụ thuộc giữa các khu vực. Hy vọng rằng, không có việc sử dụng lại các biến; nếu không, việc bảo trì có thể là một cơn ác mộng hơn nữa.

  • Phương pháp này gần như không thể kiểm tra. Làm thế nào bạn có thể dễ dàng biết nếu phương pháp thực hiện hai mươi điều một lần có đúng không?

Vùng trường, vùng thuộc tính, vùng xây dựng:

Mã được xem xét cũng chứa rất nhiều vùng nhóm tất cả các trường lại với nhau, tất cả các thuộc tính cùng nhau, v.v ... Điều này có một vấn đề rõ ràng: tăng trưởng mã nguồn.

Khi bạn mở một tệp và thấy một danh sách lớn các trường, bạn sẽ có xu hướng cấu trúc lại lớp trước, sau đó làm việc với mã. Với các vùng, bạn có thói quen thu gọn đồ đạc và quên nó đi.

Một vấn đề khác là nếu bạn làm điều đó ở mọi nơi, bạn sẽ thấy mình tạo ra các khu vực một khối, điều này không có ý nghĩa gì. Đây thực sự là trường hợp trong mã tôi đã xem xét, nơi có rất nhiều #region Constructor chứa một hàm tạo.

Cuối cùng, các trường, thuộc tính, hàm tạo, v.v ... nên đã có theo thứ tự . Nếu chúng là và chúng khớp với các quy ước (hằng số bắt đầu bằng chữ in hoa, v.v.), thì đã rõ ràng về loại yếu tố dừng và bắt đầu khác, vì vậy bạn không cần phải tạo vùng rõ ràng cho điều đó.

291
Arseni Mourzenko

Thật khó tin với tôi có bao nhiêu người ghét một cách say mê!

Tôi hoàn toàn đồng ý với rất nhiều ý kiến ​​phản đối của họ: Đẩy mã vào một #region để ẩn nó khỏi tầm nhìn là một điều xấu. Chia một lớp thành #regions khi cần tái cấu trúc thành các lớp riêng biệt rõ ràng là một sai lầm. Sử dụng một #region để nhúng thông tin ngữ nghĩa dư thừa, tốt, dự phòng.

Nhưng không có điều nào trong số đó có nghĩa là có bất cứ điều gì vốn đã sai khi sử dụng các vùng trong mã của bạn! Tôi chỉ có thể giả định rằng hầu hết sự phản đối của mọi người đều xuất phát từ việc làm việc trong các nhóm mà những người khác có xu hướng sử dụng IDE tính năng như thế này không chính xác. Tôi có sự thoải mái khi làm việc chính và tôi đánh giá cao theo cách mà các khu vực đã giúp tổ chức quy trình làm việc của tôi. Có lẽ đó là chứng rối loạn ám ảnh cưỡng chế của tôi, nhưng tôi không muốn nhìn thấy một loạt mã trên màn hình của mình, bất kể nó có thể được viết gọn gàng và thanh lịch như thế nào. vào các vùng logic cho phép tôi thu gọn mã mà tôi không quan tâm để làm việc với mã mà tôi làm quan tâm. Tôi không bỏ qua mã được viết kém, sẽ không có ý nghĩa gì để tái cấu trúc nó nhiều hơn nó, và tổ chức "meta" bổ sung là mô tả, thay vì vô nghĩa.

Bây giờ tôi đã dành nhiều thời gian hơn để làm việc trong C++, lập trình trực tiếp hơn cho API Windows, tôi thấy mình muốn rằng sự hỗ trợ cho các vùng cũng tốt như đối với C #. Bạn có thể lập luận rằng việc sử dụng thư viện GUI thay thế sẽ giúp mã của tôi đơn giản hơn hoặc rõ ràng hơn, do đó loại bỏ sự cần thiết phải loại bỏ tiếng ồn mã không liên quan khỏi màn hình, nhưng tôi có những lý do khác để không muốn làm điều đó. Tôi đủ thành thạo với bàn phím của mình và IDE rằng việc mở rộng/thu gọn mã được chia thành các vùng chỉ mất chưa đến một phần của giây. Thời gian tôi tiết kiệm trong trí não, cố gắng hạn chế sự tập trung có ý thức của tôi chỉ với mã mà tôi hiện đang làm việc, có giá trị hơn nó. Tất cả thuộc về một lớp/tệp duy nhất, nhưng tất cả không thuộc về màn hình của tôi cùng một lúc.

Vấn đề là sử dụng #regions để phân tách và phân chia hợp lý mã của bạn không phải là điều xấu cần tránh bằng mọi giá. Như Ed chỉ ra, nó không phải là "mùi mã". Nếu mã của bạn có mùi, bạn có thể chắc chắn rằng nó không đến từ các khu vực, mà thay vào đó là từ bất kỳ mã nào bạn đã cố gắng chôn vùi trong các khu vực đó. Nếu một tính năng giúp bạn có tổ chức hơn hoặc viết mã tốt hơn, thì tôi nói sử dụng nó. Nếu nó trở thành một trở ngại, hoặc bạn thấy mình sử dụng nó không đúng cách, thì dừng lại sử dụng nó. Nếu điều tồi tệ nhất đến tồi tệ nhất và bạn buộc phải làm việc trong một nhóm với những người sử dụng nó, thì hãy ghi nhớ phím tắt để tắt mã phác thảo: Ctrl+MCtrl+P. Và ngừng phàn nàn. Đôi khi tôi có cảm giác đây là một cách khác mà những người muốn được coi là lập trình viên "chân chính", "khó tính" thích thử và chứng tỏ bản thân. Bạn không nên tránh các khu vực hơn là bạn đang tránh tô màu cú pháp. Nó không làm cho bạn trở thành một nhà phát triển máy móc hơn.

Tất cả điều đó đang được nói, các khu vực trong một phương thức chỉ là vô nghĩa. Bất cứ khi nào bạn thấy mình muốn làm điều đó, bạn nên tái cấu trúc thành một phương pháp riêng biệt. Không có lời bào chữa.

115
Cody Gray

Trước hết, tôi không thể chịu được thuật ngữ "mùi mã" nữa. Nó được sử dụng quá thường xuyên và phần lớn thời gian được ném ra bởi những người không thể nhận ra mã tốt nếu nó cắn chúng. Dù sao ...

Cá nhân tôi không thích sử dụng nhiều vùng. Điều này làm cho việc lấy mã trở nên khó khăn hơn và mã là điều tôi quan tâm. Tôi thích các vùng khi tôi có một đoạn mã lớn mà không cần phải chạm thường xuyên. Bên cạnh đó, họ dường như cản trở tôi và các khu vực như "Phương pháp riêng tư", "Phương pháp công cộng", v.v ... chỉ khiến tôi phát điên. Chúng giống như những bình luận của sự đa dạng i++ //increment i.

Tôi cũng sẽ nói thêm rằng việc sử dụng các vùng thực sự không thể là một "chống mẫu" vì thuật ngữ đó thường được sử dụng để mô tả các mẫu thiết kế/logic chương trình, không phải là bố cục của trình soạn thảo văn bản. Đây là chủ quan; Sử dụng những gì làm việc cho bạn. Bạn sẽ không bao giờ kết thúc với một chương trình không thể nhầm lẫn do bạn sử dụng quá mức các vùng, đó là những gì mà các mô hình chống lại tất cả là về. :)

70
Ed S.

Có vùng là một mùi mã!

Tôi rất vui khi thấy các khu vực bị xóa hoàn toàn khỏi trình biên dịch. Mỗi nhà phát triển đưa ra kế hoạch chải chuốt vô nghĩa của riêng mình sẽ không bao giờ có giá trị đối với một lập trình viên khác. Tôi có tất cả mọi thứ để làm với các lập trình viên muốn trang trí và làm đẹp cho em bé của họ, không có gì để làm với bất kỳ giá trị thực sự.

Bạn có thể nghĩ về một ví dụ mà bạn mặc dù "trời ạ, tôi ước đồng nghiệp của tôi đã sử dụng một số vùng ở đây!"?

Mặc dù tôi có thể định cấu hình IDE để tự động mở rộng tất cả các vùng nhưng chúng vẫn gây nhức mắt và làm mất khả năng đọc mã thực.

Tôi thực sự quan tâm ít hơn nếu tất cả các phương thức công khai của tôi được kết hợp với nhau hay không. Xin chúc mừng bạn biết sự khác biệt giữa một khai báo biến và khởi tạo, không cần hiển thị nó trong mã!

Chải chuốt vô giá trị!

Ngoài ra, nếu tệp của bạn cần và 'kiến trúc thông tin' thông qua việc sử dụng các vùng bạn có thể muốn chống lại vấn đề cốt lõi: Lớp của bạn quá lớn! Chia nó thành các phần nhỏ có lợi hơn nhiều và khi được thực hiện đúng cách sẽ thêm ngữ nghĩa/khả năng đọc thực sự.

23
Joppe

Cá nhân tôi sử dụng các vùng như một cách để nhóm các loại phương thức hoặc các phần mã khác nhau lại với nhau.

Vì vậy, một tệp mã có thể trông như thế này khi mở nó:

  • Thuộc tính công cộng
  • Người xây dựng
  • Phương thức lưu
  • Chỉnh sửa phương pháp
  • Phương pháp trợ giúp riêng

Tôi không đặt các vùng bên trong các phương thức. IMHO đó là một dấu hiệu của mùi mã. Có lần tôi đã bắt gặp một phương pháp dài hơn 1200 dòng và có 5 vùng khác nhau trong đó. Đó là một cảnh tượng đáng sợ!

Nếu bạn đang sử dụng nó như một cách để tổ chức mã của mình theo cách sẽ giúp việc tìm kiếm mọi thứ nhanh hơn cho các nhà phát triển khác, tôi không nghĩ đó là dấu hiệu của sự cố. Nếu bạn đang sử dụng nó để ẩn các dòng mã bên trong một phương thức, tôi sẽ nói rằng đã đến lúc phải suy nghĩ lại về phương thức đó.

15
Tyanna

Sử dụng #region khối để làm cho một lớp rất lớn có thể đọc được thường là dấu hiệu vi phạm Nguyên tắc Trách nhiệm duy nhất. Nếu chúng được sử dụng để hành vi nhóm, thì đó cũng là có thể rằng lớp đang làm quá nhiều (một lần nữa vi phạm SRP).

Bám sát dòng suy nghĩ "mùi mã", #region khối không mã tự ngửi mà thay vào đó chúng là "Febreze cho mã" hơn ở chỗ chúng cố gắng che giấu mùi. Mặc dù trước đây tôi đã sử dụng chúng rất nhiều, nhưng khi bạn bắt đầu tái cấu trúc, bạn bắt đầu thấy ít hơn vì cuối cùng chúng không che giấu nhiều.

10
Austin Salonen

Từ khóa ở đây là "đúng đắn". Thật khó để tưởng tượng một trường hợp đặt một khu vực trong một phương thức là hợp lý; đó là tất cả quá có khả năng là ẩn mã và lười biếng. Tuy nhiên, có thể có những lý do chính đáng để có một vài vùng ở đây và ở đó trong mã của một người.

Nếu có rất nhiều khu vực, tôi nghĩ đó là mùi mã. Các khu vực thường là một gợi ý tại một nơi có thể để tái cấu trúc trong tương lai. Rất nhiều khu vực có nghĩa là ai đó thực sự không bao giờ thực hiện gợi ý.

Được sử dụng một cách thận trọng, chúng đưa ra một nền tảng tốt giữa cấu trúc của một lớp duy nhất với nhiều phương thức và cấu trúc của nhiều lớp chỉ với một vài phương thức trong mỗi lớp. Chúng rất hữu ích khi một lớp bắt đầu tiến gần đến điểm mà nó sẽ được tái cấu trúc thành nhiều lớp, nhưng vẫn chưa hoàn thành. Bằng cách nhóm các phương thức liên quan lại với nhau, sau này tôi dễ dàng trích xuất một tập hợp các phương thức liên quan vào lớp riêng của chúng nếu chúng tiếp tục tăng số lượng. Ví dụ: nếu tôi có một lớp đang tiếp cận 500 dòng mã, thì tập hợp các phương thức sử dụng tổng số 200 dòng mã được tập hợp lại trong một vùng có lẽ là một phần tốt để tái cấu trúc bằng cách nào đó - và khu vực khác có 100 dòng mã trong đó phương pháp cũng có thể là một mục tiêu tốt.

Một cách khác mà tôi muốn sử dụng các vùng là giảm một trong những tác động tiêu cực của việc tái cấu trúc một phương thức lớn: Rất nhiều phương thức nhỏ, ngắn gọn, dễ sử dụng mà người đọc phải cuộn qua để đến một phương pháp khác không liên quan. Một vùng có thể là một cách hay để gói gọn một phương thức và các trợ giúp của nó cho các độc giả, vì vậy ai đó đang làm việc với một khía cạnh khác của lớp có thể thu gọn chúng và nhanh chóng loại bỏ phần mã đó. Tất nhiên, điều này chỉ hoạt động nếu các khu vực của bạn thực sự được tổ chức tốt và về cơ bản được sử dụng như một cách khác để ghi lại mã của bạn.

Nói chung, tôi thấy các vùng giúp tôi giữ bản thân ngăn nắp, giúp "ghi lại" mã của mình và giúp tôi bắt các địa điểm để tái cấu trúc sớm hơn nhiều so với việc tôi không sử dụng các vùng.

5
Ethel Evans

Tôi chủ yếu sử dụng các vùng cho các lớp máy chủ CRUD để tổ chức các loại hoạt động khác nhau. Thậm chí sau đó, tôi có thể vui vẻ đi mà không có họ.

Nếu được sử dụng rộng rãi, nó sẽ giương cờ đỏ. Tôi sẽ đề phòng các lớp học có quá nhiều trách nhiệm.

Theo kinh nghiệm của tôi, một phương thức với hàng trăm dòng mã chắc chắn là một mùi.

4
TaylorOtwell

Quy tắc ngón tay cái của tôi là: Nếu bạn có nhiều hơn 5 vùng trong một tệp thì đó là mùi mã

Tức là, có thể tốt khi phân định trường, phương thức, thuộc tính và hàm tạo, nhưng nếu bạn bắt đầu bao bọc mọi phương thức khác trong một khu vực thì điều đó là sai.

.. và vâng, tôi đã tham gia rất nhiều dự án trong trường hợp đó, thường là do các tiêu chuẩn mã hóa kém, tạo mã hoặc cả hai. Nó trở nên cũ kỹ nhanh chóng khi phải chuyển đổi tất cả các phác thảo trong phòng thu trực quan để có được một cái nhìn tổng quan về mã.

4
Homde

KHU CÓ VIỆC SỬ DỤNG

Trước đây, tôi đã sử dụng chúng cho các sự kiện giao diện "mã hóa tay" cho các ứng dụng Windows dạng.

Tuy nhiên, trong công việc của tôi, chúng tôi sử dụng một trình tạo mã để xử lý SQL và nó tự động sử dụng các vùng để sắp xếp các loại phương thức chọn, cập nhật, xóa, v.v.

Vì vậy, trong khi tôi không sử dụng chúng thường xuyên, chúng hoàn toàn ổn để loại bỏ các đoạn mã lớn.

4
Ken

Nếu bạn có các vùng TRONG mã thì bạn chắc chắn có vấn đề (chặn trường hợp mã được tạo.) Đặt các vùng trong mã về cơ bản là nói "tái cấu trúc mã này."

Tuy nhiên, có những trường hợp khác. Một điều mà tôi nghĩ rằng tôi đã làm một lúc trước: Một cái bàn có vài ngàn vật phẩm được tính toán trước trong đó. Đó là một mô tả về hình học, thiếu một lỗi trong bảng sẽ không bao giờ có dịp để xem xét nó. Chắc chắn, tôi có thể đã lấy được dữ liệu từ một tài nguyên hoặc tương tự nhưng điều đó sẽ ngăn cản việc sử dụng trình biên dịch để giúp dễ đọc.

4
Loren Pechtel

Tôi sẽ nói đó là một "mùi mã."

Chống mẫu nói chung là các vấn đề cấu trúc cơ bản trong một phần mềm, trong khi các vùng, tự chúng chỉ gây ra một hành vi đáng ghét trong một trình soạn thảo. Sử dụng các vùng không thực sự xấu, nhưng sử dụng chúng rất nhiều, đặc biệt là để ẩn các đoạn mã có thể cho thấy có những vấn đề khác, độc lập và lớn hơn đang diễn ra ở nơi khác.

3
whatsisname

Trong một dự án gần đây, có một phương thức 1700 dòng với một số vùng được nhúng trong đó. Điều thú vị là các khu vực đã giải phóng các hành động khác biệt đang được thực hiện trong phương thức. Tôi đã có thể thực hiện một công cụ tái cấu trúc -> trích xuất trên từng vùng mà không ảnh hưởng đến chức năng của mã.

Nói chung, các khu vực được sử dụng để ẩn mã tấm nồi hơi là hữu ích. Tôi sẽ khuyên bạn không nên sử dụng các vùng để ẩn các thuộc tính, các trường và những thứ tương tự bởi vì nếu chúng quá khó sử dụng khi làm việc trong lớp, có lẽ đó là dấu hiệu cho thấy lớp học sẽ bị phá vỡ thêm. Nhưng như một quy tắc cứng, nếu bạn đặt một vùng trong một phương thức, có lẽ bạn nên trích xuất một phương thức khác giải thích những gì đang xảy ra hơn là bọc khối đó trong một vùng.

3
Michael Brown

Các khu vực có thể được sử dụng trong mã có chất lượng tốt? Có lẽ. Tôi cá là họ, trong nhiều trường hợp. Tuy nhiên, trải nghiệm cá nhân của tôi khiến tôi rất nghi ngờ - tôi đã thấy các khu vực hầu như chỉ bị lạm dụng. Tôi nói rằng tôi đã chán nản, nhưng vẫn lạc quan.

Tôi gần như có thể phân chia vùng sử dụng mã mà tôi đã thấy cho đến nay thành ba loại:

  • Mã được bao thanh toán kém: Hầu hết các mã mà tôi thấy sử dụng các vùng làm công cụ bao thanh toán của người nghèo. Ví dụ, một lớp đã phát triển đến mức có ý nghĩa để chuyên môn hóa nó cho các mục đích khác nhau có thể được chia thành các khu vực riêng biệt, mỗi khu vực cho mỗi mục đích.

  • Mã được viết bằng các thư viện sai và đôi khi là ngôn ngữ sai cho miền vấn đề Thông thường, khi lập trình viên không sử dụng đúng bộ thư viện cho miền có vấn đề, bạn sẽ thấy mã trở nên dài dòng vô cùng - với rất nhiều chức năng trợ giúp nhỏ cái mà thực sự không thuộc về (có lẽ chúng thuộc về thư viện của riêng họ).

  • Mã được viết bởi sinh viên hoặc sinh viên tốt nghiệp gần đây. Một số chương trình và khóa học dường như cố gắng và khắc sâu sinh viên với việc sử dụng các khu vực cho tất cả các mục đích lạ. Bạn sẽ thấy các khu vực xả rác mã nguồn đến điểm mà tỷ lệ thẻ khu vực so với các dòng mã nằm trong phạm vi 1: 5 hoặc tệ hơn.

3
blueberryfields

Tôi chỉ sử dụng các vùng cho một thứ (ít nhất là tôi không thể nghĩ đến những nơi khác tôi sử dụng chúng): để nhóm các bài kiểm tra đơn vị cho một phương pháp.

Tôi thường có một lớp kiểm tra cho mỗi lớp và sau đó nhóm các bài kiểm tra đơn vị cho mỗi phương thức bằng cách sử dụng các vùng có tên của phương thức. Không chắc đó có phải là mùi mã hay gì không, nhưng vì ý tưởng cơ bản là các thử nghiệm đơn vị không cần thay đổi trừ khi chúng bị hỏng vì có gì đó trong mã thay đổi, giúp tôi dễ dàng tìm thấy tất cả các thử nghiệm cho một phương pháp cụ thể khá nhanh chóng.

Tôi có thể đã sử dụng các vùng để tổ chức mã trong quá khứ, nhưng tôi không thể nhớ lần cuối cùng tôi đã làm điều đó. Tôi dính vào các khu vực của tôi trong các lớp kiểm tra đơn vị mặc dù.

3
Anne Schuessler

Tôi tin rằng đó là một mô hình chống và thẳng thắn nghĩ rằng chúng nên được loại bỏ. Nhưng nếu bạn không may làm việc ở một nơi mà họ là một Visual Studio tiêu chuẩn cung cấp một công cụ tuyệt vời để giảm thiểu số lượng bạn muốn nôn mỗi khi bạn nhìn thấy một khu vực Tôi ghét #Regions

Plugin này sẽ tối đa kích thước phông chữ của các vùng thực sự nhỏ. Chúng cũng sẽ được mở rộng để bạn không phải nhấn ctr + m + l để mở tất cả các vùng. Nó không khắc phục được dạng ung thư mã này nhưng nó có thể chịu được.

2
DeadlyChambers

Các khu vực là một ý tưởng tổ chức tiện lợi, nhưng không tính đến một số xu hướng của nhà phát triển muốn phân loại mọi thứ và nói chung là không cần thiết theo hầu hết các ngày hiện đại OOP ... chúng là một "mùi" , theo nghĩa là việc sử dụng chúng thường chỉ ra rằng lớp/phương thức của bạn quá lớn và nên được tái cấu trúc, vì bạn có khả năng vi phạm "S" của SOLID nguyên tắc ... nhưng giống như bất kỳ ngửi, nó không nhất thiết có nghĩa là một cái gì đó đang xấu đi.

Các khu vực phục vụ nhiều mục đích hơn trong mã chức năng thay vì mã hướng đối tượng, IMO, nơi bạn có các chức năng dài của dữ liệu tuần tự có ý nghĩa để chia tay, nhưng đã có lần tôi đã sử dụng chúng trong c # và hầu như chúng luôn luôn tập trung vào mã bạn không cần/muốn xem. Đối với tôi, đây thường là các hằng chuỗi SQL thô trong cơ sở mã được sử dụng cho NPoco hoặc các biến thể của nó. Trừ khi bạn thực sự quan tâm làm thế nào dữ liệu đến để điền vào đối tượng POCO thông qua ORM của bạn, những thứ này hoàn toàn vô nghĩa khi nhìn vào ... và nếu bạn quan tâm, thì, hãy mở rộng khu vực và BAM! Hơn 150 dòng của một số truy vấn SQL phức tạp cho niềm vui xem của bạn.

0
Jeremy Holovacs

Tôi sử dụng các vùng để chứa từng kết hợp tầm nhìn và loại thành viên. Vì vậy, tất cả các chức năng riêng tư đi vào một khu vực, vv.

Lý do tôi làm điều này không phải vì vậy tôi có thể gấp mã. Đó là bởi vì tôi đã soạn thảo kịch bản của mình để tôi có thể chèn, giả sử, một tham chiếu đến proxy:

#region "private_static_members"
 /// <summary>
 /// cache for LauncherProxy
 /// </summary>
private static LauncherProxy _launcherProxy;
#endregion

#region "protected_const_properties"
protected LauncherProxy LauncherProxy{
  get{
    if(_launcherProxy==null) {
      if (!God.Iam.HasProxy(LauncherProxy.NAME)) {
        God.Iam.RegisterProxy(new LauncherProxy());
      }
      _launcherProxy=God.Iam.Proxy(LauncherProxy.NAME) as LauncherProxy;
    }
    return _launcherProxy;
  }
}
#endregion

vào mã và có từng phần gọn gàng vào khu vực thích hợp.

Trong trường hợp này, macro sẽ phân tích dự án của tôi, đưa cho tôi một danh sách các proxy và tiêm mã cho cái tôi muốn. Con trỏ của tôi thậm chí không di chuyển.

Khi bắt đầu học C #, tôi đã cân nhắc việc sử dụng các khu vực để giữ sự phổ biến cùng nhau, nhưng đó là một đề xuất không thành công bởi vì nó không phải là mối quan hệ một-một lúc nào. Ai muốn băn khoăn về một thành viên được sử dụng bởi hai khu vực, hoặc thậm chí bắt đầu phá vỡ mọi thứ theo các điều khoản đó.

Loại phân tách duy nhất khác là các phương thức - Tôi sẽ chia các phương thức thành các Lệnh, Hàm và Trình xử lý, vì vậy tôi sẽ có một vùng dành cho các lệnh chung, riêng, v.v.

Điều này mang lại cho tôi độ chi tiết, nhưng nó phù hợp, không rõ ràng độ chi tiết mà tôi có thể dựa vào.

0
Mark

Các vùng là các biểu thức tiền xử lý - nói cách khác, chúng được xử lý như các bình luận và về cơ bản bị trình biên dịch bỏ qua. Chúng hoàn toàn là một công cụ trực quan được sử dụng trong Visual Studio. Do đó, #region không thực sự là mùi mã, vì nó không phải là mã. Mùi mã thay vì phương thức 800 dòng có nhiều trách nhiệm khác nhau được nhúng trong v.v. Vì vậy, nếu bạn thấy 10 vùng trong một phương thức - có lẽ nó được sử dụng để ẩn mùi mã. Phải nói rằng tôi đã thấy chúng được sử dụng cực kỳ hiệu quả để làm cho một lớp trở nên dễ chịu hơn và dễ điều hướng hơn - trong một lớp được viết và cấu trúc rất tốt!

0
BKSpurgeon