2010-11-19 10 views
5

Obecnie pracuję nad małą strukturą sztucznej inteligencji (algorytmy genetyczne/sieci neuronowe) w języku C# dla projektu uniwersyteckiego.Jak zapewniasz algorytmiczny kod w .NET?

Moim pierwszym zmartwieniem jest opracowanie ram wielokrotnego użytku, więc projektuję wszystko, aby było całkiem modularne. Wiem, że płacę za to cenę (wydajność), ale czuję, że mam więcej do zyskania niż do stracenia (najlepiej dwa razy wolniej niż stracić dwa razy tyle czasu później, próbując znaleźć niemożliwe znajduj błędy i tracisz mnóstwo czasu, próbując dodać nowe rzeczy, które trudno jest wprowadzić w monolitycznym bloku kodu).

Chciałbym mieć wiele kontroli na różnych częściach mojego kodu, asercje, w zasadzie. Sprawdź, czy przy uruchomieniu metody XI rzeczywiście jestem w poprawnym stanie itd. Tego rodzaju twierdzenia są przydatne przy opracowywaniu, ale chciałbym, żeby trzymali się z daleka od kodu wydania (to znaczy, gdy zdecyduję, że będę chciał opuścić to działa na noc, aby uzyskać moje końcowe wyniki badań).

widzę kilka sposobów osiągnięcia tego:

  1. System.Diagonists.Assert rodzinę metod.
  2. Code Contracts
  3. Mając if (x), a następnie wyrzucić InvalidStateException() otoczoną #if DEBUG/#endif

Jak to zrobić i dlaczego?

Jestem również świadomy testów jednostkowych (używam ich), ale chciałbym też mieć pewne twierdzenia na temat kodu.

Odpowiedz

8

Można użyć metody statycznej takiego:

[Conditional("DEBUG")] 
public static void Assert(bool condition, string message) 
{ 
    if (!condition) 
     throw new InvalidStateException("Assertion failed: " + message); 
} 

I dochodzić jak tak przy założeniu, że metoda ta jest zdefiniowana w klasie o nazwie Util:

Util.Assert(a == b, "a == b"); 

Rozmowy do tej metody będzie tylko emitowane przez kompilator po ustawieniu symbolu DEBUG, dzięki ConditionalAttribute. Nie musisz więc owijać takich połączeń w żadną dyrektywę #if. Spowoduje to mniej bałaganu w kodzie.

(Należy pamiętać, że sama metoda będzie nadal opracowywane. Pozwala to na stosowanie takich metod w różnych zespołach!)

+1

Czy umowy z kodeksem nie działają w podobny sposób? Wpadłem na pomysł, że możesz je całkowicie wyłączyć w trybie Release lub coś podobnego. –

+0

Może. Szczerze, nie znam tego. Technika w mojej odpowiedzi to ta, której używam, więc pomyślałem, że ją podzielę. Nie mogę powiedzieć, czy jest lepiej, czy gorzej niż umowy kodowe. – cdhowie

+0

Pójdę z tym, co mówi cdhowie. umowa na kod oferuje o wiele więcej, ale prawdopodobnie nie to, czego potrzebujesz w twoim przypadku. Tak więc myślę, że właściwym narzędziem jest użycie metod ozdobionych atrybutem warunkowym, a nie wbudowanym # jeśli, # else lub Debug.Asset() zaśmieca twój kod w linii. –

0

Zaletą #if/#endif jest to, że nie tylko jest wywołanie funkcji assert wyeliminowany, ale także całą pracę przygotowującą jej parametry (które, miejmy nadzieję, nie mają efektów ubocznych ...).

+2

To samo z '[Warunkowe (...)]'. – cdhowie