OO - Modellierung

fanta5

Aktives Mitglied
... Fortsetzung aus http://www.java-forum.org/java-basics-anfaenger-themen/167714-java-kompliziert-fuer-jedermann-3.html#post1058855


Wichtig ist für den Einstieg auf jeden Fall erstmal zu wissen das du alles, egal ob Real oder Fantasie auf Objekte abbilden kannst, egal ob es ein Auto, eine Person oder ein Raumschiff ist....... Klassen sind dabei der Bauplan und umschreiben/legen Fest welche Eigenschaften und Funktionen die Entitäten (Dinge) dann später haben müssen.

Diesen Satz halte ich für gleichermaßen wichtig wie auch schwierig. Und hier habe ich auch meine größten Problemchen, was OO angeht.
Angenommen, Du hast ein Programmiervorhaben, z.b. eine Kochrezeptedatenbankverwaltung.

User kann Rezepte eingeben, Zutaten, Kochanleitung.
User kann Kochrezepte lesen, bewerten, beantworten.

Wie würde man hier einen objektorientierten Einstieg finden? Wie könnte eine mögliche Modellierung aussehen? (Keine Sorge, ich will das nicht programmieren, ich will mir nur ein Bild bzgl. einer Modellierung eines Programmiervorhabens machen)

f5
 
Zuletzt bearbeitet:
Ich würde eine Klasse Rezeptdatenbank, welche eine Datenstruktur wie z.B. ein Array von Rezepten als Objektvariable hat implementieren. Rezept selber ist auch eine eigene Klasse sowie Zutaten und Kochanleitung.
Die Rezeptdatenbanksklasse hätte dann Methoden wie hinzufügen oder löschen.
Die Rezepte hätte Methoden lesen,bewerten und beantworten und hätte die Objektvariablen Zutaten und Kochanleitung, welche natürlich auch Methoden wie bearbeiten usw hätten.
Ich würde es lieber aufzeichnen, aber ich denke du kannst es dir auch so vorstellen.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Ich habe eine ähnliche App entwickelt, ich würde dir einen möglichst Atomaren Einstieg empfehlen , je nachdem worauf du hinaus willst.

User kann Rezepte eingeben, Zutaten, Kochanleitung.
User kann Kochrezepte lesen, bewerten, beantworten.

Wenn du hier ansetzt, und es Objektorientiert betrachten würdest könnte man folgendes schlussfolgern.

Du brauchst :
-Rezepte
--diese beinhalten Lebensmittel
---diese beinhalten Nährwerte
----diese Wiederrum haben Nährstoffe

Sprich du müsstest schauen wie klein die Bausteine ( deshalb Atomar ) du das ganze gestalten möchtest

Du könntest hergehen und sagen ich brauche also folgende dinge

Nährstoffe (Eiweiß, Kohlenhydrate, Fett)
-dieses wären dann jeweils 3 Klassen, welche als Attribut den jeweiligen Wert aufnehmen
--diese lassen sich zusammenfassen und man könnte daraus ein Nährstoffobjekt designen welches die 3 Werte enthält.

(hier könnte man wiederum eine Superklasse erstellen um attribute etc. nutzen zu können)

Java:
public class Whey{

private double value;

...
}

Java:
public class Nutrients{

private Whey whey;
private Carbs carbs;
private Fat fat;

...
}

dann könntest du Zutaten erstellen die jeweils als Attribut dieses Nährstoffobjekt besitzen.

Java:
public class Ingredient{

private String name;
private Nutrients nutrients;

...
}

und das kannst du dann auf deine Zutaten, Mahlzeiten und Rezepte abbilden, und diese vorgehensweise macht es dir später unfassbar einfach Erweiterungen und oder Änderungen durchzuführen da du alle Zuständigkeiten in jeder Klasse für sich kapselst. (Kapselung)

Wenn du dann noch einen Anständigen Entwurf und ein gutes Design deiner gesamten Applikation hast, und später im verlauf deiner Entwicklung mit Schnittstellen und co vertraut bist, wirst du wissen was ich damit meine, anfangs würde ich einfach erstmal drauf los programmieren bist du etwas lauffähiges hast, und dann wird refactored wenn du mehr Erfahrung hast und siehst wo du deinen Anwendung und vorallem deinen Code verbessern kannst, ansonsten wirst du ewig auf der Stelle treten, und da spreche ich aus Erfahrung :D denn sonst kommt irgendwann der Perfektionist in einem durch^^

PS: Was die Datenbank angeht, würde ich dir erstmal dazu raten dich rein auf die Anwendung an sich , anstatt auf die Persistente Speicherung deiner Objekte zu Konzentrieren, erst wenn deine Anwendung an sich funktioniert würde ich mich darum kümmern!

Wenn dann fang mit Serialisierung an, und steigere dich dann zu z.B einer MySQL Datenbank, da du hier in beiden fällen auch eine Ahnung von IO Operationen haben solltest, insofern du kein Framework verwenden willst und eben lernen willst wie die dinge von statten gehen :) Was ich persönlich für unfassbar wichtig erachte, anstatt sich nur auf die "Magic" zu verlassen.
 
Zuletzt bearbeitet:

consider

Mitglied
Zunächst steht am Anfang die Frage nach den Klassen die gebraucht werden, welche Eigenschaften diese haben und in welcher Beziehnung diese zueinander stehen. Man kann hier das Problem auf den kleinsten Nenner herunterbrechen und dann vom kleinen zum Großen arbeiten.

Wir brauchen also schon mal einen User, Rezepte, Zutaten, Anleitung, Komentare usw. Am Anfang wird man hier sicher so vorgehen, dass man die Anforderungen genau definiert und sich aufschreibt. Was soll wie gehen und, auch wichtig, was soll nicht gehen. Daraus ergeben sich dann letzllich schon die Objekte, deren Beziehungen zueinander und so weiter.

Anfangs wird man sich seine Struktur daraus selbst zusammenstellen, wird sicher Fehler machen. Später wird man bestimmte Problemstellungen immer wieder treffen und Entwurfsmuster dazu kennen und benutzen. Zum Beisiel riecht für mich eine "Verwaltung" immer stark nach "Composite" (muss nicht, aber trifft oft zu):

User hat Rezepte, Rezepte haben Zutaten und Beschreibungen, Zutaten und Beschreibungen haben wiederum Zutaten und Beschreibungen. Allesamt können sie bewertet werden usw. Das schreit geradezu nach Composite.

Kompositum (Entwurfsmuster) – Wikipedia

Anfangs wird man sich soetwas selbst erarbeiten und möglicherweise zu ganz ähnlichen Ergebnissen kommen. Mit fortschreitender Erfahrung kennt man viele typische Probleme, die bei bestimmten objektorientierten Aufgabenstellungen auf einen zukommen und die dazu passenden Designpattern (sowie deren Umsetzung). Dann geht es einfach nur schneller und zielsicherer von der Hand. (Oder um den Bogen zum verlinkten Thema zu schließen: Wenn man lange englisch spricht, kennt man eben alle Redewendungen irgendwann)

Fehler zu machen ist dabei aber Teil des Lernprozesses.
 
Zuletzt bearbeitet:

fanta5

Aktives Mitglied
Danke für die ausführlichen Antworten, die helfen mir schon sehr weiter.
Es klingt für mich rein von der Herangehensweise ein bischen so, wie eine Datenbank zu modellieren und normalisieren.

Also verstehe ich das soweit richtig, dass man das Gesamtprojekt in möglichst viele kleine Bausteine zerteilt und diese dann über OO wieder zusammenführt?

und diese vorgehensweise macht es dir später unfassbar einfach Erweiterungen und oder Änderungen durchzuführen da du alle Zuständigkeiten in jeder Klasse für sich kapselst. (Kapselung)

Ich glaube Dir das, aber es ist derzeit schwer, sich das konkret vorzustellen. Ich bin durchaus erfahren, was prozedurale Programmierung angeht, der Vorteil von Funktionen ist mir natürlich auch geläufig, sql-Modellierung sowie "Bedienung" sind mein "Alltag", aber in Sachen OO bin ich wirklich ein Newbie. Ich taste mich heran und erziehle erste "Verständnis-Duchbrüche", aber den ganz großen "Klick" hats bisher noch nicht gegeben ;-)

Deshalb finde ich die Antworten hier für mein Gesamtverständnis sehr wichtig.

f5
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
@fanta5

Hast du schonmal was von CRC-Cards gehört?

Bzw. mir wurde mal der Tipp gegeben, zuerst mein Problem im Fließtext zu formulieren, die Substantive sind dann mögliche Kandidaten für Klassen.
 

fanta5

Aktives Mitglied
@fanta5

Hast du schonmal was von CRC-Cards gehört?

Bzw. mir wurde mal der Tipp gegeben, zuerst mein Problem im Fließtext zu formulieren, die Substantive sind dann mögliche Kandidaten für Klassen.

Guter Hinweis, danke.
Wobei ich nach erster Inspektion die Existenz der Karten interessanter finde als die Karten selbst. Aber den Tip, den Du erhalten hast (Fließtext) finde ich auch interessant.
In Summe gesehen verstehe ich mittels dieses Threads wieder ein ganzes Stück mehr in Sachen OO-Modellierung. Und gebe zu, ich hätte vorab nicht gedacht, dass die Objekte letztlich so klein werden (oder um kaoZ Worte zu nutzen, so atomar sind/sein können).

Sehr interessante Aspekte von Euch! Dank' Euch!

Wer noch mehr hat, immer her damit ;-)

f5
 

kaoZ

Top Contributor
Und gebe zu, ich hätte vorab nicht gedacht, dass die Objekte letztlich so klein werden (oder um kaoZ Worte zu nutzen, so atomar sind/sein können).

Das liegt letzten endes nur bei dir selbst, wie weit du das ganze runter brechen möchtest, du kannst natürlich auch beigehen und lediglich Integer oder Double verwenden, aber ich halte dies eben für eine nicht OO Lösung.

Ausserdem bin ich ein Fan davon einen möglichst OO-Ansatz zu verfolgen ^^ und eine Zutat besteht nunmal aus mehreren Komponenten, welche wiederum teilweise als Eigenständige Objekte behandelt werden könnenten/müssten/sollten. xD

Einfach Beispiel sind z.B ValueObjects

Das macht es später angenehm z.B Objekte mit Daten zu versehen, Datensätze zu tauschen usw. usw. hier Kapselst du die Notwendigen Werte in einem einzigen Objekt Zentral :
Java:
class ValueObject{
	
	/*hier könnte man dann noch OO-Orientierter 
	*Ansetzen und eben eigene Klassen erstellen
	*/
	private double whey;
	private double carbs;
	private double fat;
	
	public ValueObject(int w, int c, int f){
		whey = w;
		carbs = c;
		fat = f;
	}
}
 
Zuletzt bearbeitet:

fanta5

Aktives Mitglied
Das liegt letzten endes nur bei dir selbst, wie weit du das ganze runter brechen möchtest

Ist wirklich ein bischen tricky. Mal ein anderes Beispiel (das ich dann auch ggf. wirklich umsetzen möchte)

Ich habe ein Nachrichtensystem, dessen Nachrichten in einer db gespeichert sind.
Jede Nachricht hat einen Sender, einen Empfänger, eine Überschrift, eine Nachricht, einen timestamp (Date) sowie je einen Flag, ob die Nachricht gelesen wurde oder nicht, ob der Sender die Nachricht gelöscht hat oder nicht sowie ob der Empfänger die Nachricht gelöscht hat oder nicht.

Ok.
Klasse "Nachrichten" scheint klar zu sein.
Klasse "User" scheint mir auch klar.

Und sonst?

Weiter weiß ich nicht, was ich noch an Objekten produzieren soll/will/muß. ???:L

Hintergrund, es wäre schön, wenn ich das Ganze erstmal per Konsole hin bekäme, im Anschluß daran ggf. eine GUI hin beköme und das Ganze danach als Android App hin bekäme.

Zu viel und zu früh für meinen Wissensstand? Wie würde ich (als Anfang) die Modellierung beginnen?

f5
 

Chisao

Mitglied
Viel mehr kann man objektorientiert auch nicht machen. Ich persönlich würde noch ein Flag objekt machen die noch einen Timestamp enthält damit man rausfinden kann wann die Nachricht gelesen/gelöscht wurde ;).
Ansonsten...Man muss nicht unbedingt alles mit Objekten abbilden wenn es nicht nötig ist. Man könnte natürlich auch ein Objekt Überschrift erstellen, diese würde aber schätzungsweise nur einen String enthalten und ob das so sinning ist...Bei solchen dingen erinner ich mich immer wieder an solch einen Tipp:

"Wenn du einen Taschenrechner programmieren willst könntest du ja erstmal ein Objekt "Zahl" erstellen..."
Hab ich selbst auch nie so recht verstanden wieso auch immer man das machen sollte :)
 

Saheeda

Top Contributor
@fanta5

Ich stimme da Chisao zu. Man _könnte_ alles zu Objekten machen, Frage ist nur, ob das auch sinnvoll ist. Zu Bedenken ist auch, dass Objekte mehr Speicher kosten / langsamer sind, als primitive Typen. Bei wenigen mag das noch nicht so ins Gewicht fallen, bei großen Mengen schon.
Einfaches Beispiel: Bau dir ne for-Schleife, die einmal mit int und einmal mit Integer (dem Wrapper-Type von int) arbeitet und lass dir die jeweiligen Laufzeiten ausgeben.

Wenn du bei deinem Nachrichtendienst z.B. vom Empfänger nur den Namen benötigst und keine sonstigen Informationen, könnte man es bei einem String belassen. Sollen hingegen noch weitere Informationen wie Alter, Adresse, etc. zum Empfänger gehören, lohnt sich ein Objekt.

Ich glaube, du gehst zu verkrampft an die Sache heran. Vorher ein Konzept auszuarbeiten, ist vollkommen richtig, aber das Objekte-Bauen hat auch bisschen was mit Gefühl zu tun und kommt im Laufe der Zeit von allein. Und wenn du mit der Zeit merkst, dass einzelne Bausteine wachsen und komplexer werden, kannst du immer noch refactoren.
 

fanta5

Aktives Mitglied
Wenn du bei deinem Nachrichtendienst z.B. vom Empfänger nur den Namen benötigst und keine sonstigen Informationen, könnte man es bei einem String belassen. Sollen hingegen noch weitere Informationen wie Alter, Adresse, etc. zum Empfänger gehören, lohnt sich ein Objekt.

Hi Saheeda,

nein, im Falle "Nachricht" brauche ich ausschließlich den Namen. Würde ich das "Nachrichtensystem" in eine Gesamtkonzept einbauen, bräuchte ich viele andere Dinge mehr.

Ich glaube, du gehst zu verkrampft an die Sache heran. Vorher ein Konzept auszuarbeiten, ist vollkommen richtig, aber das Objekte-Bauen hat auch bisschen was mit Gefühl zu tun und kommt im Laufe der Zeit von allein. Und wenn du mit der Zeit merkst, dass einzelne Bausteine wachsen und komplexer werden, kannst du immer noch refactoren.

Kann sein. Glücklicherwesie nicht so verkrampft, dass ich darunter leiden würde ;-)
Ist aber wirklich so, wie Du sagst. Solange man das Ganze noch nicht "per Bauchgefühl" modellieren kann, ist durchaus Verkrampfungsgefahr im Verzuge, unter anderem genau deshalb dieser Thread ... :bae:

f5
 

Chisao

Mitglied
Ich würde es in Deinem Fall so machen:
Bevor Du ein Projekt anfängst überlegst Du dir maximal 10-15 Minuten was Du alles an Objekten benötigst. Eben so viel, dass Du einen ersten Prototyp erstellen kannst. Dann kannste direkt mit dem Programmieren loslegen und wenn Du währenddessen bemerkst, dass ein Objekt mehr doch nicht übel wäre, kannst du wie Saheeda schon sagte das ganze immernoch umschreiben. Klar kann das durchaus mehr Arbeit bedeuten aber könnte dich dem Bauchgefühl für Objekte näher bringen :p.
 

fanta5

Aktives Mitglied
Gute Idee, so mach ichs.

Nächstes Problem: Kontakt zur mysql-db herstellen.

Ich habe mir das hier mal angeschaut und versucht, es umzusetzen, aber nachfolgender Code stellt anscheinend keinen Kontakt zur db her. Ich erhalte in der Konsole so ne Art Help-Datei im XML Format.

<ConnectionProperties>
<PropertyCategory name="Connection/Authentication">
<Property name="user" required="No" default="" sortOrder="-2147483647" since="all versions">
The user to connect as
</Property>
<Property name="password" required="No" default="" sortOrder="-2147483646" since="all versions">
The password to use when connecting
</Property>
<Property name="socketFactory" required="No" default="com.mysql.jdbc.StandardSocketFactory" sortOrder="4" since="3.0.3">
The name of the class that the driver should use for creating socket connections to the server. This class must implement the interface 'com.mysql.jdbc.SocketFactory' and have public no-args constructor.
</Property>
usw.

Den mysql-connector habe ich per Anleitung eingebunden...
Was ich in der Anleitung nicht verstanden habe, ist "Paket erstellen: de.michel.mysql.readData". Wozu macht man das?

Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class MySQLConnection {
 
  private static Connection conn = null;
 
  // Hostname
  private static String dbHost = "localhost";
 
  // Port -- Standard: 3306
  private static String dbPort = "3306";
 
  // Datenbankname
  private static String database = "00sql";
 
  // Datenbankuser
  private static String dbUser = "root";
 
  // Datenbankpasswort
  private static String dbPassword = "";
 
  private MySQLConnection() {
    try {
 
      // Datenbanktreiber für ODBC Schnittstellen laden.
      // Für verschiedene ODBC-Datenbanken muss dieser Treiber
      // nur einmal geladen werden.
      Class.forName("com.mysql.jdbc.Driver");
 
      // Verbindung zur ODBC-Datenbank '00sql' herstellen.
      // Es wird die JDBC-ODBC-Brücke verwendet.
      conn = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":"
          + dbPort + "/" + database + "?" + "user=" + dbUser + "&"
          + "password=" + dbPassword);
    } catch (ClassNotFoundException e) {
      System.out.println("Treiber nicht gefunden");
    } catch (SQLException e) {
      System.out.println("Connect nicht moeglich");
    }
  }
  
}

Warum erhalte ich keinen Connect zur db?

f5
 
Zuletzt bearbeitet von einem Moderator:

fanta5

Aktives Mitglied

fanta5

Aktives Mitglied
Ok. Problem gelöst, ich mußte dem Programm mitteilen, dass es als Java Applikation gestartet werden muß.

Mal eine ganz andere Frage: Wenn es doch so einfach ist, Java Code zu decompilieren, wie und wo geben ich denn dann die doch so geheimen db-Parameter an?

und noch eine Frage;

Ich erhalte bei meinem Eintrag die Fehlermeldung: "java.sql.SQLException: Invalid value for getInt() - 'Guten Tag'"
Liegt anscheinend daran, dass Java versucht, einen String in eine Int-Spalte einzutragen.
Das will ich aber eigentlich gar nicht.
Meine Tabelle hat z.b. 4 int-Spalten, danach 2 String-Spalten und danach wieder 4 int-Spalten.
Und ich will nur die beiden String-Spalten beim Eintrag belegen (die anderen Spalten haben defaultwerte, die gesetzt werden).

Das funktioniert aber nicht.

Code:
        // Insert-Statement erzeugen (Fragezeichen werden später ersetzt).
        String sql = "INSERT INTO table("
        		+ "MA,"
        		+ "MA1,"
        		+ "Head,"
        		+ "Body) "
        		+ "VALUES(?,?,?,?)";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);

        preparedStatement.setString(1,"f5");
         preparedStatement.setString(2, "f6");
          preparedStatement.setString(3, Head); // kommt als Parameter rein
        preparedStatement.setString(4, Body); // Kommt als Parameter rein

Der Eintrag wird zwar vorgenommen, aber es erscheint obige Fehlermeldung.

f5
 
Zuletzt bearbeitet:

consider

Mitglied
Zwei Denkansätze, die auch für z.B. C++ gelten:

1. Wenn die Daten so geheim sind, was haben sie dann im Client zu suchen?

2. Wenn es die Zugangsdaten des Users sind, der den Client nutzt, warum sollten sie dann vor ihm verheimlicht werden, er legt sie doch selbst fest.

Edit:

3. Warum sowas hardcoden? Ist eine Configdatei nicht möglich?
 
Zuletzt bearbeitet:

fanta5

Aktives Mitglied
Hi Consider,

danke für Deine Antwort.

Zwei Denkansätze, die auch für z.B. C++ gelten:

1. Wenn die Daten so geheim sind, was haben sie dann im Client zu suchen?

Welche Alternative habe ich denn?
Zusätzlich eine serverseitige Sprache einsetzen, die dann das Java Clientprogramm bedient?

2. Wenn es die Zugangsdaten des Users sind, der den Client nutzt, warum sollten sie dann vor ihm verheimlicht werden, er legt sie doch selbst fest.

Ok, einverstanden.

Edit:

3. Warum sowas hardcoden? Ist eine Configdatei nicht möglich?

Was bringt die? Die Fragen bleiben doch identisch.

f5
 

Joose

Top Contributor
Welche Alternative habe ich denn?
Zusätzlich eine serverseitige Sprache einsetzen, die dann das Java Clientprogramm bedient?

Ja. Wenn der Client nicht an die Authenifizierungsdaten für die DB kommen darf dann brauchst du eine Service welches auf einem Server läuft.
Der Client fragt beim Service nach Daten und bekommt diese geliefter. Der Service selbst ist auf deinem System (auf welches nur du Zugriff haben solltest) und daher sollten dort die Authentifizierungsdaten sicher sein).
(Das man den Server entsprechend sichern muss ist ein anderes Thema.)

Da vielleicht ein eigener (Virtual)Server doch zu viel ist für dein Projekt/Problem kannst du das Ganze auch mit einem PHP Service lösen.
Beispiel: Create a Basic Web Service Using PHP, MySQL, XML, and JSON
 

fanta5

Aktives Mitglied
Ja. Wenn der Client nicht an die Authenifizierungsdaten für die DB kommen darf dann brauchst du eine Service welches auf einem Server läuft.
Der Client fragt beim Service nach Daten und bekommt diese geliefter. Der Service selbst ist auf deinem System (auf welches nur du Zugriff haben solltest) und daher sollten dort die Authentifizierungsdaten sicher sein).
(Das man den Server entsprechend sichern muss ist ein anderes Thema.)

Da vielleicht ein eigener (Virtual)Server doch zu viel ist für dein Projekt/Problem kannst du das Ganze auch mit einem PHP Service lösen.
Beispiel: Create a Basic Web Service Using PHP, MySQL, XML, and JSON

Prima, wir kommen der Sache näher.
Was mir noch ein bischen Probleme bereitet, istd er Datenaustausch zwischen Java und php.
Wie spreche ich mit Java ein php-script an?
Datenübergabe via $_POST und/oder S_GET: Kann man das in Java bewerstelligen?
Und wie übergebe ich via php dann zurück an Java, bzw. wie werte ich die übergebenen Daten in Java aus?

f5
 

Ähnliche Java Themen

Neue Themen


Oben