2009-09-12 20 views
14

Czy istnieje ograniczenie liczby właściwości, metod, które może mieć klasa C#?Ile metod może mieć klasa C#?

Wykonuję szybki rzut w standardzie ECMA-334 i nie znalazłem żadnych informacji na ten temat.

Zanim przejdziemy do tego, dlaczego klasa z wieloma metodami jest złym projektem, chcę być bardziej precyzyjna w stosunku do intencji. Oczywiście nie będę pisać klasy z dużą liczbą metod ręcznie. Powodem, dla którego o to pytam jest potrzeba generowania dużej liczby jednostek wykonawczych przez kod. Jestem debata między wieloma klasami z jedną metodą lub jedną dużą klasą z wieloma metodami.

Więc na to pytanie, jestem zainteresowany tylko jeśli istnieje limit i jaki jest limit liczby właściwości, metod.

+2

-1 - To nie ma znaczenia. Zobacz doskonałą odpowiedź André Hoffmanna. – TrueWill

+17

@truewill: nie zgadzam się w 100%. Nie ma to dla ciebie znaczenia, ale ma znaczenie dla DHornpout. Rozumiem, że dobra praktyka jest niezwykle ważna, ale to nie jest pytanie. Nie powinniśmy zakładać scenariusza pytającego, nie powinniśmy też wymagać uzasadnień. powinniśmy odpowiedzieć na to pytanie, a jeśli to konieczne, uzupełnić sugestiami dotyczącymi dobrych praktyk. – andy

Odpowiedz

1

Więcej niż kiedykolwiek będziesz chciał umieścić w jednej klasie.

17

Nie wiem, ile metod może mieć klasa C#, ale wiem, że kiedy o tym myślisz, z całą pewnością robisz coś źle.

Jeśli istnieje limit (w co wątpię) jest tak wysoki, że go nie przekroczysz. Poza tym, że masz naprawdę zły projekt klasy.

Zobacz wzór anty-"God object".

UPDATE:

Chociaż ja wciąż nie wiem dokładnie, co chcesz osiągnąć, nadal uważam, że powinno się stworzyć wiele klas z niewielu metod następujących powodów:

  • Wydajność: jeśli jesteś oddanie wszystkich właściwości do jednej klasy, dla każdej pamięci właściwość musi być przydzielona podczas tworzenia instancji, nawet jeśli trzeba tylko 5% właściwości w swojej klasie

  • Modułowość: jeśli utworzyć wiele klas można zrobić je wszystkie wdrożyć/abstrakcyjną klasę interfejsu, a tym samym określić podobną strukturę, która pomoże co aplikacja bardziej modularny

  • Struktura: to całkiem proste, aby sprawdzić, które metody stosowania, które właściwości, gdy tylko się one w tej samej klasie - w przeciwnym razie wszystko może się naprawdę bardzo brudny

  • czas Kompilacja: przy zmianie realizację jednego func cja, inni nie muszą być ponownie skompilowany, ponieważ są one w innych klasach

+0

Proszę zostawić komentarz podczas rezygnacji. –

+8

To nie jest odpowiedź. Jak może pomóc, jeśli (na przykład) DHornpout chce napisać kompilator C# czy coś? –

+9

Aby zdecydować, czy jest to pomocne, powinniśmy wiedzieć, co dokładnie robi. Ponieważ tego nie robimy, założyłem zwykły przypadek, który nie wymaga budowania kompilatora. –

1

Tak ...

Nazywa się zdrowym rozsądkiem. Staraj się nie obciążać klasy, najprawdopodobniej będzie to naruszać zasadę jednej odpowiedzialności i nikt nie będzie w stanie jej zrozumieć.

Wszakże klasą jest tam „tylko do pomocy dewelopera, który mogę zmieścić więcej niż 7 informacje od razu w jego pamięci krótkoterminowej” (Tak, wiem, to jest to niebezpieczne oświadczenie)

1

I don” tak sądzę.Jednak dobre praktyki i wytyczne dotyczące rozwoju oprogramowania, gdy są przestrzegane i rozważane, powinny naturalnie ograniczać liczbę właściwości i metod, które klasa ma do tego, co ma sens i absolutna konieczność. Takie praktyki obejmują SOLID, KISS (zachowaj proste), DRY (Nie powtarzaj się), kompozycja, refaktoryzacja, dziedziczenie, itp.

27

16,7 miliona na montaż na metodę (nie klasa).

+4

Być może tak, ale czy mógłbyś podać źródło tych informacji? –

+10

Tabela definicji metod ma tylko miejsce dla 24 bitów indeksów. Prosta matematyka. Przeczytaj specyfikację :) – leppie

+0

W rzeczywistości tabela MethodDef nie ma określonego limitu. Jednak w indeksowej części tokenu metadanych dostępne są tylko 24 bity, więc chociaż prawdopodobnie mógłbyś utworzyć zestaw .NET z więcej niż 2^24 metodami, mógłbyś tylko odwołać się do pierwszych 2^24 plus wątpię, by CLR Załaduj To. –

4

Sposób Type.GetMethods zwraca tablicę, która musi być indeksowane przez liczbę całkowitą tak, to powiedziałbym, że nie można mieć więcej niż int.MaxValue metod w klasie.

0

Mam zautomatyzowane narzędzie do generowania kodu, a ja obecnie hit granicę między ~ 5K (który pracował) i 10K, który nie powiodło

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. 

Więc jest to sprzeczne twierdzenia, że ​​jest „nieograniczona”.

+0

Czy znasz dokładny limit? –

14

Poprawną odpowiedzią w bieżącym wdrożeniu CLR jest ushort.MaxValue - 15. To mogą być testowane w następujący sposób:

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); 

Pytanie jest istotne jeśli używasz Reflection.Emit stworzyć wpisane DataContext kopii bazy danych (podobnie jak LINQPad). Mając wystarczająco dużo zapisanych procedur, możesz osiągnąć ten limit!

+2

+1 za bycie jedyną aktualną właściwą odpowiedzią. Poprosiłbym o dziesięć, jeśli to możliwe, tę odpowiedź, szczególnie biorąc pod uwagę wszystkie inne bezsensowne odpowiedzi, które otrzymały zbyt wiele awansów. Tylko jeśli znasz rzeczywiste ograniczenia czegoś, z czym możesz pracować/z nim. Dziękuję za przykładowy kod, który zaoszczędził mi sporo czasu i dzięki za wspaniałą książkę. –

Powiązane problemy