Menu i podmenu w aplikacji konsolowej

0

Witam, tworzę prostą aplikację konsolową , która ma za zadanie wybrać jeden z kilku szyfrów a następnie zaszyfrować lub odszyfrować daną wiadomość.
Przykładowo klasa Polybius zawiera dwie metody: encrypt() i decrypt().
Następną klasą jest PolybiusControl zawierająca metodę controlLoop() mającą na celu, wybrać opcję szyfrowania lub deszyfrowania.
Kolejna klasa to ControlApp zawierająca metodę controlAppLoop() wybierająca, który szyfr nas interesuje.

Dzięki temu rozwiązaniu otrzymalem bardzo czytelne menu konsolowe, niestety wadą tego rozwiązania jest powielanie do każdego rodzaju szyfru klasy PrzykładowySzyfrControl, de facto powielając kod.

Moje pytanie: Jak usunąć klasy SzyfrControl jednocześnie zachowując czytelność menu?

Po użyciu Interface efekt jest niezadowalający ponieważ opcja wybierz szyfrowanie i deszyfrowanie pojawia się już w Menu głównym.

Program szyfrujący za pomocą wybranych szyfrów
Wybierz jedną z poniższych opcji:
0 wybierz szyfr Polibiusz
1 wybierz szyfr Cezar
2 wybierz szyfr Atbash
Następnie zdecyduj czy chcesz zaszyfrować czy odszyfrować wiadomość:
3 wybierz szyfrowanie wiadomości
4 wybierz deszyfrowanie wiadomości
5 wyjście z programu

1

@pawelzzzz:

Nie opisuj (mgliście) kodu, ale go daj.

1
pawelzzzz napisał(a):

https://github.com/PawelZw/Encryptor2.0

Dziwny kod, w pierwszym kontakcie wydaje sie wiele ładniejszy od typowego tu podłączanego, ale po zaangażowaniu sie w czytanie okazuje sie paradoksalnie nie-obiektowy

Polecam któryś z wzorców funkcjonalnych, Strategia czy coś podobnego, który by zasilał funkcjonalnością jedną sztukę kodu kontaktu z użytkownikiem. *)

abstract class BaseCipeherControl {
    abstract public String getName();
    abstract public int getMenu();
    ... Cipher ....
}

BaseCipeherControl[] all = { new CipherControlAtbash(),  new CipherControlCaesar(), new CipherControlPolybius() }

Ewentualnie taką tablice przepisać do Map<Integer, BaseCipeherControl> dla celu zarządzania z menu

O ile dziedziczenie nie ma dobrej opinii, i typowemu początkującemu się je odradza, ale tutaj jest idealne do tego celu

*) ja nie jestem religijnym wyznawcą wzorców, można użyć wzorca Strategii nie wypisując tego na sztandarach, np w takim szkolnym dziedziczeniu jak w przykładzie

1

Tak sobie wróciłem po kawię do wątku ...

Innym lekarstwem co do samej idei menu, jest przejscie z okreslenia go seklwencyjnym kodem, na ujęcie deklaratywne

abstract class MenuItem{
   abstract public String getCaptiom() ;
   abstract public int getKey();
   abstract void execute();
   }

być może

abstract class ParentMenu : extends MenuItem {
     MenuItem[] getChildren();
     public final void execute() {
       wyświetlenie i operowanie na menu
     }
}

I znów tablica jako start całego interesu

main(){
   MenuItem[] menuSystem = { new ... }

   new MenuProcessor().exceuteMenu ( menuSystem )
 }
1

syf jest, niech te rodzaje algorytmów implementują jakiś wspólny interfejs i nie wpierniczaj tam scannera do nich

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