![]() |
![]() |
![]() ![]()
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%) ![]() ![]() |
W zmiennych globalnych nie ma nic złego. Naczytałeś się bzdur pseudo-profesjonalistów lub pracowników Google.
W programowaniu w takich językach jak Java / C# nie ma innych metod do tworzenia modułów jak użycie zmiennych statycznych / singletonów. Jedyną alternatywą jest odwrócenie zależności (Dependency Inversion/DI) co jest rozwiązaniem chorym umysłowo jeśli się temu bliżej przyjżeć. To co ja bym zrobił to: W C++ stworzył zmienne globalne "ustawienia" i "ui" i używał ich tam gdzie potrzeba. W Javie stworzył klasy Ustawienia i UI i dał im pola "public static Ustawienia ustawienia" i "public static UI ui" przechowujące pojedyncze instancje tych klas, i w celu dostępu do nich używałbym importów statycznych . Wewnątrz obiektów, które są elementami kompozycji danego modułu odwoływał bym się bezpośrednio do zmiennej globalnej / statycznej. Nie ma czegoś takiego jak nieeleganckie rozwiązanie. Wszystko zależy od skali aplikacji, która musi być przewidziana na samym początku. Przede wszystkim przy aplikacjach stacjonarnych DI się nie sprawdza, chociaż może to być idealne rozwiązanie dla aplickaji internetowych. Jeśli chcesz się jednak męczyć z DI/fabrykami, głupimi frameworkami DI typu Guice to droga wolna. Jeszcze raz - zmienne globalne nie są złe, kiedy się wie, jak ich używać. Przede wszystkim w przestrzeni globalnej mogą leżeć typy wysoko abstrakcyjne, takie jak UI / ustawienia / menedżer zasobów czy obecny plik na którym pracujemy (jeśli zakładać że aplikacja pracuje na jednym pliku w czasie jej wykonywania), natomiast nie prymitywne typy int, float czy string. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 17.10.2025 - 03:10 |