2009-09-12 49 views
14

Có giới hạn về số lượng thuộc tính, phương pháp mà lớp C# có thể có không?Có bao nhiêu phương pháp có thể một lớp C# có

Tôi lướt qua nhanh ở Tiêu chuẩn ECMA-334 và không tìm thấy bất kỳ thông tin nào về nó.

Trước khi xem xét lý do tại sao một lớp học có nhiều phương pháp là thiết kế tồi, tôi muốn rõ ràng hơn về ý định này. Tất nhiên tôi sẽ không viết một lớp với số lượng lớn các phương thức thủ công. Lý do tôi yêu cầu điều này là tôi cần phải tạo ra một số lượng lớn các đơn vị thực thi theo mã. Tôi đang tranh luận giữa có nhiều lớp với phương thức đơn hoặc một lớp lớn với nhiều phương thức.

Vì vậy, đối với câu hỏi này, tôi chỉ quan tâm nếu có giới hạn và giới hạn số lượng thuộc tính, phương pháp là gì.

+2

-1 - nó không quan trọng. Xem câu trả lời tuyệt vời của André Hoffmann. – TrueWill

+17

@truewill: không đồng ý 100%. Nó không quan trọng với bạn, nhưng nó quan trọng đối với DHornpout. Tôi hiểu thực hành tốt là cực kỳ quan trọng, nhưng đó không phải là câu hỏi. Chúng ta không nên giả định kịch bản của người hỏi, chúng ta cũng không nên yêu cầu sự biện minh. chúng ta nên trả lời câu hỏi, và nếu cần thiết, bổ sung với những gợi ý thực hành tốt. – andy

Trả lời

1

Nhiều hơn bao giờ bạn muốn đặt vào một lớp duy nhất.

17

Tôi không biết có bao nhiêu phương pháp một lớp C# có thể có, nhưng tôi biết rằng khi bạn đang nghĩ về nó, bạn chắc chắn đang làm điều gì đó sai trái.

Nếu có giới hạn (tôi nghi ngờ) quá cao đến nỗi bạn sẽ không vượt quá giới hạn đó. Ngoại trừ bạn có một thiết kế lớp học thực sự xấu.

Xem mẫu chống "God object".

CẬP NHẬT:

Mặc dù tôi vẫn không biết chính xác những gì bạn muốn đạt được, tôi vẫn tin rằng bạn chắc chắn nên tạo ra rất nhiều lớp học với chỉ một vài phương pháp vì những lý do sau đây:

  • Performance: nếu bạn đang đặt tất cả các thuộc tính thành một lớp, cho mỗi bộ nhớ bất động sản phải được phân bổ khi bạn tạo một thể hiện, ngay cả khi bạn chỉ cần 5% các thuộc tính trong lớp học của bạn

  • mô đun: nếu bạn tạo ra rất nhiều các lớp học bạn có thể làm cho họ tất cả thực hiện một giao diện/abstract class và do đó xác định một cấu trúc tương tự, mà sẽ giúp làm cho ứng dụng của bạn mô-đun hơn

  • Cấu trúc: nó khá đơn giản để xem phương pháp nào sử dụng các thuộc tính nào khi chỉ chúng cư trú trong cùng một lớp - nếu không mọi thứ có thể thực sự thực sự lộn xộn

  • Thời gian biên dịch: khi thay đổi thực hiện một func tion, những người khác không cần phải được tái biên soạn, như họ đang ở trong lớp khác

+0

Xin vui lòng để lại một bình luận khi downvoting. –

+8

Nó không phải là một câu trả lời. Làm thế nào nó có thể giúp nếu (ví dụ) DHornpout muốn viết trình biên dịch C# hay cái gì đó? –

+9

Để quyết định xem điều này có hữu ích hay không, chúng tôi sẽ phải biết chính xác anh ấy đang làm gì. Vì chúng tôi không, tôi giả định trường hợp thông thường, không liên quan đến việc xây dựng trình biên dịch. –

1

Có ...

của nó được gọi là lẽ thường. Cố gắng không để quá tải một lớp học, nó rất có thể sẽ vi phạm nguyên tắc trách nhiệm duy nhất, và không ai sẽ có thể hiểu nó.

Sau khi tất cả, một lớp là có "chỉ để hỗ trợ các nhà phát triển, người không thể phù hợp hơn sau đó 7 thông tin cùng một lúc vào trí nhớ ngắn hạn của mình" (Vâng, tôi biết thats một tuyên bố nguy hiểm)

1

I don' Tôi nghĩ vậy.Tuy nhiên, thực hành phát triển phần mềm tốt và hướng dẫn khi theo dõi và xem xét nên tự nhiên giới hạn số lượng tài sản và phương pháp mà một lớp có những gì làm cho tinh thần và sự cần thiết tuyệt đối. Thực hành như vậy bao gồm SOLID, KISS (giữ nó đơn giản), DRY (Không lặp lại chính mình), thành phần, tái cấu trúc, thừa kế, vv

27

16,7 triệu mỗi cụm cho mỗi phương pháp (không phải lớp).

+4

Điều đó có thể như vậy, nhưng bạn có thể đề cập đến nguồn gốc của thông tin này không? –

+10

Bảng định nghĩa phương thức chỉ có vị trí cho 24 bit chỉ mục. Toán đơn giản. Đọc thông số kỹ thuật :) – leppie

+0

Trên thực tế bảng MethodDef không có giới hạn cụ thể. Tuy nhiên, chỉ có 24 bit có sẵn trong phần chỉ mục của mã thông báo siêu dữ liệu, vì vậy trong khi bạn có thể tạo một hội đồng .NET với hơn 2^24 phương pháp, bạn chỉ có thể tham chiếu 2^24 cộng với đầu tiên mà tôi nghi ngờ CLR sẽ tải nó. –

4

Phương thức Type.GetMethods trả về một mảng phải được lập chỉ mục theo số nguyên, vì vậy, tôi sẽ nói bạn không thể có nhiều hơn int.MaxValue phương thức cho mỗi lớp.

0

Tôi có một công cụ sinh mã tự động và Tôi hiện đạt giới hạn giữa ~ 5K (mà làm việc) và 10K, mà thất bại

System.TypeLoadException: Type '<the type name>' from assembly '<the assembly name>, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' contains more methods than the current implementation allows. 

Vì vậy, đây mâu thuẫn với tuyên bố rằng nó là "không giới hạn".

+0

Bạn có biết giới hạn chính xác không? –

14

Câu trả lời đúng, trong triển khai CLR hiện tại, là ushort.MaxValue - 15. Điều này có thể được kiểm tra như sau:

AppDomain appDomain = AppDomain.CurrentDomain; 

AssemblyName aname = new AssemblyName ("MyDynamicAssembly"); 

AssemblyBuilder assemBuilder = 
    appDomain.DefineDynamicAssembly (aname, AssemblyBuilderAccess.Run); 

ModuleBuilder modBuilder = assemBuilder.DefineDynamicModule ("DynModule"); 

TypeBuilder tb = modBuilder.DefineType ("Widget", TypeAttributes.Public); 

for (int i = 0; i < ushort.MaxValue - 15; i++) 
{ 
    MethodBuilder methBuilder = tb.DefineMethod ("SayHello" + i, MethodAttributes.Public, null, null); 
    ILGenerator gen = methBuilder.GetILGenerator(); 
    gen.EmitWriteLine ("Hello world"); 
    gen.Emit (OpCodes.Ret); 
} 
Type t = tb.CreateType(); 
object o = Activator.CreateInstance (t); 

Câu hỏi có liên quan nếu bạn đang sử dụng Reflection.Emit để tạo một DataContext đã nhập để quay lại cơ sở dữ liệu (như LINQPad). Với đủ thủ tục được lưu trữ, bạn có thể đạt đến giới hạn này!

+2

+1 là câu trả lời đúng thực tế. Tôi muốn cộng thêm mười câu trả lời này nếu có thể, đặc biệt là xem xét tất cả những câu trả lời trống rỗng khác, những người đã nhận được quá nhiều upvotes. Chỉ khi bạn biết những hạn chế thực sự của một cái gì đó bạn có thể làm việc xung quanh/với nó. Cảm ơn vì mã ví dụ đã tiết kiệm cho tôi khá nhiều thời gian và cảm ơn vì cuốn sách tuyệt vời của bạn. –

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