2012-09-25 16 views
5

Chciałbym, aby twierdzenia mniej intensywne obliczeniowo pozostały włączone przez cały czas i wyłączenie wyższych twierdzeń o intensywności obliczeniowej. Praktyczny przypadek użycia może być, gdy przeniesiemy kod do produkcji (zgodnie z Pragmatycznym Programistą, jest to sugerowany sposób obsługi twierdzeń).Kontrolowanie asercji Java - najlepsze praktyki

Jaki jest najlepszy sposób sprawdzania asercji? (Uwaga: włączono już asercje w zmiennych VM za pomocą "-ea").

Prosty przykład:

/** 
* 
* @precondition sizeOfList >= 2 
*/ 
private ArrayList<Integer> createSortedList(int sizeOfList){ 
    ArrayList<Integer> results = new ArrayList<Integer>(); 

    for(int i = 0; i<sizeOfList; i++){ 

     <algorithm to add sorted numbers to array> 

    } 

    if(<some_flag>) 
     assert results.get(0) < results.get(1) : "Results are not sorted."; 

    assert results.size() == sizeOfList : "Results-list size does not equal requested size."; 

    return results; 
} 

Czy to najlepiej użyć Właściwości systemu do sterowania zmienną? Jeśli tak jest, czy właściwości systemowe można ustawić dla całego projektu, a nie tylko dla konkretnej klasy (w Eclipse)?

Czy lepiej jest używać stałej stałej zdefiniowanej w klasie "Stałe"?

Czy są inne sposoby, o których nie myślę?

Z góry dziękuję.

+1

Czy możesz rozwinąć różnicę między "mniej obliczeniowo-intensywnymi" i "wyższymi obliczeniowo-intensywnymi twierdzeniami?" Może podać przykład lub dwa? – allingeek

+0

Przykład mniejszego obciążenia wymaga sprawdzenia względem zmiennej, np .: 'assert i <7:" i jest nie mniejsze niż 7 ";' Większy stopień kompresji byłby czymś, co wymaga więcej przetwarzania, np. sprawdzenia średniej każdej wartości na liście: 'assert avg (listOfIntegers) <7:" Średnia nie jest mniejsza niż 7. ";' Idealnie można wyłączyć kompresję -twierdzenia wzniosłe i pozostawienie na mniejszych w produkcji. – mtical

Odpowiedz

2

Cechą definującą instrukcji assert jest to, że można ją wyłączyć, więc używałbym jej tylko do twierdzeń, które nie zawsze powinny być uruchamiane. Dla twierdzeń, które zawsze działają, zrobiłbym coś takiego:

if (results.size() != sizeOfList) 
    throw new AssertionError("Results-list size does not equal requested size."); 

Następnie można włączyć/wyłączyć drogich twierdzeń poprzez opcję -ea JVM.