Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [C++/Java]Przechowywanie parametrów aplikacji graficznej
MateuszS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Witam, mamy taką często sytuację że w programie graficznym mamy coś takiego jak "Opcje", "Parametry" czy coś w tym stylu. Wpisujemy je np. w różnych inputach, textareach, radio buttonach a potem zapisujemy ustawienia. Dostęp do tych ustawień musi być z całego programu, z każdej klasy, która ich wymaga. Często jest tak że te klasy są gdzieś bardzo głęboko w hierarchii i nieodpowiednim jest pisanie czegoś takiego

Kod
//taki glupi przyklad
options = UI->getOptions();
UI->dom->parter->pokoj->krzeslo->setOptions(options)


Wiem że takie rozw. jak powyżej jest nieeleganckie i łamie zasady programowania obiektowego. Drugim rozwiązaniem może być przechowywanie tych ustawień w klasie statycznej i prosty dostęp za pomocą Opcje::parametr1. Jednak to mimo że wygodne, ponoć też jest niepoprawne (zalatuje zmiennymi globalnymi rodem z C).

Jaki jest wg Was najlepszy sposób na przechowywanie i przekazywanie tych danych? Lub ogólniej, jeżeli klasa "krzesło" (z powyższego przykładu) potrzebuje jakiejś danej z klasy "UI", to jak mu ją przekazać w najbardziej elegancki sposób?

Pozdrawiam

Ten post edytował MateuszS 22.11.2013, 19:27:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
lukasz1985
post
Post #2





Grupa: Zarejestrowani
Postów: 205
Pomógł: 43
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----


Cytat
Cytat
Chodzi o to, ze kazdy element UI przetrzymuje referencje do rodzica, czyli "krzesła zna pokój"" w ktorym się znajduje, "pokój" zna "dom" a "dom"


Ale czy przypadkiem wtedy nie mamy wężyka w drugą stronę?


Właśnie nie. Zapomniałem powiedzieć o kilku sprawach.
Wyobraź sobie taki układ klas (pisane łamaną Javą):

  1. class Kompozyt{
  2. Kompozyt rodzic;
  3. UI ui; // Ui do którego należy ten kompozyt
  4. Kompozyt pobierzRodzica() {
  5. return rodzic;
  6. }
  7.  
  8. Lista<Kompozyt> dzieci = new Lista<Kompozyt>(); //Lista kompozytów - dzieci
  9.  
  10. protected void dodajDziecko(Kompozyt noweDziecko) {
  11. dzieci.dodaj(noweDziecko);
  12. noweDziecko.ustawRodzica(this);
  13. }
  14.  
  15. void ustawRodzica(Kompozyt nowyRodzic){
  16. rodzic = nowyRodzic;
  17. }
  18.  
  19. void ustawUI(UI noweUI) {
  20. ui = noweUI;
  21. }
  22.  
  23. UI pobierzUI() {
  24. Kompozyt biezacyRodzic = this;
  25. do{
  26. if (biezacyRodzic instanceof UI) {
  27. return (UI) biezacyRodzic; // rzutowanie typów
  28. } else {
  29. biezacyRodzic = biezacyRodzic.pobierzRodzica();
  30. }
  31.  
  32. } while(biezacyRodzic != null); // przerwanie pętli jeśli rodzic jest null.
  33. }
  34.  
  35.  
  36. }
  37.  
  38. class UI extends Kompozyt {
  39. Ustawienia ustawienia;
  40. Ustawienia pobierzUstawienia(){
  41. return ustawienia;
  42. };
  43.  
  44. @Override // metoda nadpisana
  45. void dodajDziecko(Kompozyt dziecko) {
  46. super.dodajDziecko(dziecko); // wywołanie tej samej metody klasy kompozyt
  47. dziecko.ustawUI(this);
  48. }
  49. };
  50.  
  51. class Krzesło extends Kompozyt{};
  52.  
  53. class Dom extends Kompozyt{};
  54.  
  55.  
  56. // A teraz kod który operuje na tych klasach
  57. public static void main(String[] args) {
  58. UI ui = new UI();
  59. Dom dom = new Dom();
  60. Krzesło krzesło = new Krzesło();
  61. ui.dodajDziecko(dom);
  62. dom.dodajDziecko(krzeslo);
  63.  
  64. boolean test = (ui == dom.pobierzUI()); // Zwróci true;
  65.  
  66. }
  67.  



Chodzi o to, że teraz każdy obiekt może wywołać UI, kiedy tego będzie potrzebował, jedynym warunkiem jest to, że gdzieś w tej hierarchii obiektów w kompozycji musi być obiekt typu ui, bo na przykład gdyby użyć tego kodu:
  1. public static void main(String[] args) {
  2.  
  3. Dom dom = new Dom();
  4. Krzesło krzesło = new Krzesło();
  5.  
  6. dom.dodajDziecko(krzeslo);
  7.  
  8. boolean test = (null == dom.pobierzUI()); // Zwróci true;
  9.  
  10. }
  11.  


Więc tutaj nie ma wężyków i nie ma modułu w globalnej przestrzeni.



Co do twojej koncepcji i Qt - nie znam Qt ale pytanie brzmi: kiedy będziesz potrzebował dostępu to ustawień?
Chodzi o to, ze mógłbyś nadpisać metody, a pewnie takie są, które są wykonywane w momencie dodawania elementów do okna lub rodzica - kontenera lub podczas wyświetlania. I w nich wykonywać kod odpowiedzialny za odczytywanie ustawień. W twoim przypadku punkt musiałby dziedziczyć po czymś takim ja QWidget i nadpisać jakąś metodę, która jest wywoływana w momencie dodania/wyświetlenia tego punktu - jaka to metoda - nie wiem - to znajdziesz pewnie w dokumentacji.








I jeszcze jedna prosta rada: jeśli masz n punktów w ramce, która jest w okienku to jeśli potrzebujesz iterować te punkty.. nie rób tego z poziomu okna.
Czyli nie rób czegoś takiego:

W klasie "Okno" zawierającej pole "ramka"
for(int i = 0 ..... i++) {
punkt = ramka->punkt[i];
... operacje na punkcie ...
}



postaraj się takie iteracje i tym samym wszystkie operacje zawrzeć w klasie która zawiera punkty bezpośrednio:



W klasie Ramka:
void metoda() {

for(int i = 0 ..... i++) {
punkt ->punkt[i];
... operacje na punkcie ...
}
}

W klasie Okno:
ramka->metoda();



Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 10:28