OOP Wie macht man das am besten OO?

Ocean15

Aktives Mitglied
Guten Tag liebe Java Menschen!

Ich habe ein kleines OOP Problem.
Und zwar Programmiere momentan ein eigenes Log System für mein Programm (Ich weiß es gibt schon fertige, aber ich wollts halt mal selber machen :bae🙂. Nun habe ich mich etwas an der Standardklasse von Sun orientiert und mir ne Klasse Logger und Formatter gemacht. Soweit funktioniert alles super. Formatter is abstract und hat "getHead", "getTail" und "format(Level, message, Millisekunden)" als Methoden. für den Log. Der Logger hat Methoden wie severe und info usw.

Soooo... soweit sollte es hoffentlich verständlich sein. Um es auf den Punkt zu bringen:
Jetzt hab ich z.B. einen speziellen Formatter für HttpRequest Responses. Da bräuchte ich "format(HttpResponse)" oder "format(Level, Message, Millisekunden, URI, RequestTyp)". An sich ja kein Ding ne neue Methode zu machen aber mich stört das irgendwie OO technisch. Der HttpRequestFormatter is ja ein spezieller Formatter nur kann der Logger ja auf einmal nicht mehr wissen, dass er ne andere format Methode nutzen soll. Und die alte format Methode muss ja implementiert werden (is ja abstract) obwohl sie total Sinn frei ist.

Ich find es einfach irgendwie unschön so aber ich weiß nicht wie ich das OO schön lösen kann. Jemand irgendwelche Ideen?

LG
Ocean15

PS.: Hoffe man kann es einigermaßen verstehen 😳
 
Zuletzt bearbeitet:
Deinen zweiten Block solltest du eventuell nochmal verständlicher schreiben.

Das was ich verstanden habe ist, du willst keine weiteren Methoden erstellen für deine Formate ?
 
Naja es ist ja so:

Ich habe eine Klasse Formatter (abstract). Diese wird vom Logger genutzt (z.B. die format Methode). Der Logger kennt halt die Standardmethoden des Formatters. Jetzt habe ich aber eine Unterklasse von Formatter (HttpResponseFormatter) die ja rein logisch ein Formatter ist (Also extends Formatter). Nun brauch ich aber bei dem besonderen Formatter andere Parameter in der format Methode. Wie mach ich das OO am sinnvollsten? Ich meine es is ja immer noch ein Formatter. Ein besonderer. Nur kann ich den Standard Formatter nicht wirklich drauf anwenden.
Klar.. Programmiertechnisch einfach ne neue Klasse die nicht erbt. Ist ja ganz einfach, aber das erscheint mit OO irgendwie total schlecht.
 
Für mich enthält dein Post zu wenig greifbare Informationen, um einen Ratschlag geben zu können.
Was ich an Informationen nützlich fände:
1. Liste aller Methode deiner Formatter-Klasse inkl. korrekter Angabe der Parametertypen. Deine fühere Angabe "format(Level, message, Millisekunden)" ist mir zu ungenau. Von welchem Typ ist "message"? Ein String oder was komplexeres?
2. Liste der Methoden deiner Logger-Klasse.
3. Einen konkreten Fall, wie du deine Kombination aus Logger und Formatter verwendest.

Wenn du einen Log-Eintrag zu einem HttpResponse erzeugen möchtest, musst du dazu ja irgendeine Methode von vermutlich deinem Logger aufrufen, der dann wiederum eine Methode vom Formatter aufruft. Entweder du extrahierst vor diesem Methodenaufruf alle relevanten Informationen aus deinem HttpResponse, packst sie in einen String, und rufst damit den Logger auf, oder du denkst dir für dein Message-Objekt etwas komplexeres aus als ein einfacher String, z. B. eine Klasse Message mit den Unterklassen StringMessage und HttpResponseMessage, rufst damit den Logger auf, der das Message-Objekt an den Formatter weiterleitet, und prüfst dann in der format-Methode von HttpResponseFormatter, ob das übergebene Objekt vom Typ HttpResponseMessage ist, und wenn ja, holst dir die benötigten Information wie z. B. den HttpResponse daraus.
 
Okay.

Also der Formatter hat "String getHead()", "String getTail()", "String format(String message, Level Level, long millis)". (Level ist das Log Level, den auch der Standard Sun Logger nutzt.

Der Logger hat eigentlich nur die Log Methoden wie "void severe(String message)", "void info(String message)" usw.
In den Methoden passiert immer das gleich: "log = log + formatter.format(message, Level.SEVERE, System.currentTimeMillis())", wobei "log" ein einfacher String ist.

Beim Konstruktor vom Logger wird einmal "log = formatter.getHead()" aufgerufen.
Das ist auch eigentlich schon das ganze Prinzip dahinter.

Nur brauche ich dann z.B. einen besonderen Logger mit "void severe(HttpResponse)" und dazu einen entsprechenden Formatter mit "String format(HttpResponse)". Einfach einen String aus dem HttpResponse basteln geht auch nicht, da die einzelnen Werte vom HttpResponse im Formatter in verschiedene Tabellen (Die Formatter erzeugen teilweise Html Code) eingetragen werden. Da kann ich nicht einfach aus dem HttpResponse ein String mit den Infos machen, ohne das formatieren direkt zu übernehmen.

Wie gesagt an sich kann ich das natürlich ganz einfach programmieren mit 2 neuen Klassen, aber das wäre ja dann nicht wirklich OO. Aber der Ansatz mit dem Message Objekt klingt nicht schlecht. Ich denk mal drüber nach, ob sich das realisieren lässt.

PS.: Grats zum 100. Top 😉
 
Zuletzt bearbeitet:
Du kannst auch ein FormatMessage mitschicken.
Java:
format(FormatMessage message) {
  if(message instanceof HttpFormatMessage) {

  }
}

-> HttpFormatMessage extends FormatMessage
-> NormalFormatmessage extends FormatMessage

Davon abgesehen, sehe ich dein Problem nicht ... Wenn jemand lediglich "format(Level, Message, Millisekunden)" aufruft, dann möchte er evtl. nur ganz normal formatieren oder du bietest eine Alternative an ...

format(Level, Message, Millisekunden) => format(Level, Message, Millisekunden, null, null) bzw. super.format(Level, Message, Millisekunden)
format(HttpResponse) => format(Level, Message, Millisekunden, URI, RequestTyp)
format(Level, Message, Millisekunden, URI, RequestTyp)
 
Habs jetz via LogMessage klasse gelöst, danke. Peinlich dass ich da nicht selbst drauf gekommen bin.
Naja Danke für die Hilfe!
 

Zurück
Oben