26.12.2013 Aufrufe

Kapitel 13: Sichtbarkeit - Pi1 - Universität Mannheim

Kapitel 13: Sichtbarkeit - Pi1 - Universität Mannheim

Kapitel 13: Sichtbarkeit - Pi1 - Universität Mannheim

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Kapitel</strong> <strong>13</strong>:<br />

<strong>Sichtbarkeit</strong><br />

Felix Freiling<br />

Lehrstuhl für Praktische Informatik 1<br />

<strong>Universität</strong> <strong>Mannheim</strong><br />

Vorlesung Praktische Informatik I<br />

im Herbstsemester 2009<br />

Folien nach einer Vorlage von<br />

H.-Peter Gumm, Philipps-<strong>Universität</strong> Marburg


Übersicht<br />

Information hiding<br />

Datenkapselung<br />

Zugriffsattribute public, private<br />

Pakete<br />

Schnittstellen, Protokolle, Treiber<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 2


Information hiding<br />

<br />

<br />

<br />

<br />

<br />

Anwendungen stellen bereit<br />

<br />

<br />

Informationen<br />

Dienste<br />

Programme verwenden<br />

<br />

<br />

<br />

Variablen<br />

Methoden<br />

Klassen<br />

Einige davon sind für den Anwender bestimmt<br />

<br />

<br />

main<br />

Menüfunktionen<br />

Andere sind nur interne Hilfskonstrukte<br />

<br />

<br />

<br />

lokale Variablen<br />

Hilfsmethoden<br />

Hilfsklassen<br />

Jegliche interne Information sollte dem Anwender<br />

verborgen und unzugänglich bleiben<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 3


Versteck: Lokale Variablen<br />

Lokale Variable<br />

Innerhalb eines Blockes deklarierte<br />

Variable<br />

Außerhalb des Blockes ist sie nicht<br />

sichtbar<br />

<br />

int x=4, y=17;<br />

{ int temp;<br />

temp = x;<br />

x = 17;<br />

y = temp;<br />

}<br />

System.out.println(<br />

“x =“+x+“ y =“+ y +“ temp =“+temp);<br />

Blöcke sind Datenschachteln<br />

Fehler<br />

temp ist nur innerhalb<br />

des Blockes sichtbar<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 4


Versteck: Methodenrumpf<br />

<br />

Der Rumpf einer Funktionsdefinition ist ein Block.<br />

<br />

Im Rumpf definierte Variablen sind außen nicht sichtbar<br />

<br />

Schnittstellen von Methoden sind<br />

<br />

<br />

Parameter<br />

Rückgabewert.<br />

Versteckt<br />

dem Benutzer<br />

der Methode unsichtbar<br />

int myMethod( int m , int n )<br />

{<br />

int temp;<br />

... tuWas...<br />

return ergebnis ;<br />

}<br />

Schnittstellen<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 5


Private Felder<br />

konto_1<br />

nummer : 621 736 172<br />

<br />

Mit dem Schlüsselwort<br />

private<br />

verbirgt man Felder einer<br />

Klasse nach aussen.<br />

Kein direkter<br />

Zugriff mehr<br />

inhaber :<br />

private<br />

kontostand :<br />

“Donald Duck“<br />

100 000 000<br />

<br />

Methoden anderer Klassen<br />

können nicht auf diese<br />

Felder zugreifen<br />

getKontostand<br />

<br />

Objekte der gleichen Klasse<br />

haben Zugriff<br />

Der einzige Weg,<br />

Um kontostand<br />

zu lesen bzw.<br />

zu ändern<br />

einzahlen<br />

abheben<br />

überweisen<br />

betrag :<br />

betrag :<br />

empfänger :<br />

betrag :<br />

<br />

Beispiel Konto:<br />

Selbst wenn wir das Feld<br />

kontostand nach außen<br />

verstecken, können wir von<br />

einem anderen Konto noch<br />

zugreifen – z.B. beim<br />

Überweisen.<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 6


Experiment<br />

Zugriff auf Feld x<br />

aus einer anderen<br />

Klasse heraus wird<br />

vom Compiler nicht<br />

akzeptiert<br />

Zugriff aus einem<br />

anderen Objekt<br />

der Klasse A ist<br />

erlaubt<br />

Klasse A mit<br />

einem privaten<br />

Feld x und zwei<br />

Konstruktoren<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 7


Datenkapselung<br />

<br />

Datenobjekte werden vor<br />

direktem Zugriff geschützt<br />

private class (siehe gleich)<br />

private method<br />

private field<br />

Werden innerhalb der Klasse<br />

versteckt<br />

<br />

Öffentliche Methoden definieren<br />

Benutzer-Schnittstelle<br />

einzahlen<br />

private<br />

kontoStand<br />

getkonto<br />

Stand<br />

public class<br />

public method<br />

public field<br />

…<br />

Sind außerhalb der Klasse sichtbar<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 8


Weitere Zugriffsattribute<br />

<br />

public Felder sind explizit freigegeben<br />

<br />

<br />

überall sichtbar<br />

ggf. muss man die definierende Klasse<br />

benennen (importieren)<br />

niedrigster<br />

<br />

Felder ohne Zugriffsattribute<br />

<br />

<br />

<br />

Zugriffsattribut heißt auch „package<br />

private“<br />

in jeder Klasse des gleichen Pakets<br />

sichtbar<br />

nicht in anderen Paketen<br />

Zugriffs-<br />

Schutz<br />

Ohne den Begriff<br />

der Unterklasse sind<br />

“package private”<br />

und protected<br />

äquivalent<br />

<br />

protected Felder und Methoden<br />

<br />

<br />

in dem aktuellen Paket und<br />

in allen Unterklassen sichtbar (was auch<br />

immer das ist)<br />

<br />

private Felder und Methoden<br />

<br />

<br />

nur in der definierenden Klasse sichtbar<br />

nicht in Unterklassen<br />

höchster<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 9


Beispiel: Datum<br />

<br />

<br />

<br />

UNIX repräsentiert Datum durch<br />

Millisekunden seit 1.1.1970 GMT<br />

Schnittstelle: Zugriffsmethoden<br />

getter und setter<br />

<br />

<br />

<br />

<br />

Datenkapselung:<br />

<br />

<br />

getDay(), getMonth(), getYear()<br />

getWeekday()<br />

setDate(), setTime(), setMsec()<br />

isLeapyear()<br />

Verstecken der Repräsentation<br />

Verstecken von Hilfsmethoden<br />

getter<br />

getDay<br />

getMonth<br />

getYear<br />

getWeekday<br />

private<br />

1033530810062731<br />

setter<br />

setDate<br />

setTime<br />

setMsec<br />

<br />

Vorteil<br />

isLeapYear<br />

<br />

<br />

<br />

Repräsentation kann man ändern<br />

<br />

z.B.(tag,monat,Jahr,std,min,sec,ms)<br />

Zugriffsmethoden bleiben<br />

Anwendungsprogramme müssen weiter funktionieren<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 10


Private Klassen<br />

Klasse X ist<br />

außerhalb<br />

von Klasse A<br />

nicht<br />

sichtbar<br />

Klasse X<br />

wird<br />

innerhalb<br />

von Klasse<br />

A definiert<br />

Auch dieser Zugriff ist<br />

nicht erlaubt<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 11


Pakete<br />

<br />

Java Anwendungen bestehen aus vielen Klassen<br />

<br />

<br />

<br />

<br />

Zusammengehörige Klassen werden zu einem Paket<br />

zusammengefasst<br />

Jede Klasse gehört zu einem Paket<br />

Wenn nichts gesagt wird, zu default .<br />

Um eine Klasse einem Paket hinzuzufügen, muss die<br />

erste Zeile lauten:<br />

package paketName ;<br />

Auf vielen Plattformen hat man die Entsprechung<br />

class Meine ≅ Datei Meine.java<br />

.. nach der Compilation: Meine.class<br />

package meinPaket ≅ Verzeichnis meinPaket<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 12


Paketzugriff<br />

<br />

<br />

<br />

Klassen, Methoden und<br />

Felder in fremden<br />

Paketen sind ohne<br />

weiteres nicht<br />

zugreifbar<br />

Ohne spezielle Attribute<br />

nur im eigenen Paket<br />

sichtbar<br />

(package private)<br />

Abhilfe:<br />

Als public deklarieren<br />

Vergleiche javadoc !<br />

package lasVegas<br />

class Würfel<br />

int topFace<br />

public void roll()<br />

public class Becher<br />

public void roll()<br />

public int result()<br />

class Statistik<br />

private int[][] ergebnis<br />

public static void<br />

verteilung()<br />

roll()<br />

Becher()<br />

roll()<br />

result()<br />

verteilung()<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite <strong>13</strong>


Pakethierarchie<br />

<br />

Pakete können hierarchisch<br />

organisiert werden.<br />

praktInf<br />

java javax<br />

<br />

Der volle Name besteht aus dem<br />

Pfad zu dem Paket<br />

Beispiele:<br />

<br />

<br />

<br />

java.awt.event, java.awt.color<br />

javax.swing.text.html.parser<br />

praktInf.kapitel1<br />

kapitel1<br />

color<br />

awt text<br />

html<br />

event<br />

<br />

Die Wurzeln der Hierarchien werden,<br />

durch Semikolon getrennt, in der<br />

Variablen CLASSPATH mitgeteilt<br />

CLASSPATH=.; C:\Programs\bluej\examples ;<br />

C:\mypackages;<br />

C:\DokumentsandSettings\praktInf\kapitel1<br />

parser<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 14


Referenzieren<br />

Klasse Date im Paket java.util<br />

<br />

Pfad nötig, um Klassen in anderen<br />

Paketen anzusprechen<br />

<br />

Compiler und JRE suchen unter<br />

den in CLASSPATH angegebenen<br />

Einstiegspunkten<br />

<br />

Klassen werden durch<br />

Voranstellen des Paketnamens<br />

eindeutig:<br />

z.B. java.util.Date :<br />

<br />

<br />

java.util ist das Paket<br />

Date ist die Klasse<br />

<br />

Wichtig:<br />

Klasse Date muss public sein !<br />

Oder direkt im Codepad:<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 15


Internationale Pakete<br />

<br />

<br />

Klassen werden oft im Internet bereitgestellt<br />

Mit der Internet-Adresse im package-Namen<br />

erreicht man Eindeutigkeit<br />

<br />

de.unimannheim.informatik.pi1.filepool.Wuerfel<br />

bezeichnet die<br />

<br />

<br />

<br />

<br />

<br />

Klasse Wuerfel<br />

im Verzeichnis filepool<br />

auf dem Rechner pi1<br />

In der Subdomain informatik.uni-mannheim<br />

der Domain de<br />

<br />

Das Paket (als class- oder jar-Datei) muss vor der Benutzung auf<br />

den lokalen Rechner geladen und installiert werden<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 16


Paket-Registrierung in BlueJ<br />

<br />

Beispiel fremde Pakete:<br />

<br />

Programmierung von email-Versand in Java<br />

<br />

<br />

<br />

<br />

wir brauchen geeignete Klassen aus<br />

javamail-API und in dem<br />

java-activation-framework<br />

bei java.sun.com herunterladen<br />

und entpacken.<br />

Verzeichnisse enthalten jar-Dateien<br />

<br />

<br />

mail.jar, bzw<br />

activation.jar<br />

in den Klassenpfad aufnehmen<br />

<br />

<br />

entweder durch Setzen von CLASSPATH<br />

oder in Bluej registrieren<br />

Einstellungen<br />

→Bibliotheken<br />

→ Hinzufügen<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 17


Eigene Pakete<br />

einbinden<br />

<br />

<br />

<br />

<br />

<br />

Basisverzeichnis von Hand anlegen<br />

z.B. C:\Dokumente und<br />

Einstellungen\freiling\java<br />

\meinePakete\<br />

BlueJ-Projekt im selben Verzeichnis<br />

öffnen<br />

Neues Paket anlegen<br />

z.B. util<br />

Paket öffnen<br />

Dort Klassen definieren<br />

Jetzt kann man den Wuerfel in<br />

anderen Projekten benutzen<br />

import util.Wuerfel;<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 18


Standard Pakete<br />

<br />

<br />

gehören zum offiziellen Sprachumfang von Java:<br />

<br />

java.lang<br />

enthält u.a. die Klassen System, String, Object,<br />

braucht nicht importiert zu werden<br />

Andere Standard Pakete<br />

java.net Für Internet-Programmierung<br />

java.text Zum Editieren und Formatieren<br />

von Text, Zahlen, etc.<br />

java.awt (AWT=Abstract Windowing Toolkit) für<br />

GUI-Programmierung<br />

javax.swing Modernere, plattformübergreifende<br />

Dialogkomponenten<br />

java.applet Applets werden als Unterklasse von<br />

java.applet.Applet realisiert<br />

java.io Klassen für Ein/Ausgabe<br />

java.util Nützliches, wie z.B. Datum, Behälter, Listen, etc.<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 19


Schnittstellen<br />

<br />

Vereinbarung über Außenverbindung von<br />

Systemen<br />

<br />

Begriffsursprung:<br />

<br />

Beispiel: Steckdose<br />

<br />

<br />

<br />

<br />

Man will komplexe Systeme zerlegen<br />

Einzelteile von verschiedenen Firmen hergestellt<br />

An den Schnittstellen müssen Teile zueinander passen<br />

Folglich muss die Schnittstelle genau spezifiziert sein<br />

<br />

Schnittstelle regelt<br />

<br />

Form<br />

Beschaltung (Masse, Phase, )<br />

Spannung (230 ±10V , 50 Hz)<br />

<br />

Notwendig, um Systeme verschiedener<br />

Hersteller zu verbinden<br />

<br />

Informatik<br />

<br />

<br />

<br />

Computer und Monitor<br />

Diskette und Laufwerk<br />

Modem und Telefonsystem<br />

<br />

Hersteller von Elektrogeräten<br />

können davon ausgehen:<br />

<br />

<br />

<br />

<br />

der Stecker passt<br />

die Beschaltung ist wie erwartet<br />

die Stromstärke ist 230 V<br />

sie schwankt nur in bestimmten<br />

Grenzen<br />

<br />

<br />

Verkehrswesen<br />

<br />

<br />

Haus<br />

<br />

<br />

Räder und Reifen<br />

Motor und Treibstoff (Tankstelle)<br />

Mülltonne und Müllwagen<br />

VHS-Kassette, Recorder<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 20


Protokolle<br />

– Schnittstellen der Kommunikation<br />

<br />

<br />

Ein Protokoll regelt<br />

Sprache/Signale<br />

Reihenfolge<br />

Bedingungen<br />

einer Kommunikation<br />

Protokolle verbinden<br />

<br />

Technische Geräte<br />

<br />

<br />

<br />

<br />

<br />

Rechner<br />

<br />

Telefonprotokoll<br />

PPP, TCP/IP<br />

Programme<br />

<br />

Menschen<br />

<br />

<br />

Staaten<br />

<br />

<br />

ODBC, Email<br />

„Hallo“, „...darf ich vorstellen“,<br />

„Tschüss“<br />

Anklopfen, „Herein“, „Guten Tag“<br />

Diplomatisches Protokoll<br />

Beistandsverträge<br />

<br />

<br />

Technische Schnittstellen<br />

und Protokolle gehören oft<br />

zusammen<br />

Telefon<br />

Fax<br />

<br />

RS232<br />

Ethernet<br />

...<br />

Hardware und Treiber<br />

<br />

ISDN Karte<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 21


Treiber<br />

<br />

<br />

Treiber sind Programme um unterschiedliche<br />

Schnittstellen zu verbinden<br />

Oft wird eine Hardwareschnittstelle<br />

Laufwerk<br />

Kamera<br />

Modem<br />

mit einem Betriebssystem verbunden<br />

Linux<br />

<br />

Windows<br />

MacOS<br />

read()<br />

read()<br />

startMotor()<br />

startMotor()<br />

write()<br />

write()<br />

moveHead()<br />

moveHead()<br />

erase()<br />

erase()<br />

readBits()<br />

readBits()<br />

Betriebssystem<br />

Treiber<br />

Platte<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 22


Warum Schnittstellen ?<br />

<br />

Eine Schnittstelle ist wie ein Vertrag<br />

<br />

Wenn Deine Steckdose den richtigen Strom liefert, garantiere ich,<br />

dass mein Toaster funktioniert<br />

<br />

Der Vertragsnehmer sollte sich nur auf die Dinge verlassen, die<br />

versprochen sind<br />

<br />

<br />

Wer Interna benutzt, die nicht im Vertrag stehen, kann hereinfallen<br />

<br />

<br />

<br />

Die Spannungstoleranz war doch bisher immer nur ± 0.5 V<br />

Aber heute ist mein Toaster explodiert<br />

Tja, versprochen waren nur ± 10 V<br />

Beim nächsten Update des Betriebssystem<br />

<br />

<br />

Ein Programm, das eine undokumentierte Schnittstelle benutzt stürzt ab<br />

Die Internet Kamera will nicht mehr<br />

<br />

Ein neuer Treiber ist fällig<br />

<br />

Am besten verhindert man den Zugriff auf Interna<br />

Ein Bankkunde sollte nur über die offizielle Schnittstelle auf sein<br />

Konto zugreifen können<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 23


Zusammenfassung<br />

<br />

<br />

<br />

Information hiding bedeutet das Verbergen von<br />

Implementierungsdetails hinter einer Schnittstelle<br />

Verbergen von Details geht über Blöcke bzw.<br />

Zugriffsattribute private, protected etc. und Pakete<br />

Treiber verbinden Schnittstellen<br />

Praktische Informatik I, HWS 2009, <strong>Kapitel</strong> <strong>13</strong> Seite 24

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!