Uproszczenie zadania

0

Witam mam pewien problem który nie wiem za bardzo jak ugryźć.Z góry proszę o nie czepianie się pseudokodu oraz nazewnictwa, po prostu piszę skrótami. Do rzeczy:

Powiedzmy że mam 5 klas:

Client - klient
WarehouseEmp - pracownik magazynu
BiuroEmp - pracownik biurowy
Manager
Administrator

Każda z tych klas ma inne uprawnienia (czyli metody/funkcje) - przykładowo:
Klient - edycja profilu, przeglądanie produktów, robienie zakupów
Pracownik magazynu - to samo co klient + kontrola stanów magazynów(kontrola ilości istniejących produktów)
Pracownik biurowy - to samo co pracownik magazynu + dodawanie/zarządzanie nowymi typami produktów
Manager - to samo co wyżej + wyznacznie zadań pracownikom różnego szczebla, więcej uprawnień kontroli produktów i zarządzania nimi
Administrator - to samo co wyżej + kontrola kont - tylko admin może dodawać/usuwać/edytować konta pracownicze.

Jeśli chodzi o klasy pracownicze to nie mam problemów z uproszczeniem kodu - korzystam z dziedziczenia oraz metod/klas generycznych.

Mam natomiast problem z metodami - ponieważ dla każdego typu usera(klasy) musiałbym napisać osobną funkcję sterującą lub napisać wszystko w jednej funcki lecz z warunkami:

Pseudokod:

public void mainMenu(){
	
	switch(userType)
		{
			case Client:{
					// petla while + wybor jednej z poniższej  opcji		
					editProfile();
					showProducts();
					.
					.
					.
				}
			case WarehouseEmp: {
				//petla while + wybór jednej z poniższej opcji
				editProfile();
				showProducts();
				
				addProduct();
				editProduct();
				deleteProduct();
					
			}
			
			case BiuroEmp{
				////petla while + wybór jednej z poniższej opcji
				editProfile();
				showProducts();
				
				addProduct();
				editProduct();
				deleteProduct();
				
				ManageNewProducts();
			}
			.//i
			.//tak
			.//dalej

Jak widać znaczna część kodu się powtarza a teraz załóżmy, że nie mamy 5 klas tylko 500 tak więc potrzebuję pomysłu jak to uprościć? Dla jednej klasy wygodnie było mi użyć enum jako funkcji wewnętrznej aczkolwiek jako że enum nie ma możliwości dziedziczenia odpada. Tak samo typy generyczne. Czy da się to jakoś uprościć aby nie kopiować kodu w każdym casie?

0

A czemu każdy typ nie może implementować jakiegoś interfejsu z metodą handleMenuInteration()? Wtedy w twoim main po prostu wołasz tą metodę na obiekcie a obiekt już sam się martwi jak obsługiwać to swoje menu. Klasyczny polimorfizm.
Idźmy dalej, chcesz mieć tam wspólny kod, to też jest do zrobienia, bo przecież masz tam wszędzie:

while(...){
    displayOptions();
    readOption();
    fireOption();
}

Załóżmy teraz że masz w tych swoich klasach metodę która zwraca ci List<Action> a każde Action ma referencje do metody którą wywołuje (jakieś callable czy runnable), oraz swoją nazwę. Możemy więc zrobić:

while(...){
    getActions().forEach(Action::displayName());
    int index = readOption();
    getActions().get(index).call();
}

i voila. Teraz każda z tych klas musi tylko dostarczyć listę swoich akcji, a tego już się ominąć nie da. Reszta kodu jest wspólna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1