Grundsaetzliches Objektorientiertes Programmieren

  • Hallo,


    ich habe Fragen bezueglich objektorientierter Programmierung und ob ich es im Prinzip richtig gemacht habe oder was man anders machen sollte.


    Ausgangspunkt: ich habe ein sliding menu tutorial als Ausgangspunkt. Dieses hat eine main_activity und drei fragments. Hier geht es um eines der Fragments (in Graph_Fragment.java). Graph_Fragment enhaelt einen Button und eine Komponente XYPlot androidplot


    Nun habe ich eine weitere Klasse (myClass) definiert die folgendes macht: Sie laedt ein Textfile, parst dieses Textfile und schreibt die herausgefilterten numerischen Werte in eine Referenzklasse (myData, aehnlich einem record). Anschliessend enthaelt myData die Werte fuer mehrere XY-Kurven.


    MyClass ist folgendermassen aufgebaut:



    Meine Fragen:


    1) ist es in Ordnung myPlot, myView und myContext so ueber den Konstruktor von dem Fragment in die Klasse myClass zu bringen?


    2) die private Funktionen zum parsen scheinen mir OO-maessig okay zu sein. Sie opererieren ja nur innerhalb der Klasse auf myData, das zuvor eingeladen wurde. Ein schlechteres Gefuehl habe ich bei PlotMotorData(int NCurve) welches die n-te Kurve aus myData in myPlot zeichnet. Ist es okay auch diese Plotoperation so in der Klasse zu haben, dass sie vom Fragment aus z.B. via myClassObject.PlotMotorData(2) aufgerufen wird? Dies ist ja irgendwie objektuebergreifend.


    3) Viele der Parse Methoden enthalten Zugriffe auf das File mittels RandomAccessFile. Theoretisch muesste ich doch bei diesen Methoden ein "throws ExceptionXYZ" hinter der Methoden-deklaration stellen, oder nicht? So wie ich das verstanden habe muessen Methoden in denen exceptions auftreten koennen diese auch weiterreichen.


    Vielen Dank


    Gutelo


    Edit: eine weitere Frage. Ist es normal, dass das Fragment Objekt komplett neu geladen wird wenn der screen seine Orientierung von horizontal nach vertikal und umgekehrt aendert?

  • Hallo Gutelo,


    zu Deinen Fragen:


    1] Ja, das ist okay so. Es ist natürlich immer schöner, wenn so wenig Abhängigkeiten wie möglich bestehen.
    Wenn nicht gleich beim Konstruieren des Objektes aus mit den Berechnungen los gelegt wird, könntest Du das Ganze auch noch um Setter erweitern.
    Du müsstest nur dafür sorgen, dass bei ungesetzten Werten die Sache stabil weiter läuft.


    2] Tja, das ist eine schwierige Frage. Damit würdest Du ja die Ausgabe direkt beeinflussen. Ganz genau genommen gehört das Plotting ja eher in den View und nicht in die Daten. Allerdings nutzt Du ja ein Plotting Framework, dass sich um die Darstellung im View kümmert.
    Insofern agiert Deine Klasse mehr als Controller zwischen den Schichten, und da ist es durchaus okay, diese Schnittstelle nach außen hin offen anzubieten – wenn Du sie denn wirklich dringend von Außerhalb brauchst.


    3] Das ist nicht ganz richtig. Du kannst in Deinen Methoden, die Exceptions werfen können, diese Exceptions auch abfangen und die Daten entsprechend so manipulieren, dass Du immer noch eine funktionale Komponente hast.
    Statt 'BAM! FileNotFoundException!' kannst Du auch Deinen Graphen so plotten, dass er leer ist und die Achsenbeschriftung 'File Not Found' heißt.
    Das kannst Du also ganz so implementieren wie Du möchtest. (Ich bevorzuge es, möglichst keinerlei Exceptions zu haben.)


    4] Ja.
    Es sei denn, Du unterbindest das.
    Möglichkeit 1)
    Die OnCreate Deiner Activity wie folgt aufbauen:


    Oder Du erklärst dem Manifest, dass sich Dein UI mitdrehen soll (wenn Du ein UI für alle Darstellungen hast)

    HTML
    <activity android:configChanges="screenSize|orientation"
    android:name="…

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Marco,


    Danke fuer die Antworten. Bezueglich Punkt [4] habe ich noch Fragen:


    1) Bei deiner Methode 1: Muss das zwingend in das OnCreate des Main-activity oder geht auch das OnCreateView des Fragments? Muss ich dort alles was gemacht wird (d.h. in meinem Fall Einlesen der Daten und Plotten der Daten) einmal in dem if-Zweig und einmal in dem else-Zweig packen? Anders gesagt, zweigt das auf in das was ohne Drehung, und das was nach einer Drehung gemacht wird?


    2) Bei der Methode 2: Hierbei verstehe ich nicht ganz welche UI gemeint ist. Ich habe eine Main_Activity und drei Fragments. Ich nehme an dass die Main_activity eine UI hat, die mein Sliding Menue enthaelt. Haben die Fragments jeweils eigene UIs? Woher bekomme ich den namen der UI den ich hier eintragen muss?:
    <activity android:configChanges="screenSize|orientation"
    android:name="…


    Gutelo

  • 1) Ja.
    Wenn Du das dort nicht machst, dann erstellt das OnCreate() der Main Activity einfach neue Fragments.
    Dann dürfte es denen auch ziemlich egal sein, ob sie an anderer Stelle schon mal erstellt wurden.


    Der zweite Teil der Frage sollte durch mein erstes Code Listing doch bereits beantwortet sein.


    2) Es gibt die Möglichkeit, dass Du pro Darstellung ein anderes UI zur Verfügung stellst. Das UI wird durch eine Activity dargestellt.
    Insofern musst Du da gar keinen Namen eingeben, sondern das zweite Code Listing einfach vor dem schon existierenden Namen in Deine AndroidMainfest.xml eintragen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Wunderbar die Aenderung im Manifest, bewirkt genau das richtige *freu*.


    Kann man auch irgendwie bewirken, dass beim Wechsel der Fragments der Inhalt der nicht mehr sichtbaren Fragments erhalten bleibt, so dass man zurueckwechseln kann? Wahrschneinlich nicht weil er beim Wechsel ja neue Objekte erzeugen muss, richtig?


    Gutelo

  • Das hängt immer vom gewählten Ansatz ab.
    Normalerweise werden die Fragmente zerstört, sobald sie den Bildschirm verlassen und werden dann dementsprechend neu erstellt, wenn sie wieder dargestellt werden. Das gehört zum Fragment Lifecycle, der auch auf den Seiten von http://developer.android.com gut dokumentiert ist.


    Allerdings gibt es Implementierungen, die mehrere Fragmente vorhalten. Der ViewPager beispielsweise hat immer das aktuelle Fragment im Speicher, ebenso das (sofern vorhanden) davor liegende und das (sofern vorhanden) dahinter befindliche Fragment. Zu Spitzenzeiten hält es also drei Fragmente aktiv.
    Wenn Du zwei Fragmente in einen ViewPager stopfst, dürften sie theoretisch nie zerstört werden.


    Allerdings kann ich mir nicht vorstellen, dass Du das wirklich willst. ;)
    Sinnvoller ist es aber, die Neuerstellung der Fragmente möglichst fix geschehen zu lassen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Gutelo,
    1] Ja, das ist okay so. Es ist natürlich immer schöner, wenn so wenig Abhängigkeiten wie möglich bestehen.
    Wenn nicht gleich beim Konstruieren des Objektes aus mit den Berechnungen los gelegt wird, könntest Du das Ganze auch noch um Setter erweitern.
    Du müsstest nur dafür sorgen, dass bei ungesetzten Werten die Sache stabil weiter läuft.


    Mh also ich finde gerade an stellen wo werte gesetzt sein müssen mit was passiert, sollte man das eher koppeln als entkoppeln.
    Das gute an Konstruktor Parametern ist, dass diese auch reingegeben werden MÜSSEN. So entfernt man einiges an Fehlerpotential das ein Entwickler mit settern einbauen könnte.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!