klasy do obsługi io

0

W java mamy wiele klas do obsługi io. W wielu tutorialach pokazywane jest jak to obchodzić się z takimi klasami. Czyli tworzenie strumienia i dekorowanie go bajerami, a potem pętelka i zamykanie.

Moim zdaniem w stosunku do innych języków obsługa takich strumieni jest złożona i przede wszystkim trochę toporna w używaniu. Wiadomo takie zoo klas jak w Java jest bardziej elastyczne w dostosowaniu do własnych potrzeb i lżejsze, bo płacisz za to co używasz. Zastanawiam się czy jawne tworzenie strukiemieni i filtrów opłaca się na dłuższą metę? Przykładowo ja w swoim domowym projekcie wydzielam takie moje najczęstsze procedury do pracy z plikami, bym nie musiał pisać w koło tego samego. Widziałem, że apache commons oferuje coś podobnego.

Zastanawia mnie jak inni programiści lubią pracować z takimi klasami? To też zastanawia mnie czy takie jawne tworzenie strumieni niesie w sobie jakieś dodatkowe korzyści - np. łatwość w testowaniu?

0

Te klasy o których piszesz zaliczają się do wszelakich utils'ów i commons'ów. A utils'y i commons'y to podstawa każdego źle zaprojektowanego systemu ;)

Tak czy inaczej - warto znać kilka takowych commonsów (Apache i Google w pierwszej kolejności). Po to właśnie, żeby - zamiast implementować samemu - mieć od razu przetestowane i gotowe metody do użycia.

"Zastanawia mnie jak inni programiści lubią pracować z takimi klasami?"
Nie muszą lubić, ale jakoś tak się zawsze składa że takie klasy bardzo często są tworzone w trakcie albo utrzymania, albo rozwoju projektu.

"To też zastanawia mnie czy takie jawne tworzenie strumieni niesie w sobie jakieś dodatkowe korzyści - np. łatwość w testowaniu?"
Jawne tworzenie strumieni ma chyba na celu podnieść wydajność oraz elastyczność rozwiązania. IMO testowanie może utrudnić, bo wszelakiego rodzaju commons'y już są właśnie przetestowane, w przeciwieństwie do własnych rozwiązań, które trzeba samodzielnie przetestować.
W przypadku własnych, wydzielonych bibliotek z klasami do obsługi strumieni - jeśli tylko masz je pokryte testami - to rzeczywiście może uprościć sprawę, ponieważ wiesz z góry, czego się spodziewać.

1

@pyjoker, w API też są odpowiednie klasy, które pozwalają na "bezstrumieniową" obslugę plików np. Files. Generalnie coraz wiecej utilsów włączane jest do głównej biblioteki.

Co do testowania to dużo zależy od tego jak napisany jest kod. Generalnie jak korzystasz z metod statycznych to trudnosć testu rośnie, choć można to zrobić z uzyciem np. PowerMockito. Jeszcze trudniej (bez użycia prawdziwej magii) przetestować jest coś takiego:

void method(String filePath){
    FileStream fs = new FileStream(filePath);
    //...
}

Ponieważ ręcznie tworzysz obiekt, który będzie bił bezpośrednio do dysku (to jest naprawdę ciężko zamockować). Tutaj z pomocą przychodzi odpowiednio napisana reguła AspectJ i podmiana w locie... trudne.

1
Koziołek napisał(a):

Ponieważ ręcznie tworzysz obiekt, który będzie bił bezpośrednio do dysku (to jest naprawdę ciężko zamockować). Tutaj z pomocą przychodzi odpowiednio napisana reguła AspectJ i podmiana w locie... trudne.

W PowerMockito można też to zrobić :

whenNew(MyClass.class).withNoArguments().thenReturn( myMock);

1 użytkowników online, w tym zalogowanych: 0, gości: 1