![]() |
![]() |
![]() ![]()
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 |
|
|
![]() |
![]()
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ą):
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:
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(); |
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 10:28 |