Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przekazywanie ustawień - klasa czy tablica?
zurek
post
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 4.09.2007
Skąd: Kraków

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


Witam
Posiadam abstrakcyjną klasę Wykres i dzieci tej klasy np. Wykres słupkowy, Wykres belkowy, Wykres liniowy itd. Teraz do utworzenia każdego z tych wykresów potrzebuję określonego zbioru opcji, z których tylko nieliczne być może będą wspólne dla wszystkich wykresów. Mój problem dotyczy wyboru jednego z rozwiązań sposobu dostarczenia tych opcji, które przyszły mi do głowy:
1. W każdej klasie zdefiniuję domyślną tablicę z ustawieniami, która będzie miała postać:
  1. $settings = array(
  2. 'chart' => array(
  3. 'background' => '#FFFFFF',
  4. 'marginTop' => 40
  5. ),
  6. 'values' => array(
  7. 'showValues' => TRUE
  8. )
  9. //... itd
  10. );

Edit: 2. Upakowanie wszystkich ustawień do osobnych zmiennych/tablic.
3. Napiszę abstrakcyjną klasę WykresUstawienia, która będzie zawierała wszystkie wspólne ustawienia oraz funkcje umożliwiające nimi zarządzanie oraz szereg klas, które będą dziedziczyły z tej klasy. Każdy wykres będzie miał osobną klasę ustawień.

Wydaje mi się, że pierwsze rozwiązanie jest lepsze i pisanie osobnych klas ustawień dla każdego rodzaju wykresu jest stratą czasu. Tak czy owak widziałem już parę różnych projektów na tym forum i pisanie osobnych klas ustawień wydaje się mieć jakiś sens (IMG:style_emoticons/default/smile.gif)

Proszę o pomoc w rozwiązaniu mojego małego problemu. Dzięki za pomoc.

Ten post edytował zurek 9.08.2012, 00:44:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A nie pomyślałeś o klasie z dynamiczną liczbą własności w przykładowym stylu:
  1. class Configuration
  2. {
  3. protected $_config;
  4. public function __construct()
  5. {
  6. $_config = array();
  7. };
  8. public function __destruct()
  9. {
  10. $_config = NULL;
  11. };
  12. public function get($name)
  13. {
  14. if(is_string($name))
  15. {
  16. if(array_key_exists($name, $_config))
  17. {
  18. return $_config[$name];
  19. }
  20. else
  21. {
  22. throw Exception('Brak własności o takiej nazwie');
  23. }
  24. }
  25. else
  26. {
  27. throw Exception('Nazwa nie jest stringiem');
  28. }
  29. };
  30. public function set($name)
  31. {
  32. if(is_string($name))
  33. {
  34. $_config[$name] = $value;
  35. }
  36. else
  37. {
  38. throw Exception('Nazwa nie jest stringiem');
  39. }
  40. };
  41. }
  42. $konfiguracja1 = new Configuration();
  43. $konfiguracja1.set('klucz1', array('klucz' => 'wartosc'));
  44. $konfiguracja1.set('klucz2', 'wartosc2');
  45. $konfiguracja2 = new Configuration();
  46. $konfiguracja2.set('klucz1', 5);
  47. $konfiguracja2.set('klucz2', 2.897);
  48. $konfiguracja1.get('klucz1');

Oczywiście można też inaczej, ale to pozwala robić wiele obiektów tej samej klasy z różnymi własnościami i dynamicznie modyfikowalnymi. Do tego można zmienić konstruktor pod wymagania i całą klasę rozszerzać też jak chcesz. Możesz dorzucić jeszcze funkcję clone by tworzyć mnóstwo obiektów tych samych czy do debugu __toString machnij (IMG:style_emoticons/default/smile.gif)

Tylko że w takim podejściu możesz jedynie klucze 1 rzędu wyciągać oraz ustawiać. Jeśli są one tablicą to musiałbyś zmodyfikować funkcje dostępu by obsłużyły one i to. Przykładowo w formie
$obiekt.get('klucz1rzedu.klucz2rzedu.klucz3rzedu');
co byłoby równoznaczne z dostępem do elementu:
$obiekt._config['klucz1rzedu']['klucz2rzedu']['klucz3rzedu'];
Tylko trzeba pamiętać, że . może też oznaczać dostęp do własności obiektu, jeśli wartość klucza jest obiektem. Rekurencja w tym wypadku byłaby wskazana.
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: 12.10.2025 - 02:08