Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Witam

Trzymam sobie konfigurację w pliku XML (klucz - wartość). Problem mam w
tym, że konfiguracja programu jest zmieniana w kilku miejscach. Więc
muszę załadować dotychczasową postać pliku, zmienić lub dodać wartość
klucza i zapisać taka postać na nowo. Jak to zrobić? Obecnie doradzają mi na pewnej grupie statyczny wspólny obiekt lub singleton.

konto usunięte

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Witam

Ważne kwestie zmiany konfiguracji:
-jakie komponenty wymagać będą przeładowania
-jak to zrealizować aby nic się nie posypało

Czyli tak:
-konfiguracja jest mapowana z XML na obiekt
-Singleton odpowiada za utworzenie i utrzymanie tylko jednej instancji obiektu konfiguracji (aby nie mnożyć bytów)
-komponenty wrażliwe na zmiany konfiguracji muszą wiedzieć że coś uległo zmianie, w prostych przypadkach wystarczy iż realizując jakąś funkcjonalność odwoła się do nowej wartości (referencja czy też żądanie instancji z Singleton podczas np. inicjacji), jeżeli komponent musi zostać poinformowany o tym iż zaszła zmiana (inicjowany tylko raz) posłużyć się można wzorcem Observer
-należy tak połączyć wszystko w całość aby posiadać metody umożliwiające bezpieczną zmianę konfiguracji
-należy minimalizować zależności między obiektami

Moim zdaniem dobrym przykładem jak realizować zmiany konfiguracyjne jest internacjonalizacja aplikacji:
-jeden aktualnie wykorzystywany pakiet językowy dostęp poprzez dedykowany interfejs,
-aktualizacja zasobów korzystających z pakietu po jego zmianie bez restartu aplikacji,
-utrwalenie decyzji dotyczącej wybranego pakietu w celu załadowania właściwego po restarcie aplikacji

Pozdrawiam
Mateusz Jancy
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Pogubiłem się. Może inaczej wyjaśnię :-) Bardziej na przykładach. Mój programik bazuje na bibliotece SWT jeśli chodzi o GUI. Ma on klasyczną formatkę (nawet z zakładkami) odnośnie ustawień programu. Gdy wywołuję tę formatkę w programie ustawienia są ładowane z pliku XML (klasa Properties). Przycisk OK na tej formatce odpowiada za zapisanie ustawień z tej formatki do pliku XML. Fragment metody zapisującej ustawienia do pliku poniżej:


Properties property = new Properties();
FileOutputStream fileOutputStream = new
FileOutputStream(settingsDirectory+File.separator+cfgFileName);
FileInputStream fileInputStream = new
FileInputStream(settingsDirectory+File.separator+cfgFileName);
property.loadFromXML(fileInputStream);
property.getProperty(cfgKeyProperty);
property.setProperty(cfgKeyProperty, cfgValueProperty);
property.storeToXML(fileOutputStream, "Konfiguracja programu
jMusicNFOBuilder");
fileOutputStream.close();
fileInputStream.close();


Ale są jeszcze pewne ustawienia z innych miejsc programu, które chciałbym dodać do tego pliku np. chciałbym zapisywać każdą modyfikację pewnego pola tekstowego. Planowałem nową metodę podobną do tej wyżej. Nie wiem jednak jak rozwiązać ten temat pomiędzy metodami loadFromXML i storeToXML. setProperty ustawi mi nową parę klucz - wartość. Jednak wszystko to co było już w pliku zostanie nadpisane i stracę inne klucze. Zapisany zostanie tylko ten jeden aktualnie zmieniany metodą setProperty. Tak jakby storeToXML nie przyjmowało poprzednich wczytanych wartości metodą loadToXML.

konto usunięte

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

.Łukasz Grabski edytował(a) ten post dnia 16.07.10 o godzinie 10:03
Kamil Toszek

Kamil Toszek IT Consultant

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Witam,

Moim zdaniem mozna to calkiem prosto rozwiazac nawet bez uzywania singelton pattern.

Ja osobiscie stworzyl bym klase np Config ktora zawierala by hashmape (tablice asocjacyjna klucz->wartosc).

funkcje tej klasy to
load(filename)
save(filename)
get(key)
get(key,defaultValue)
set(key,value)

jesli klucz istnieje w tabeli to wartosc jest zastepowana nowym, jesli nie to jest dodawany do tabeli.

Zawartosc pliku nie musi byc xml, prosciej to zrobic na zasadzie jedna linia w pliku to wpis w postaci "klucz=wartosc", po wczytaniu lini wystarczy uzyc funkcji split("=") klasy String. (oczywiscie nalezy zwrocic uwage na wielokrotnosc wystapien znaku '=').

Zapisywanie do pliku czyscilo by caly plik i zapisywalo ponownie cala zawratosc hash table.

Jesli musi byc to XML to wewnatrz load, save uzylbym biblioteki XStream (http://xstream.codehaus.org/)

Albo moze przyjec sie java.util.prefs.Preferences ?

PozdrawiamKamil Toszek edytował(a) ten post dnia 16.07.10 o godzinie 16:29

konto usunięte

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Nie lepiej użyć commons-configuration ?
http://commons.apache.org/configuration/userguide/howt...

W podanym adresie URL wskazanie na: Saving, Automatic Saving, Automatic Reloading, Managed Reloading
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Osiołkowi w żłoby dano :-) I co tu wybrać :-) Chyba muszę się po kolei z każdym rozwiązaniem zapoznać.
Tomasz Niewolik

Tomasz Niewolik
Programista/Projekta
nt

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Kamil Toszek:
Moim zdaniem mozna to calkiem prosto rozwiazac nawet bez uzywania singelton pattern.

Singleton chroni Cię przed posiadaniem kilku wersji konfiguracji w aplikacji, co w przypadku konfiguracji jest zazwyczaj pożądane. Jego użycie zupełnie nie wpływa na to, w jaki sposób będziesz przechowywał w pliku informację o u stawieniach (to odnośnie reszty postu).
Kamil Toszek

Kamil Toszek IT Consultant

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Chyba ze ta ochrona jest wlasnie niepozadana - konfiguracja w wersji developerskiej, testowej, porodukcyjnej, rozne dwersje dla unit testow.
Tomasz Niewolik

Tomasz Niewolik
Programista/Projekta
nt

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Kamil Toszek:
Chyba ze ta ochrona jest wlasnie niepozadana - konfiguracja w wersji developerskiej, testowej, porodukcyjnej, rozne dwersje dla unit testow.

Jednocześnie używasz kilku konfiguracji? Chyba nie. Jak masz wersję deweloperską to wszędzie chciałbyś mieć tą samą konfigurację deweloperską i po to jest Singleton. To, że są różne środowiska wymagające różnej konfiguracji rozwiązujesz przez zmianę pliku z konfiguracją (xml, properties itp.) lub przy bardziej złożonych rozwiązaniach przez FactoryMethod.
Kamil Toszek

Kamil Toszek IT Consultant

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

>Jednocześnie używasz kilku konfiguracji? Chyba nie.
Chyba jednak tak - zdazylo mi sie ;)

Singleton pattern bazuje na tym ze tylko jeden obiekt danej klasy moze istniec w systemie i to sama klasa narzuca ta jednostkowosc. Jednakze to klient klasy,a nie klasa powinna okreslac kiedy taka jednoskowosc jest potrzebna. Osobiscie wybralbym rozwiazanie, w ktorym to wlasnie Factory by pilnowala tego, ze zwraca instancje zawsze tego samego obiektu, lecz w miare potrzeby chce miec mozliwosc stworzenia wlasnej wersji.

Kolejna sprawa jest to ze singleton moze utrudniac testowanie. Owszem mozna dac wersje z wartosciami do testow. Nawet mozna przed kazdym unit testem wywolac metode przygotowywujaca. Pytanie tylko co jesli framework testujacy testuje unittesty na kilku watkach jednoczesnie, kazdy z nich chce swoja specjalna konfiguracje a my uzywamy singletona..

Nie chce tu toczyc wojny ideologicznej, dla niektorych singleton to pattern(np Gang of Four) dla innych to antypattern (np http://blogs.msdn.com/b/scottdensmore/archive/2004/05/.... Ja osobiscie staram sie szukac rozwiazan go unikajacych, aczkolwiek piekno w programowaniu jest takie ze mozna rozwiazac niektore problemy na wiele sposobow-to czy sa one lepsze czy gorsze zalerzy od architektory systemu, jego zlozonosci oraz samego programisty i tego, w ktorym narzedziu czuje sie lepiej.
Tomasz Niewolik

Tomasz Niewolik
Programista/Projekta
nt

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Kamil Toszek:
Kolejna sprawa jest to ze singleton moze utrudniac testowanie. Owszem mozna dac wersje z wartosciami do testow. Nawet mozna przed kazdym unit testem wywolac metode przygotowywujaca. Pytanie tylko co jesli framework testujacy testuje unittesty na kilku watkach jednoczesnie, kazdy z nich chce swoja specjalna konfiguracje a my uzywamy singletona..

Architektura aplikacji ustawiona specjalnie pod testy? Nie wiem, czy to dobry pomysł ;-) Testy jednostkowe sprawdzają jednostkową funkcjonalność (metodę), więc powinny się opierać tylko na wejściu i wyjściu. Po co tu jakaś konfiguracja? Jedyny przypadek jaki przychodzi mi do głowy to sytuacja, gdy metoda ma za zadanie komunikować się z systemem zewnętrznym (np. DAO z bazą danych), ale wtedy raczej wszystkie metody mają tą samą konfigurację.

Co do samej idei Singletona to artykuł na MSDN jest słuszny, bo S. nie jest rozwiązaniem na wszystkie problemy.Tomasz N. edytował(a) ten post dnia 06.08.10 o godzinie 08:58

konto usunięte

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Tomasz N.:

Architektura aplikacji ustawiona specjalnie pod testy? Nie wiem, czy to dobry pomysł ;-)

Myślałem, że w dzisiejszych czasach nikt już nie poddaje w wątpliwość tworzenia architektury, która jest ustawiona m.in. specjalnie pod testy. A jednak...
Testy jednostkowe sprawdzają jednostkową funkcjonalność (metodę), więc powinny się opierać tylko na wejściu i wyjściu. Po co tu jakaś konfiguracja? Jedyny przypadek jaki przychodzi mi do głowy to sytuacja, gdy metoda ma za zadanie komunikować się z systemem zewnętrznym (np. DAO z bazą danych), ale wtedy raczej wszystkie metody mają tą samą konfigurację.

To jest książkowa teoria. Praktyczna praktyka ( :) ) jest taka, że testy jednostkowo tak zdefiniowane mają z reguły małą (mniejszą) efektywność (błędy najczęściej wynikają z interakcji paru metod, klas, itd.) - błędy w pojedynczych metodach są rzadsze i łatwiejsze do wykrycia.

Wniosek: nie ma nic złego (a jest wiele dobrego) w teście, który dla przykładu odczytuje konfigurację, na jej podstawie wykonuje X i zapisuje do bazy coś co później jest weryfikowane w danym teście. Może nie nazwiemy tego testem jednostkowym ale kogo obchodzi nazewnictwo ?
Tomasz Niewolik

Tomasz Niewolik
Programista/Projekta
nt

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Pawel Dolega:
Myślałem, że w dzisiejszych czasach nikt już nie poddaje w wątpliwość tworzenia architektury, która jest ustawiona m.in. specjalnie pod testy. A jednak...

Dobrze zaprojektowana architektura i przygotowana analiza powinny pozwolić łatwo i skutecznie przeprowadzić testy.
Testy jednostkowe sprawdzają jednostkową funkcjonalność (metodę), więc powinny się opierać tylko na wejściu i wyjściu. Po co tu jakaś konfiguracja? Jedyny przypadek jaki przychodzi mi do głowy to sytuacja, gdy metoda ma za zadanie komunikować się z systemem zewnętrznym (np. DAO z bazą danych), ale wtedy raczej wszystkie metody mają tą samą konfigurację.

To jest książkowa teoria. Praktyczna praktyka ( :) ) jest taka, że testy jednostkowo tak zdefiniowane mają z reguły małą (mniejszą) efektywność (błędy najczęściej wynikają z interakcji paru metod, klas, itd.) - błędy w pojedynczych metodach są rzadsze i łatwiejsze do wykrycia.

No i znowu, jeśli zrobiłeś testy jednostkowe to Ci wyjdzie, że jedna z metod zwraca nie to co potrzeba. Robiąc jeden test jako ciąg kilku metod nie wiesz i tak, która źle zadziałała.
Wniosek: nie ma nic złego (a jest wiele dobrego) w teście, który dla przykładu odczytuje konfigurację, na jej podstawie wykonuje X i zapisuje do bazy coś co później jest weryfikowane w danym teście. Może nie nazwiemy tego testem jednostkowym ale kogo obchodzi nazewnictwo ?

Zasadniczo nazewnictwo jest ważne, dzięki temu wiemy o czym mówimy. ;-)
Co do Twojego przykładu: załóżmy, że mając taki test i weryfikując stan w bazie stwierdzamy, że jest błąd. Gdzie go szukać? Może w konfiguracji, może w metodzie/klasie do obsługi konfiguracji, może w metodzie/klasie wykonującej X, a może w metodzie/klasie obsługującej bazę? Takie testy wykazują, że coś jest źle, ale nie pomagają w naprawieniu kodu/błędu. Jeżeli już chcesz mieć przetestowany przebieg, to może lepiej połączyć kilka testów jednostkowych? Robisz test jednostkowy konfiguracji, jeżeli przejdzie to wyjście jest przekazywane dalej itd. Niby to samo, ale lepiej i inaczej. Oczywiście, zawsze mogą być problemy między klasami/warstwami (szczególnie gdy używamy EJB, Web Services itp.), ale mając dobrze zrobione testy jednostkowe łatwiej nam wychwycić problem (problem będzie w komunikacji, a nie w warstwie biznesowej lub DAO).

konto usunięte

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

Niestety z mojego doświadczenia błędy nie pojawiają się najczęściej w pojedynczych metodach a raczej w funkcjach biznesowych. Inna sprawa, że każdy ma inne doświadczenia...

Tomaszu - myślisz, że warto otworzyć osobny wątek poświęcony temu zagadnieniu ?Pawel Dolega edytował(a) ten post dnia 06.08.10 o godzinie 14:47
Tomasz Niewolik

Tomasz Niewolik
Programista/Projekta
nt

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

W sumie to rzeczywiście z tematem wątku to już nie ma to nic wspólnego :-) Temat oddzielny może być chociaż ciężko coś dodać. Może inne osoby przedstawią swoje doświadczenia w temacie testów?
Mariusz P.

Mariusz P. Specjalista ds.
Rozwoju

Temat: Dodanie lub zmiana wartości klucza w pliku XML - klasa...

W sumie rozwiązałem to tak, że ładuję to co mam w pliku xml do tablicy hashtable (poprzez loadFromXML). Gubiło mnie to, że otwierałem naraz dwa strumienie do tego samego pliku (pewnie banalny podstawowy błąd). Proste i nie wymagające dodatkowych bibliotek (choć są ciekawe to jednak myślę, że nadadzą się do większych i poważniejszych zastosowań).Mariusz P. edytował(a) ten post dnia 09.08.10 o godzinie 13:07

Następna dyskusja:

BDJ i XML




Wyślij zaproszenie do