2010-07-10 30 views
19

Tôi cố gắng đặt tên cho một lớp (cũng là thành viên, thuộc tính và vv) chính xác nhất có thể. Nhưng đôi khi tôi không chắc nếu điều này là rất thông minh nếu tên lớp trở nên rất lớn (50 ký tự và nhiều hơn nữa). Việc xử lý là như vậy những gì không thoải mái và mã trở nên khó đọc.Tên lớp rất dài

Câu hỏi xảy ra đối với tôi hiếm khi và do đó tôi không có nhiều kinh nghiệm khi làm việc với những cái tên dài như vậy nhưng đôi khi (bây giờ) nó xảy ra. Người khác xử lý như thế nào? Bạn có giới hạn trên gần đúng không và sau đó viết tắt hoặc có đáng để bạn xử lý những cái tên dài như vậy không?

Cập nhật

Theo yêu cầu ở đây một ví dụ về một tên lớp dài như vậy.

ProjectContractChargingPeriodProjectAccountReferenceVM 

Đầu tiên Dự án đại diện cho tên miền, nó có thể được bỏ qua vì không gian tên ngụ ý đã thấy nó xử lý các dự án. Vấn đề với điều đó là, nếu tôi làm điều này với tên lớp này, thì tôi phải làm điều đó với tất cả các lớp của không gian tên này và tôi hoàn toàn không thích vì sau đó nhiều tên lớp (ngắn) của không gian tên này sẽ mất biểu cảm. [Project] ContractChargingPeriod mô tả đối tượng, lớp này được sử dụng cho và ProjectAccountReference có nghĩa là lớp đó là tham chiếu đến ProjectAccount. Với ProjectAccount cũng giống như với ProjectContract. Chỉ sử dụng Tài khoản không có ý nghĩa bởi vì trong ứng dụng cũng tồn tại các Lớp tài khoản khác. Tài liệu tham khảo Tham chiếu hơi yếu vì thực tế nó chỉ là một tham chiếu nhiều hơn một chút, nhưng đây là mục đích chung. VM là từ viết tắt tôi luôn sử dụng và viết tắt là ViewModel. Tôi nghĩ rằng điều này là hợp pháp bởi vì tất cả những người làm việc với WPF đều biết những gì VM có nghĩa là.

Tôi phải nói rằng lớp được sử dụng để bọc một lớp ra khỏi ORM được xây dựng bằng công cụ lớn tuổi mà tôi đã tạo từ lâu. Các lớp học đại diện cho quasi 1: 1 ERM và tôi biết rằng đây không phải là tối ưu, nhưng thay đổi nó sẽ là một nỗ lực lớn.

+4

Bạn có ví dụ về tên lớp thực sự dài của mình không? Nếu tên lớp của bạn quá dài, đó có thể là dấu hiệu cho thấy nó đang hoạt động quá nhiều (xem [SRP] (http://en.wikipedia.org/wiki/Single_responsibility_principle)) –

+1

xem xét các không gian tên, nếu mô tả chứa tiền tố mô-đun. – Stephen

+3

Bạn có 'ProjectContractChargingPeriodProjectAccountReferenceVMFactoryBuilderStrategy' không? –

Trả lời

12

(tôi sử dụng Java/C++, và đã sử dụng ngôn ngữ OO khác, nhưng không phải C#, những gì tôi nói ở đây khá nhiều áp dụng cho tất cả các ngôn ngữ tôi đã sử dụng)

tôi sử dụng tên lớp mô tả. Tôi không nghĩ rằng tôi đã làm cho nó đến 50 ký tự Tuy nhiên :-) Nói chung tên lớp dài không được công khai, và thường ẩn đằng sau một giao diện và một nhà máy. Giao diện có tên ngắn hơn nhiều so với các lớp.

Một điều bạn có thể làm là, giả sử bạn có một số lớp được đặt tên dài có liên quan chặt chẽ, đặt chúng vào một gói. Một cách để nhận ra điều này là nếu tất cả các lớp đều có cùng một từ tiền tố. Nếu có một số lớp mà tất cả bắt đầu với cùng một tên thì, có lẽ, tên nên là một gói thay thế.

5

Có bạn một thượng giới hạn xấp xỉ và sau đó làm cho chữ viết tắt hoặc là nó giá trị cơn đau để xử lý như lâu tên?

Không. Không có chữ viết tắt nào ngoại trừ các từ viết tắt cực kỳ tốt như URL hoặc HTTP. Và có lẽ cho các biến địa phương với phạm vi rất nhỏ. Nếu không, hãy suy nghĩ kỹ hơn về cách lấy tên cả hai mô tả và không dài (tôi muốn nói bất cứ điều gì quá 30 ký tự quá dài).

Thông thường, tên dài chứa thông tin thừa hoặc không liên quan có thể bị bỏ qua. Ví dụ: không đặt thông tin trong đó đã được cung cấp từ ngữ cảnh (tức là thông tin trong tên thành viên đã có trong tên lớp). Và tránh các từ phụ không rõ ràng như "dữ liệu", "thông tin", "trình xử lý", "người quản lý", "trình trợ giúp", "tính toán", "bộ xử lý" - chúng mô tả khá nhiều mã và không chứa thông tin thực (và một số chúng phản ánh các khái niệm về thủ tục và gần như là một mùi mã cho riêng nó).

+1

+1 không có chữ viết tắt/từ viết tắt. Sử dụng các từ viết tắt tên miền hoặc từ viết tắt là một rào cản giao tiếp bổ sung và làm cho sự hiểu biết một mô hình đối tượng khó hơn. Tác hại nhiều hơn lợi ích. –

+1

Tên lớp của bạn * phải * phản ánh các khái niệm mã hóa và các mẫu thiết kế. Một lớp tạo các đối tượng 'Customer' bằng cách sử dụng một mẫu nhà máy * nên * được gọi là' CustomerFactory'. Tuy nhiên, bạn nên * không * để các thuật ngữ đó bị rò rỉ vào từ vựng tên miền của bạn. –

+0

Điều đó hữu ích cho tôi: 'suy nghĩ kỹ hơn về cách lấy tên cả hai mô tả và không dài lắm ' – hasanghaforian

2

Tên lâu dài có thể là gợi ý rằng lớp học của bạn có nhiều trách nhiệm (thông báo tôi đã nói 'có thể').

Xem SRP để biết thêm chi tiết (xin lỗi, tôi đang vội vàng ^^).

+7

Đối với tôi, đó là cách khác. Tôi đang cố gắng áp dụng SRP. Và điều đó khiến tôi tạo ra nhiều lớp mới, tất cả đều có trách nhiệm rất cụ thể. Nó bắt đầu trở nên khó khăn để đưa ra một tên mô tả mô tả trách nhiệm cụ thể đó. –

1

50 ký tự đang đẩy phần lớn tên lớp nhưng không thể tưởng tượng được. Theo như Java có liên quan, giới hạn tối đa cho tên lớp đầy đủ (bao gồm cả gói) là 2 bytes.

Trong tự nhiên, thư viện Spring nổi tiếng với tên lớp dài. Ví dụ: lớp AbstractTransactionalDataSourceSpringContextTests có 49 ký tự. Điều này cung cấp thử nghiệm đơn vị với việc tiêm đậu mùa xuân (SpringContextTests); tiêm nguồn dữ liệu (DataSource); các kiểm tra được hiểu biết về mặt giao dịch (Transactional); lớp học được đề cập là trừu tượng (Abstract).

Cố gắng ép thành ít hơn 49 ký tự sẽ là một thách thức. Thông tin này có thể được cung cấp trong tài liệu thay vào đó, nhưng đối với các lớp sử dụng/mở rộng lớp này sẽ không rõ ràng ngay lập tức. Điều này có thể làm giảm sự hiểu biết cho các nhà phát triển đọc các bài kiểm tra đơn vị của bạn, vì vậy chắc chắn có một sự cân bằng ở đây mà bạn sẽ phải suy nghĩ.

+0

Và người chiến thắng mùa xuân khác là 'AbstractInterruptibleBatchPreparedStatementSetter' (cũng 49 ký tự). –

+0

Một số thuộc tính hỗ trợ ngôn ngữ: Ví dụ: 'Giao dịch' có thể được khai báo bằng cách trang trí lớp với thuộc tính' TransactionalAttribute'. – ChrisW

+0

Với sự hỗ trợ chú thích của họ, bạn không phải mở rộng bất kỳ lớp học mùa xuân nào để có được những lợi ích của IoC trong các bài kiểm tra đơn vị của bạn. Bạn có thể thêm các chú thích '@RunWith (SpringJUnit4ClassRunner.class)' và dd '@ Transactional' vào các bài kiểm tra bạn muốn chạy trong các giao dịch. – krock

5

Cách người khác xử lý việc này? Bạn có giới hạn trên gần đúng không và sau đó viết tắt hoặc có đáng để bạn xử lý những cái tên dài như vậy không?

Một lớp được cho là đại diện cho một loại điều: đó là danh từ (không phải động từ, và chắc chắn không phải là toàn bộ câu).

Tôi thích mô tả mọi thứ bằng một hoặc hai từ, có thể ba: chỉ một danh từ hoặc danh từ ghép (như tiếng Đức), hoặc có thể là tính từ và danh từ.

Ví dụ, đây là một danh sách của một số lớp học của tôi trong một dự án:

Ancestors.cs 
Block.cs 
BlockCollection.cs 
BlockDocument.cs 
BlockInline.cs 
BlockInlineText.cs 
BlockListBullet.cs 
BlockListItem.cs 
BlockP.cs 
BlockSequence.cs 
BlockTable.cs 
BlockText.cs 
BlockTextParent.cs 
Border.cs 
BorderEdges.cs 
Box.cs 
Canvass.cs 
CaretLocation.cs 
CaretLocationAndNode.cs 
CaretLocationAndPoint.cs 
CaretLocationData 
CaretLocationPair.cs 
CaretLocationPairAndPoint.cs 
CaretsInBlock.cs 
DebugDumpDom.cs 
DebugOutput.cs 
Display.cs 
Displayed.cs 
DocumentHandle.cs 
DomDocument.cs 
DomDocumentFragment.cs 
DomElementBody 
DomElementHandle.cs 
DomElementTag.cs 
DomEvent.cs 
DomList.cs 
DomNode.cs 
DomNodeChild.cs 
DomRange.cs 
DomRangeBase.cs 
DomTextBody.cs 
DomTextHandle.cs 
Edge.cs 
Editing.cs 
EditingState.cs 
Editor.cs 
EditorAction 
EditorActions 
EditorMutations.cs 
EditorTransaction 
EventListeners.cs 
ExtractedRangeInDomDocument.cs 
ExtraDebugInformation.cs 
FormControl.cs 
... etc ... 

Như bạn có thể thấy, hầu hết các tên lớp chỉ là hai từ (một danh từ ghép).

Tôi cũng sử dụng không gian tên để phân lớp thành các loại khác nhau và dự án khác nhau (giúp giữ tên của lớp ngắn hơn: vì một số hoặc hầu hết thông tin phân cấp nằm trong tên không gian tên chứ không phải tên lớp).

Nếu tôi may mắn, thì tên lớp là duy nhất hoặc gần như duy nhất sau vài chữ cái đầu tiên: vì vậy nếu tôi nhập một vài chữ cái đầu tiên, tôi có thể chọn lớp cụ thể bằng Intellisense. Vì lý do đó, tôi không cần sử dụng chữ viết tắt.

+0

Một số lớp này trông giống các thuộc tính hơn. CaretLocation, ExtractedRangeInDomDocument, vv Ngoài ra, các tên lớp có từ 'And' là một dấu hiệu tốt cho thấy bạn thực sự có hai lớp. –

+0

@ Dave Jarvis - Có họ thực sự là hai lớp: một lớp với 'Và' trong tên của nó là một nhóm các sự vật. Ví dụ, 'CaretLocationAndNode' được xây dựng từ một cá thể' CaretLocation' và một cá thể 'DomNode' (và bao gồm các tham chiếu đến các cá thể này trong số các thành viên dữ liệu của nó). – ChrisW

+2

+1 Không có gì sai khi giới thiệu nhiều lớp, miễn là nó có ý nghĩa trong miền của bạn.Tôi muốn có một lớp 'AmountAndCurrency' thay vì hai đối tượng riêng biệt mô tả giá trị của một sản phẩm. Khái niệm 'AmountAndCurrency' thường đi theo tên' Giá', nhưng không phải * tất cả * các lớp hợp lệ hợp lệ có tên thật của riêng nó. –

3

Về ví dụ về ProjectContractChargingPeriodProjectAccountReferenceVM, bạn có thể cấu trúc lại nó thành một cái gì đó như thế này:

namespace Project 
{ 
    public class ContractChargingPeriod implements IAccountReference 
    { 
    ... 
    } 

    public interface IAccountReference 
    { 
    ... 
    } 
} 

Các ContractChargingPeriod là đối phó với tất cả các logic kinh doanh liên quan đến hợp đồng thu phí giai đoạn. Thực tế là nó thực hiện IAccountReference cũng cho biết rằng đối tượng đề cập đến một tài khoản, nhưng không xác định điều này trong tên lớp.

Bạn có thể tạo chế độ xem đơn giản phản ánh nội dung của các loại này, nhưng chế độ xem sẽ không chứa bất kỳ logic nghiệp vụ nào. Chế độ xem có thể sử dụng cùng cấu trúc như ví dụ ở trên, nhưng phải được định nghĩa trong một không gian tên riêng biệt.

1

Mỗi khi bạn cảm thấy xấu về tên dài của mình, hãy thử xem lớp này trong hơn 5 giây. Tôi cung cấp cho bạn:

Và chị lớn của nó:

Đừng cảm thấy xấu về nó, tên có nghĩa vụ phải được tự giải thích , miễn là tên lớp của bạn ngắn hơn mã của nó, tôi nghĩ chúng ta đều tốt.

+0

miễn là tên lớp của bạn ngắn hơn mã chứa trong đó - :-( –

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