Kapitel 13: Sichtbarkeit Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter Gumm, Philipps-Universität Marburg Übersicht Information hiding Datenkapselung Zugriffsattribute public, private Pakete Schnittstellen, Protokolle, Treiber Praktische Informatik I, HWS 2009, Kapitel 13 Seite 2 Information hiding Anwendungen stellen bereit Programme verwenden Informationen Dienste Variablen Methoden Klassen Einige davon sind für den Anwender bestimmt main Menüfunktionen Andere sind nur interne Hilfskonstrukte lokale Variablen Hilfsmethoden Hilfsklassen Jegliche interne Information sollte dem Anwender verborgen und unzugänglich bleiben Praktische Informatik I, HWS 2009, Kapitel 13 Seite 3 Versteck: Lokale Variablen Lokale Variable Innerhalb eines Blockes deklarierte Variable Außerhalb des Blockes ist sie nicht sichtbar int x=4, y=17; { int temp; temp = x; x = 17; y = temp; } System.out.println( “x =“+x+“ y =“+ y +“ temp =“+temp); Blöcke sind Datenschachteln Praktische Informatik I, HWS 2009, Kapitel 13 Fehler temp ist nur innerhalb des Blockes sichtbar Seite 4 Versteck: Methodenrumpf Der Rumpf einer Funktionsdefinition ist ein Block. Im Rumpf definierte Variablen sind außen nicht sichtbar Schnittstellen von Methoden sind Parameter Rückgabewert. int myMethod( int m , int n ) { Versteckt dem Benutzer der Methode unsichtbar } Praktische Informatik I, HWS 2009, Kapitel 13 int temp; ... tuWas... return ergebnis Schnittstellen ; Seite 5 Private Felder konto_1 Kein direkter Zugriff mehr nummer : 621 736 172 inhaber : “Donald Duck“ private kontostand : Der einzige Weg, Um kontostand zu lesen bzw. zu ändern einzahlen abheben betrag : Methoden anderer Klassen können nicht auf diese Felder zugreifen Objekte der gleichen Klasse haben Zugriff Beispiel Konto: betrag : empfänger : überweisen private verbirgt man Felder einer Klasse nach aussen. 100 000 000 getKontostand Mit dem Schlüsselwort Selbst wenn wir das Feld kontostand nach außen verstecken, können wir von einem anderen Konto noch zugreifen – z.B. beim Überweisen. betrag : Praktische Informatik I, HWS 2009, Kapitel 13 Seite 6 Experiment Zugriff auf Feld x aus einer anderen Klasse heraus wird vom Compiler nicht akzeptiert Zugriff aus einem anderen Objekt der Klasse A ist erlaubt Klasse A mit einem privaten Feld x und zwei Konstruktoren Praktische Informatik I, HWS 2009, Kapitel 13 Seite 7 Datenkapselung Datenobjekte werden vor direktem Zugriff geschützt private class (siehe gleich) private method private field Werden innerhalb der Klasse versteckt Öffentliche Methoden definieren Benutzer-Schnittstelle public class public method public field einzahlen private kontoStand getkonto Stand … Sind außerhalb der Klasse sichtbar Praktische Informatik I, HWS 2009, Kapitel 13 Seite 8 Weitere Zugriffsattribute public Felder sind explizit freigegeben überall sichtbar ggf. muss man die definierende Klasse benennen (importieren) Felder ohne Zugriffsattribute Zugriffsattribut heißt auch „package private“ in jeder Klasse des gleichen Pakets sichtbar nicht in anderen Paketen ZugriffsSchutz Ohne den Begriff der Unterklasse sind “package private” und protected äquivalent protected Felder und Methoden niedrigster in dem aktuellen Paket und in allen Unterklassen sichtbar (was auch immer das ist) private Felder und Methoden nur in der definierenden Klasse sichtbar nicht in Unterklassen Praktische Informatik I, HWS 2009, Kapitel 13 höchster Seite 9 Beispiel: Datum UNIX repräsentiert Datum durch Millisekunden seit 1.1.1970 GMT getter und setter getDay(), getMonth(), getYear() getWeekday() setDate(), setTime(), setMsec() isLeapyear() Datenkapselung: setter Schnittstelle: Zugriffsmethoden getter Verstecken der Repräsentation Verstecken von Hilfsmethoden getDay getMonth setTime getYear setMsec getWeekday isLeapYear Repräsentation kann man ändern private 1033530810062731 Vorteil setDate z.B.(tag,monat,Jahr,std,min,sec,ms) Zugriffsmethoden bleiben Anwendungsprogramme müssen weiter funktionieren Praktische Informatik I, HWS 2009, Kapitel 13 Seite 10 Private Klassen Klasse X ist außerhalb von Klasse A nicht sichtbar Klasse X wird innerhalb von Klasse A definiert Auch dieser Zugriff ist nicht erlaubt Praktische Informatik I, HWS 2009, Kapitel 13 Seite 11 Pakete Java Anwendungen bestehen aus vielen Klassen Zusammengehörige Klassen werden zu einem Paket zusammengefasst Jede Klasse gehört zu einem Paket Um eine Klasse einem Paket hinzuzufügen, muss die erste Zeile lauten: Wenn nichts gesagt wird, zu default . package paketName ; Auf vielen Plattformen hat man die Entsprechung class Meine ≅ Datei Meine.java .. nach der Compilation: Meine.class package meinPaket ≅ Verzeichnis meinPaket Praktische Informatik I, HWS 2009, Kapitel 13 Seite 12 Paketzugriff Klassen, Methoden und Felder in fremden Paketen sind ohne weiteres nicht zugreifbar Ohne spezielle Attribute nur im eigenen Paket sichtbar class Würfel int topFace public void roll() roll() Becher() public class Becher public void roll() public int result() roll() result() Abhilfe: (package private) package lasVegas Als public deklarieren Vergleiche javadoc ! Praktische Informatik I, HWS 2009, Kapitel 13 class Statistik private int[][] ergebnis public static void verteilung() verteilung() Seite 13 Pakethierarchie Pakete können hierarchisch organisiert werden. Der volle Name besteht aus dem Pfad zu dem Paket Beispiele: javax text awt kapitel1 java.awt.event, java.awt.color javax.swing.text.html.parser praktInf.kapitel1 Die Wurzeln der Hierarchien werden, durch Semikolon getrennt, in der Variablen CLASSPATH mitgeteilt java praktInf html color event parser CLASSPATH=.; C:\Programs\bluej\examples ; C:\mypackages; C:\DokumentsandSettings\praktInf\kapitel1 Praktische Informatik I, HWS 2009, Kapitel 13 Seite 14 Referenzieren Pfad nötig, um Klassen in anderen Paketen anzusprechen Compiler und JRE suchen unter den in CLASSPATH angegebenen Einstiegspunkten Klassen werden durch Voranstellen des Paketnamens eindeutig: z.B. java.util.Date : Klasse Date im Paket java.util java.util ist das Paket Date ist die Klasse Wichtig: Oder direkt im Codepad: Klasse Date muss public sein ! Praktische Informatik I, HWS 2009, Kapitel 13 Seite 15 Internationale Pakete Klassen werden oft im Internet bereitgestellt Mit der Internet-Adresse im package-Namen erreicht man Eindeutigkeit de.unimannheim.informatik.pi1.filepool.Wuerfel bezeichnet die Klasse Wuerfel im Verzeichnis filepool auf dem Rechner pi1 In der Subdomain informatik.uni-mannheim der Domain de Das Paket (als class- oder jar-Datei) muss vor der Benutzung auf den lokalen Rechner geladen und installiert werden Praktische Informatik I, HWS 2009, Kapitel 13 Seite 16 Paket-Registrierung in BlueJ Beispiel fremde Pakete: Programmierung von email-Versand in Java wir brauchen geeignete Klassen aus javamail-API und in dem java-activation-framework bei java.sun.com herunterladen und entpacken. Verzeichnisse enthalten jar-Dateien mail.jar, bzw activation.jar in den Klassenpfad aufnehmen entweder durch Setzen von CLASSPATH oder in Bluej registrieren Einstellungen →Bibliotheken → Hinzufügen Praktische Informatik I, HWS 2009, Kapitel 13 Seite 17 Eigene Pakete einbinden Basisverzeichnis von Hand anlegen z.B. C:\Dokumente und Einstellungen\freiling\java \meinePakete\ BlueJ-Projekt im selben Verzeichnis öffnen Neues Paket anlegen Paket öffnen z.B. util Dort Klassen definieren Jetzt kann man den Wuerfel in anderen Projekten benutzen import util.Wuerfel; Praktische Informatik I, HWS 2009, Kapitel 13 Seite 18 Standard Pakete gehören zum offiziellen Sprachumfang von Java: java.lang enthält u.a. die Klassen System, String, Object, braucht nicht importiert zu werden Andere Standard Pakete java.net Für Internet-Programmierung java.text Zum Editieren und Formatieren von Text, Zahlen, etc. java.awt (AWT=Abstract Windowing Toolkit) für GUI-Programmierung javax.swing Modernere, plattformübergreifende Dialogkomponenten java.applet Applets werden als Unterklasse von java.applet.Applet realisiert java.io Klassen für Ein/Ausgabe java.util Nützliches, wie z.B. Datum, Behälter, Listen, etc. Praktische Informatik I, HWS 2009, Kapitel 13 Seite 19 Schnittstellen Vereinbarung über Außenverbindung von Systemen Begriffsursprung: Man will komplexe Systeme zerlegen Einzelteile von verschiedenen Firmen hergestellt An den Schnittstellen müssen Teile zueinander passen Folglich muss die Schnittstelle genau spezifiziert sein Beispiel: Steckdose Schnittstelle regelt Notwendig, um Systeme verschiedener Hersteller zu verbinden Hersteller von Elektrogeräten können davon ausgehen: Informatik der Stecker passt die Beschaltung ist wie erwartet die Stromstärke ist 230 V sie schwankt nur in bestimmten Grenzen Verkehrswesen Computer und Monitor Diskette und Laufwerk Modem und Telefonsystem Form Beschaltung (Masse, Phase, ) Spannung (230 ±10V , 50 Hz) Räder und Reifen Motor und Treibstoff (Tankstelle) Haus Mülltonne und Müllwagen VHS-Kassette, Recorder Praktische Informatik I, HWS 2009, Kapitel 13 Seite 20 Protokolle – Schnittstellen der Kommunikation Ein Protokoll regelt Sprache/Signale Reihenfolge Bedingungen einer Kommunikation Protokolle verbinden Technische Geräte ODBC, Email Menschen PPP, TCP/IP Programme Telefonprotokoll Rechner „Hallo“, „...darf ich vorstellen“, „Tschüss“ Anklopfen, „Herein“, „Guten Tag“ Technische Schnittstellen und Protokolle gehören oft zusammen Telefon Fax RS232 Ethernet ... Hardware und Treiber ISDN Karte Staaten Diplomatisches Protokoll Beistandsverträge Praktische Informatik I, HWS 2009, Kapitel 13 Seite 21 Treiber Treiber sind Programme um unterschiedliche Schnittstellen zu verbinden Oft wird eine Hardwareschnittstelle Laufwerk Kamera Modem mit einem Betriebssystem verbunden Linux Windows MacOS read() read() write() erase() startMotor() startMotor() write() moveHead() moveHead() erase() readBits() readBits() Betriebssystem Praktische Informatik I, HWS 2009, Kapitel 13 Treiber Platte Seite 22 Warum Schnittstellen ? Eine Schnittstelle ist wie ein Vertrag Wenn Deine Steckdose den richtigen Strom liefert, garantiere ich, dass mein Toaster funktioniert Der Vertragsnehmer sollte sich nur auf die Dinge verlassen, die versprochen sind Wer Interna benutzt, die nicht im Vertrag stehen, kann hereinfallen Die Spannungstoleranz war doch bisher immer nur ± 0.5 V Aber heute ist mein Toaster explodiert Tja, versprochen waren nur ± 10 V Beim nächsten Update des Betriebssystem Ein Programm, das eine undokumentierte Schnittstelle benutzt stürzt ab Die Internet Kamera will nicht mehr Ein neuer Treiber ist fällig Am besten verhindert man den Zugriff auf Interna Ein Bankkunde sollte nur über die offizielle Schnittstelle auf sein Konto zugreifen können Praktische Informatik I, HWS 2009, Kapitel 13 Seite 23 Zusammenfassung Information hiding bedeutet das Verbergen von Implementierungsdetails hinter einer Schnittstelle Verbergen von Details geht über Blöcke bzw. Zugriffsattribute private, protected etc. und Pakete Treiber verbinden Schnittstellen Praktische Informatik I, HWS 2009, Kapitel 13 Seite 24