2010-04-08 9 views
5

Właśnie przeczytałem artykuł Programming by Coincidence. Na końcu strony znajdują się ćwiczenia. Kilka fragmentów kodu, które są przypadkami "programowania przez przypadek". Ale nie mogę znaleźć błąd w tym kawałku:'Programowanie przez przypadek' Ćwiczenie: Java File Writer

Ten kod pochodzi z uniwersalnego zestawu do śledzenia Java w wersji . Funkcja zapisuje ciąg do pliku dziennika. To przechodzi test jednostki, ale kończy się niepowodzeniem, gdy jeden z programistów WWW go używa. Na co zbieg okoliczności się opiera?

public static void debug(String s) throws IOException { 
    FileWriter fw = new FileWriter("debug.log", true); 
    fw.write(s); 
    fw.flush(); 
    fw.close(); 
    } 

Co jest nie tak z tym?

+0

Czy nie jest tak, że testy jednostkowe nie gwarantują 100% odporności na błędy? Mam na myśli, że istnieje wiele takich zbiegów okoliczności, z którymi mamy do czynienia twórców, odkąd zaczęliśmy programować :) – bragboy

+1

@Bagaadeesh: To jest zły test jednostkowy, ponieważ narusza [zasadę jednej odpowiedzialności] (http: //en.wikipedia .org/wiki/Single_responsibility_principle). Jeśli testujesz, czy metoda poprawnie loguje ciąg, powinieneś zabrać z niego plik I/O. Powinien otrzymać "java.io.Writer" utworzony z innego miejsca i napisać do niego. –

Odpowiedz

10

Kod ten polega na tym, że istnieje plik o nazwie debug.log, który można zapisywać w katalogu wykonawczym aplikacji. Najprawdopodobniej aplikacja programisty WWW nie jest skonfigurowana z tym plikiem, a metoda nie powiedzie się, gdy próbuje jej użyć.

Test jednostkowy tego kodu zadziała, ponieważ pierwotny programista miał właściwy plik we właściwym miejscu (z odpowiednimi uprawnieniami). Jest to zbieg okoliczności, który pozwolił na pomyślne przeprowadzenie testu jednostkowego.

+0

Tak, zamierzałem powiedzieć coś o uprawnieniach. –

+0

To naprawdę ma sens. Dzięki za wyjaśnienie tego! –

0

Ciekawy kąsek. W idealnych warunkach zasoby muszą być pobierane ze ścieżki klasy. Jednak nie ma końca ludzkiej przytomności. Co by się stało, gdyby plik był obecny w ścieżce klas środowiska testowego (np. Eclipse), ale brakowało go w wdrożeniach produkcyjnych?

+0

Zasoby (jeśli chodzi o pliki, w kontekście tego pytania) nie muszą być koniecznie wyciągane z ścieżki klasy. Program nie musi wiedzieć, jaka jest ścieżka klas. Ścieżka Classpath jest używana tylko przez moduł ładujący klasy. Java nie określa "katalogu roboczego" dla pliku IO. Obowiązkiem programisty jest przekazanie katalogu roboczego za pośrednictwem argumentu wiersza poleceń lub najlepiej parametru systemowego i użycie go w programie. –

+0

To właśnie miałem na myśli. Łatwiej byłoby przeprowadzić migrację na platformę niż ją kodować. – Maddy