Mam kilka zestawów akcji (np. Kopiuj, wklej, cofnij, ponów, pokaż dokowalne okno XYZ, powiększenie itp.), Które Nie chcę duplikować w wielu lokalizacjach, ale są one udostępniane przez różne części GUI, takie jak menu główne, pasek narzędzi i menu z prawym przyciskiem myszy.Jaki jest najlepszy sposób udostępniania akcji między oddzielnymi klasami GUI (menu, paski narzędzi itp.)?
Jaki jest najlepszy sposób na ich udostępnienie? Używam Qt 5.3 z C++, ale jest to w większości niezależne od konkretnego środowiska GUI lub języka.
Niektóre możliwości:
wyznaczyć jedno centralne miejsce, powiedzieć główne okno, aby stworzyć wszystkie z nich z ich tekst, ikony, a zwrotnego. Następnie:
Przekaż akcje do konstruktora podczas tworzenia podskładników GUI. Może to spowodować, że konstruktor będzie wyświetlał długie listy.
Ustawianie wywołań w podskładnikach GUI po utworzeniu podskładnika i przekazywanie wszystkich niezbędnych działań. To sprawia, że konstruktor jest krótszy, ale na końcu wcale nie jest ładniejszy.
Dostawcy dostaw z głównego okna i mają podskładniki, aby uzyskać pożądane działania. Podkomponenty mają na ogół wskaźnik do głównego okna. To sprawia, że głównym oknem jest brak wiedzy na temat kogo obchodzi, które działanie, ale także ujawnia grupę publicznych członków (chyba że używam Attorney-Client idiom lub podobnego).
Dodaj je do osobnego, globalnego repozytorium, w którym główne okno dodaje je, a użytkownicy szukają ich według nazwy lub klucza lub czegoś w razie potrzeby. Jest to podobne do innych opcji, ale oddziela obawy nieco lepiej i eksponuje tylko jeden sparametryzowany getter, a nie garść konkretnych modułów pobierających. Minus: Dodaje globalny obiekt, do którego wszyscy uzyskują dostęp.
Zdefiniować działania w „głównym” przypadek użycia, powiedzmy, w menu głównym, a następnie mieć pobierające dla każdego innego. Lokalizuje je w jednym miejscu i oznacza, że główne okno będzie wymagało podania jednej funkcji pobierającej dla głównego menu. Ale nadal eksponuje grupę wewnętrznych członków jako publiczną.
Jakie jest najlepsze podejście? Czy jest coś lepszego, czego tutaj nie wymieniłem?
W odpowiedzi na twoje pytanie, muszą pojawić się w wielu miejscach, co oznacza, że wiele klas potrzebuje do nich dostępu. Twój drugi akapit sugeruje, że mój 1.1 lub 1.4 jest najlepszy. Oba mogą umożliwić wstrzyknięcie zależności. – metal
@metal tak, całkowicie poparłbym rozwiązanie 1.4, ułatwiłoby to również testowanie, sprawiając, że argumenty konstruktora sugerują, że są one obowiązkowe, co pomogłoby w utrzymaniu, jeśli obawiasz się, że wszystko zależy od jednego obiektu , dodaj interfejs, z którego obiekt może czerpać, to przynajmniej pozwoli na "plug and play" z różnymi implementacjami obiektu i złamie zależność kodu źródłowego między nimi. –