Program łatwy do zmian i rozbudowy

0

Główną klasą(z main) jest formatka(gui) z której wywoływane są różne funkcje np otwórz(który otwiera dany plik).

Jak "poustawiać" klasy tak żeby można było dodać obsługę jakiegoś formatu bez konieczności zmiany czegokolwiek w już istniejący kodzie?

Przykład: Program otwiera plik txt, chcę żeby otwierał jpg więc dopisuje oddzielną klasę która implementuje otwórz, tak, że ten sam przycisk robi co innego w zależności od formatu, ale ja nie muszę w klasie głównej dopisywać warunku sprawdzającego format.

Jak na razie mam tyle:

public abstract class Core {
   protected BufferedReader file;
    
public abstract void open();
//abstract void save();
} 
public class Format1 extends Core {

    @Override
   public void open() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
 
public class GUI extends javax.swing.JFrame 

Kłopot w tym, że główna klasa nie widzi funkcji Core.open().

0

Jak to nie widzi? Masz obiekt klasy Core i nie możesz na nim wywołać open()?

0

Jeżeli zrobię obiekt klasy core w klasie GUI, to będę tam musiał zdefiniować funkcję open(), a ona ma być zdefiniowana w klasach formatów.
Mogę zrobić obiekt klasy Format1 i na nim wywołać open, ale wtedy w GUI musiałbym już znać format.

0

A więc co? GUI ma sobie automagicznie dobrać odpowiednią implementację klasy Core?

Co ty w ogóle chcesz osiągnąć? Żeby po zdeployowaniu aplikacji można było dodawać formaty? To przypomina funkcjonalność wtyczek. Klepiesz osobne projekciki, pakujesz do JARków i umieszczasz w katalogu wtyczki, a potem program przy ładowaniu skanuje wtyczki i je ładuje :)

0

Ja bym zdefiniował interfejs dla tych klas obsługujących różne formaty i dodatkowo stworzył jeszcze jedną klasę ze statyczną metodą getLoader i przyjmującą jako argument rozszerzenie pliku, a zwracającą już odpowiednio dobrany obiekt. Dodając formaty wystarczy poprawić tą funkcję fabryczną i napisać klasę implementującą ten interfejs dla nowego rozszerzenia.
To jest bodajże wzorzec fabryka czy jakoś tak ;)

edit: albo zamiast tej klasy fabryki i interfejsu klasa abstrakcyjna z metodą statyczną getLoader

0

@byku_guzio
Dzięki.
O wzorcu poczytam.
Funkcja statyczna w klasie Core chyba faktycznie rozwiąże problem, bo z GUI ją zawsze odpalę, a w Core pobrałbym rozszerzenie i użył odpowiedniej klasy potomnej.

@Wibowit
Dzięki.
Pomysł z pluginami jest fajny, mógłbym sobie zrobić program który nic nie robi, i tylko zmieniać mu pluginy w zależności od potrzeb.

0

a może łatwiej? chcesz otworzyć plik w zależności od jego rozszerzenia, twój program po otwarciu tego pliku stara się go zinterpretować - jeżeli udało się, to nie ma problemu, jak nie, to wystąpi błąd - warto zastanowić się nad obsługą błędów - zapewne jest to na 4programmers.net :)

0
Karton_niezalogowany napisał(a)

@Wibowit
Dzięki.
Pomysł z pluginami jest fajny, mógłbym sobie zrobić program który nic nie robi, i tylko zmieniać mu pluginy w zależności od potrzeb.

Taki program juz jest, nazywa sie JVM (Java Virtual Machine) i pluginy maja bardzo prosty kontrakt: wymagaja metody o sygnaturze public static void main(String[] args)

0

@::.
Faktycznie, za długo już kombinuję.

@MiM
Otworzyć w sensie wczytać i wykonać jakieś akcje, np dla jpg wyświetlić na panelu, a dla txt wyświetlić rozmiar.
W sumie to mógłbym wczytać wszytko jako strumienie, ale to by nie było za wygodne.

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