Variableninhalte dynamisch abfragen

MiMa

Top Contributor
Hallo,
ich bräuchte mal einen Gedankenanstoss, wie man Inhalte einer Variablen dynamisch abfragen kann. Hier mal eine Beschreibung
Code:
inhalt enthält den zu untersuchenden String
Wenn der Inhalt LieferantenXX enthält dann (switch Anweisung)
     "Lieferant A" Dann rufe die Funktion Lieferanten mit Parameter A auf
     "Lieferant B" Dann rufe die Funktion Lieferanten mit Parameter B auf
     "Lieferant C" Dann rufe die Funktion Lieferanten mit Parameter C auf
     ...
     ...

Ich könnte das Problemlos mit einer Switch Anweisung lösen, möchte aber nicht immer den Quellcode bearbeiten, wenn weitere Lieferanten hinein kommen.

Ich hatte auch schon daran gedacht eine Lieferantenliste im Textformat zu speichern, die komma getrennt die Lieferanten enthalten. Diese könnte ich dann erweitern, ohne den Quellcode zu verändern. Da mir das aber als Steinzeit Zeitalter vorkommt, wollte ich mal nachfragen, wie man das elegant löst.
Danke
M.
 
Code:
Lieferanten mit Parameter A
Lieferanten mit Parameter B
Lieferanten mit Parameter C


Wichtiger ist zu wissen welcher Datentyp der Parameter deiner Lieferanten Methode besitzt. Ist diese ein String? Wenn ja kannst du die Stelle einfach parsen und das dann übergeben. Ansonsten kommst du an Kontrollstrukturen nicht drum herum. (Irgendwo musst du dann doch die Unterscheidung machen)

Ich vermute aber einfach mal dass du einen komplett ineffektiven Ansatz für dein Problem gewählt hast. Fragen sollten allgemein so gestellt werden, dass sie dir nicht bei der Umsetzung eines Lösungsweges helfen, sondern das finden einer Lösung zu dem Problem. Da fügst du dann dein Lösungsvorschlag hinzu sodass die Option besteht, dass weitere Lösungswege offen bleiben. Es sei denn es ist wirklich zwingend notwendig diesen Lösungsweg zu wählen. Nur mal als Randbemerkung.
 
Was ist denn der Unterschied zwischen Parameter A, B und C und zwischen den Lieferanten A,B,C?

Vermutlich passen entweder Polymorphie oder Map
 
Ich nehme mal ein anderes Beispiel.
Es werden Dateiinhalte in eine String Variable gespeichert, die es zu untersuchen gilt.
Dabei versuche ich zu bestimmen, um welchen Dateiinhalt es geht.
Ein eBook enthält eine Markante Informationen, die zu einem elektronischen Printmedium gehören.
Eine Rechnung enthält wiederum andere Informationen, usw.

Der grobe Ablauf des Programmes ist wie folgt
Code:
Start
Array mit Liste allen Dateien aus einem Verzeichnis
Holt eine Datei aus der Liste
Prüft den Dokumentenuntertyp über das MIME Verfahren (pdf, epub, ...)
Bestimmung des Dokumenteninhaltes über die Klasse PDF(derzeit statisch)
     ebook, wenn Inhalt den String "ISBN"  enthält, dann
           wird die ISBN entnommen und auf Gültigkeit geprüft, weitere Verarbeitung als eBook
     Rechnung, wenn Inhalt die Strings "Rechnung" && "Betrag" enthalten, dann
          weitere Verarbeitung als Rechnung
     .....
          .....

Der Java Code sieht derzeit so aus.

Java:
...
...
// Dateiverarbeitung durch DateiUnterTyp
  switch (dateiObjekt.getDateiUnterTyp()) {
  case "pdf":
  System.out.println("Die Datei ist ein PDF");
  // Erstellen eines PDF Dateiobjektes mit den Startparametern
  PDF pdfDatei = new PDF(dQuelle, dZiel, dOcr, dBild,
  dOhneDokumentart, dLoeschen, dEinstellung);
  
  // Dateinhalt einlesen
  pdfDatei.setDateiInhalt(Datei.sucheDateiInhalt(dateiObjekt.getDatei()));
  
  // Prüfen des Inhaltes auf mögliche Dokumentinhalte
  PDF.erkennePdf(pdfDatei);
  ...
  ...

Java:
// Klasse PDF
public static void erkennePdf(PDF pdfDatei) throws IOException, TikaException, ParserConfigurationException, SAXException, SQLException, ParseException
  {
  // Prüft den Inhalt auf ein Buch
  Buch.pruefeAufBuch(pdfDatei);

  // Prüft den Inhalt auf Rechnung
  Rechnung.pruefeAufRechnung(pdfDatei);
  ...
  ...
  } // erkennePdf

Java:
// Klasse Buch
public static void pruefeAufBuch(PDF pdfDatei)
  throws ParseException, IOException, FileNotFoundException, TikaException
  {
  if (pdfDatei.getDateiInhalt().contains("ISBN")
  && pdfDatei.getDateiInhalt().contains("978"))
  {
  System.out.println("Es wurde ein deutsches eBuch erkannt");
  
  System.out.println("\nDie Textlänge hat " + pdfDatei.getDateiInhalt().length() + " Zeichen");
  // Prüft den Inhalt auf eine plausible ISBN und ermittelt alle Daten zum Buch
  // BuchInhalt.erkenneBuch(datei, textInhalt);
  // Metadaten von DNB abfragen
  // Metadaten in PDF einbetten
  // eBook umbenennen und verschieben
  // Metadaten und Pfade in MYSQL Datenbank schreiben
  } // prueft Buchinhalte
  } // pruefeAufBuch

Überlegt habe ich mir, die Dokumentartbestimmung in eine komma basierende Textdatei aus zu lagern. Dann ist mir noch eingefallen, das man es vielleicht in eine strukturierte XML Datei abspeichert. Da es sich um ein Programm ohne GUI handelt und auf einem Dateiserver laufen soll, werden Dateien ohne erfolgreiche Dokumentartbestimmung in einem gesonderten Verzeichniss auffangen. Diese Dateien sollen dann über eine Clientanwendung in eine Dokumentartbestimmung eingefügt werden.
 
Chain of Responsibility 😉

Zumindest so in der Art. Jeweils pro Datei-Typ eine Klasse, die diesen erkennt, und dann für jeden Inhalt eine Klasse, die damit umgehen kann.


Klingt aber schon recht anders, als das Lieferanten-Beispiel 😉
 
Danke, werde mir das Design Pattern ansehen.
Wäre also die XML-Methode die bessere Wahl oder vielleicht auf eine mySQL Datenbank zugreifen. Da das Programm sowieso eine mySQL Datenbank für die Verwaltung der Datein verwendet, könnte man Programmeinstellungen und Dateidefinitionen auch darüber abwickeln?
 
Was willst du da denn extern speichern?

Das Erkennen, was für eine Datei es ist, ist Programmlogik, die kann man schlecht auslagern (außer man nutzt irgendeine Schriftsprache dafür, würd ich aber nicht).
 
In der Datenbank wird der Dateipfad, und alle Metadaten des PDFs gespeichert. Bei Rechnungen werden andere Metadaten gespeichert. Die Clients sollen später Platformübergreifend die Dateimanager ersetzen. Es ist einfacher und schneller Dateien über eine Datenbank zu filtern als das ständige zugreifen durch das Dateisystem.

Das erkennen der Datei ist klar, aber das erkennen um welchen Inhalt es geht, kann ein Programm kaum alleine entscheiden, dafür benötigt man schon ein paar Anhaltspunkte, und die würde ich als Dokumentart bezeichnen. Dafür müssten ein paar Angaben für jede Dokumentart gespeichert werden, damit das Programm diese zuordnen kann, wie ein Buch eine ISBN Nummer besitzt.
 
Zuletzt bearbeitet:
Das erkennen der Datei ist klar, aber das erkennen um welchen Inhalt es geht, kann ein Programm kaum alleine entscheiden, dafür benötigt man schon ein paar Anhaltspunkte, und die würde ich als Dokumentart bezeichnen. Dafür müssten ein paar Angaben für jede Dokumentart gespeichert werden, damit das Programm diese zuordnen kann, wie ein Buch eine ISBN Nummer besitzt.
Genau diese Angaben kann man kaum speichern, weil die viel zu Dokumentspezifisch werden dürften.
Selbst das Erkennen des Buches anhand von "ISBN" wird komplexer werden, als nur ein contains("ISBN"), damit würde auch dieser Thread hier als Buch erkannt werden. Und eben diese notwendige Logik kann man nicht in simplen Regeln fassen (oder landet dann wieder bei Scriptsprachen)
 
Ja natürlich, einfach nur nach ISBN schauen und du bist dann ein Buch ist nicht gerade die tollste Lösung. Ich habe schon viele Lösungen probiert welche mich aber nicht besonders befriedigt haben. Das war auch der Grund mal nach anderen Meinungen zu fragen.
Dezeit ist es so, wenn ich das Schlüsselwort ISBN im Dateiinhalt gefunden habe, werden alle ISBN Nummern herausgezogen und auch auf Echtheit geprüft. Die ISBN Nummern die übrig bleiben werden zur DNB Datenbank gesendet und die zurückgelieferten Metadaten werden mit dem Inhalt gegen geprüft. So erkenne ich dann das richtige Buch. Es kann ja auch vorkommen das man eine Datei hat die ein Magazin ist die mehre ISBN Nummern von Büchern enthält.
 
Ich habe noch ein bischen Recherchiert und man könnte ein paar Regeln für Dokumentarten defineren und dazu dass Framework Lucene benutzen.
 

Neue Themen


Zurück
Oben