Softwareentwicklung
Softwareentwicklung
Softwareentwicklung
Softwareentwicklung
Skriptum zur Vorlesung - 01.01.2023
Abstract:
MSC: [Link]@[Link]
Keywords:
1
Softwareentwicklung
4. Exception 57
4.1. Fehlerbehandlung 57
4.1.1. Fehler und Ausnahmen 57
4.1.2. Fehlerbehandlung 58
4.1.3. Programmfluss: Fehlerbehandlung 59
5. FileIO 61
5.1. Filesystem 62
5.2. Filesystem: Verzeichnis 62
5.2.1. Klassenmethode: Exists() 62
2
Softwareentwicklung - Theorieskriptum
.
L |
Erklärung: Objekte
‚ Objekte verfügen über Eigenschaften, die sie näher
charakterisieren.
‚ Ebenso können Objekte bestimmte Tätigkeiten aus-
führen. Sie können miteinander kommunizieren und
in einer bestimmten Beziehung zueinander stehen.
04. Vererbung 12
05. Speicherverwaltung 14
1
Sie werden auch als Variablen bezeichnet.
4
© Paul Panhofer
5
Softwareentwicklung
‚ Von außen soll man auf das Objekt nur zugreifen, 1.2.2 Eigenschaften von Objekten
indem man ihm eine Nachricht schickt, das heißt,
Für Objekte werden 3 Eigenschaften unterschieden:
eine Methode des Objekts aufruft.
Identität, Zustand bzw. Verhalten.
20 public bool IsEqual(Point p){ Das Verhalten eines Objekts beschreibt, wie
21 return p.X == this.X && p.Y == this.Y; sich das Objekt beim Empfang einer Nach-
22 } richt verhält, das heißt, was das Objekt
23 beim Aufruf einer entsprechenden Methode
24 } macht.
❑
❑
6
© Paul Panhofer
L Implementierung L Klasse
Die Implementierung aller Methoden eines Eine Klasse beschreibt die Struktur eines Ob-
Objekts und die Deklaration der Variablen des jekts. Die Klasse legt die Implementierung ei-
Objekts bilden die Implementierung des Ob- nes Objekts fest.
jekts.
Ein Objekt einer Klasse wird auch als Instanz
Die Implementierung beschreibt das Verhal- der Klasse bezeichnet.
ten des Objekts.
Codebeispiel: [Link]
1 // ----------------------------------------
Codebeispiel: [Link]
2 // Klasse: [Link]
1 // ----------------------------------------
3 // ----------------------------------------
2 // Klasse: [Link]
4 /*
3 // ----------------------------------------
5 * Implementierung der Klasse Point
4 // Implementierung der Klasse Point
6 */
5 public class Point{
7 public class Point{
6
8
7 private int _x;
9 private int _x,_y;
8 private int _y;
10
9
11 public int X (get; set;)
10 public int X {
12 public int Y (get; set;)
11 get{return _x;};
13
12 set{_x = value;};
14 public Point(int x, int y){
13 }
15 this._x = x;
14
16 this._y = y;
15 public int Y {
17 }
16 get{return _y};
18
17 set{_y = value;};
19 public bool IsEqual(Point p){
18 }
20 return p.X == this.X && p.Y == this.Y;
19
21 }
20 public Point(int x, int y){
22
21 this._x = x;
23 }
22 this._y = y;
24
23 }
25 public class Programm{
24
26
25 public Point(){
27 public static void Main(String[] args){
26
28 // Von der Point Klasse werden 2
27 }
29 // Objekte p1 und p2 angelegt.
28
30 // p1 und p2 werden als Instanzen der
29 public bool IsEqual(Point p){
31 // Klasse bezeichnet.
30 return p.X == this.X && p.Y == this.Y;
32 Point p1 = new Point(2,1);
31 }
33 Point p2 = new Point(4,6);
32 }
34 }
35 }
❑
7
Softwareentwicklung
Die Struktur einer Klasse folgt einem vorgegebenem Klassen können Objekte anderer Klassen als Variablen
Muster. haben.
Codebeispiel: Objektschachtelung
1.3.1 Klassenelement: Variablen 1 // ----------------------------------------
2 // Klasse: [Link], [Link]
Die Werte der Variablen einer Klasse beschreiben den 3 // ----------------------------------------
Zustand eines Objekts. 4 public class Address{
Erklärung: Variablen 5
‚ In einer Klasse kann eine beliebige Zahl von Varia- 6 public String _location;
blen definiert werden. 7 public String _postalCode;
8
‚ Jeder Instanz - Objekt - einer Klasse wird beim Er- 9 public Address(String location, String
zeugen im Speicher Platz für diese Variablen bereit- postalCode){
gestellt. 10 _location = location;
Codebeispiel: [Link] 11 _postalCode = postalCode;
12 }
1 // ----------------------------------------
13 }
2 // Klasse: [Link]
14
3 // ----------------------------------------
15 public class Person {
4 public class Point{
16
5
17 public String _firstName;
6 public int _x;
18 public String _lastName;
7 public int _y;
19 public Address _address;
8
20
9 public Point(int x, int y){
21 public Person(String firstName, String
10 this._x = x;
lastName){
11 this._y = y;
22 _firstName = firstName;
12 }
23 _lastName = lastName;
13 }
24 }
14
25 }
15 // ----------------------------------------
26
16 // Klasse: [Link]
27 // ----------------------------------------
17 // ----------------------------------------
28 // Klasse: [Link]
18 public class Programm {
29 // ----------------------------------------
19
30 public class Programm {
20 public static void Main(String[] args){
31
21 // Anlegen 2er Point Objekte p1 und p2
32 public static void Main(String[] args){
22 Point p1 = new Point(3,3);
33 Address a = new Address("Kirchberg am
23 Point p2 = new Point(4,5);
Wagram","3470");
24
34
25 // Ueberweisen von Werten an die Var-
35 Person p = new Point("Jonas","Nage");
26 // iablen der Objekte. Fuer die Objekte
36 p._address = a;
27 // p1 und p2 wird eine eigene Variable
37
28 // _x im Speicher angelegt.
38 // Ausgabe des Wohnorts einer Person
29 p1._x = 7;
39 [Link](p._address._location);
30 p2._x = 8;
40 }
31 }
41
32
42 }
33 }
❑ ❑
8
© Paul Panhofer
Abbildung 3. Zugriffsoperatoren
9
Softwareentwicklung
9 // Properties
Erklärung: Konstruktor
10 public X {
11 // Lesender Zugriff ‚ Ein Konstruktor hat den gleichen Bezeichner wie die
12 get { return _x; } Klasse, ist jedoch eine Methode ohne Rückgabewert.
13
‚ Eine Klasse kann mehrere Konstruktoren besitzten.
14 // Schreibender Zugriff mit Pruefung Wird für eine Klasse kein Konstruktor definiert,
15 set { stellt das System automatisch einen parameterlosen
16 if(value < 0) Konstruktor zur Verfügung.
17 throw new ArgumentException();
18 _x = value; Codebeispiel: [Link]
19 } 1 // ----------------------------------------
20 } 2 // Klasse: [Link]
21
3 // ----------------------------------------
22 public Y { 4 public class Point {
23 // Lesender Zugriff 5
24 get { return _y; } 6 private int _x;
25
7 private int _y;
26 // Schreibender Zugriff mit Pruefung 8
27 set { 9 public X {
28 if(value < 0) 10 get { return _x; }
29 throw new ArgumentException(); 11 set { _x = value; }
30 _y = value; 12 }
31 } 13
32 } 14 public Y {
33
15 get { return _y; }
34 // Konstruktor 16 set { _y = value; }
35 public Point(){} 17 }
36
18
37 } 19 // Defaultkonstruktor
38
20 public Point(){}
39 public class Programm { 21
40
22 // Konstruktor
41 public static void Main(String[] args){ 23 public Point(int x, int y){
42 Point p = new Point(); 24 X = x;
43 p.X = 7; 25 Y = y;
44 // Achtung Fehler: Es koennen nur 26 }
45 // positive Werte zugewiesen werden 27 }
46 p.X = -13; 28
47 } 29 ...
48
30 public static void Main(String[] args){
49 } 31
32 }
❑
10
© Paul Panhofer
11
Softwareentwicklung
‚ Als nächstes wird der Datentyp des Rückgabewerts Vererbung ist eines der grundlegenden Kon-
der Methode definiert. zepte der Objektorientierung.
‚ Dem Datentyp folgt der Methodenname und eine Das Konzept der Vererbung erlaubt es das Ver-
Klammernpaar, in dem sich die optionale Parame- halten einer Klasse auf eine andere Klasse zu
terliste2 befindet. übertragen.
10 // Properties
❑
11 public String FirstName (get; set;)
12 public String LastName (get; set;)
1.3.7 this Referenz 13
14 // Konstruktor
15 public Person(
L this Referenz 16 String firstName,
Die this Referenz ist ein Verweis auf die Spei- 17 String lastName
cheradresse des Objekts. 18 ){
19 [Link] = firstName;
20 [Link] = lastName;
Erklärung: this Referenz 21 }
‚ Mit dem this Schlüsselwort hat man Zugriff auf die 22
28 }
29 ...
30 public static void Main(String[] args){
2 Person p = new Person("Jonas","Nagi");
Das Klammernpaar muss in jedem Fall angegeben 31
12
© Paul Panhofer
38 [Link] = "Joni";
Codebeispiel: [Link]
39 [Link] = "Nagelmaier";
40
1 // ----------------------------------------
41 // Als Datentyp fuer ein Student Objekt 2 // Basisklasse: [Link]
42 // kann auch Person angegeben werden 3 // ----------------------------------------
43 Person t = new 4 public abstract class Person{
Student("Tobias","Haid","e9845323"); 5 ...
44 [Link]([Link]()); 6 }
7
45 }
46
8 public class Student : Person {
9
47 }
10 }
❑
❑
13
Softwareentwicklung
3 ❑
Variablen, Objekte
4
int, long, short, char, byte, float, double
14
© Paul Panhofer
Die Object Klasse stellt für die übrigen Klassen eine 10 private int _y;
Grundimplementierung bereit. 11
❑
❑
15
Softwareentwicklung
29 } 43 }
16
© Paul Panhofer
Abbildung 6. Definitionsebenen
17
Softwareentwicklung
45 }
18
© Paul Panhofer
22 [Link](3,
L Klassenobjekt Point.COUNTER_VALUE());
23 }
Das Klassenobjekt beschreibt das Verhalten
24
und den Zustand einer Klasse. Dazu wird für
25 }
die Variablen und Methoden des Klassenob-
jekts der static Modifikator verwendet. Das
Klassenobjekt selbst wird dabei über den Na- ❑
men der Klasse referenziert.
19
Softwareentwicklung
20
© Paul Panhofer
21
Softwareentwicklung
14 // IQuackBehavior Implementation 19 }
15 public class RedheadDuck : IQuackBehavior{ 20
16 21 > Consolenausgabe
17 public string Quack(){ 22
23 // IQuackBehavior Implementation
❑
24 public class MarbledDuck : IQuackBehavior{
25
22
© Paul Panhofer
15 [Link](ducks);
16 }
17 }
5
Objekte stehen in Abhängigkeit zueinander wenn sie
die Methoden anderer Klassen aufrufen.
23
Softwareentwicklung
11 61 [Link](new ReadHeadDuck());
12 } 62 [Link](new MarbledDuck());
13 63 [Link](new RubberDuck());
14 // ---------------------------------------- 64 [Link](new DuckDecoy());
15 // Fallbeispiel: DuckSimulator - [Link] 65 [Link](new HonkAdapter(new
16 // ---------------------------------------- Goose()));
17 // Wir wollen unser Programm nun um etwas 66
21 69 [Link](ducks);
22 // Das Problem ist dass Gaense ein andere 70 }
23 // Schnittstelle haben als Enten. Wir 71 }
24 // muessen einen Weg finden die Schnitt- 72
39 private IHonkBehaviour _honkable; 87 // Zur Loesung des Problems wird das Entwurfs-
40 88 // muster Dekorator verwendet.
41 public HonkAdapter(IHonkBehavior 89
24
© Paul Panhofer
136 179
137 180
25
Softwareentwicklung
186 [Link]([Link]());
187 [Link]([Link]());
188 [Link]([Link]());
189 [Link]([Link]());
190 [Link]([Link]());
191
194 [Link](ducks);
195 }
196 }
197
198 // ----------------------------------------
199 // UnitTest: DuckSimulator - [Link]
200 // ----------------------------------------
201 public class DuckSimulatorUnitTest {
202
203 [Test]
204 public void QuackCountDecoratorTest(){
205 List<IQuackBehavior> ducks = new
List<>();
206 IDuckFactory factory = new
DecoratedDuckFactory();
207
208 [Link]([Link]());
209 [Link]([Link]());
210 [Link]([Link]());
211 [Link]([Link]());
212 [Link]([Link]());
213
216 [Link](ducks);
217
218 [Link](5,
[Link]);
219 }
220
221 }
26
© Paul Panhofer
. .
27
Softwareentwicklung
L Datenstrukturen
Eine Datenstruktur ist ein Objekt, welches zur
Speicherung und Organisation von Daten
dient.
2.1.1 Grundlagen
Eine Datenstruktur wird als Behälter für andere Ob-
jekte verwendet.
Erklärung: Datenstrukturen
‚ Je nach Datenstruktur werden die enthaltenen Ob-
jekte unterschiedlich strukturiert.
‚ Manche Datenstrukturen erlauben das mehrfache
01. Datenstrukturen 28 Speichern gleicher6 Objekte. Andere Datenstruktu-
ren ordnen Objekte bereits beim Speichern in der
02. Datenstruktur: List 29 Datenstruktur.
‚ Jede Datenstruktur unterstützt dazu unterschiedli-
03. Datenstruktur: Stack 32 che Methoden und Konzepte.
06. Indexer 40
Analyse: Datenstrukturen
‚ Es ist zu beachten das eine Datenstruktur im Grun-
de nur Elemente vom Stack verwaltet. Datenstruk-
turen verwalten damit keine Objekte im eigentlichen
Sinne sondern deren Objektreferenzen vom Stack.
‚ Dieses Prinzip erlaubt es ein Objekt mit mehre-
ren Datenstrukturen zu verwalten ohne eine Kopie
des Objekts erstellen zu müssen. Es werden ledig-
lich neue Pointer am Stack angelegt die auf dasselbe
Objekt verweisen.
‚ Die Speicherbelastung kann damit gleichzeitig ge-
ring gehalten werden.
6
Wertegleichheit
28
© Paul Panhofer
Seite
Befehl Beschreibung
Abbildung 8. Listenmethoden
14 // ----------------------------------------
15 // Syntax: AddRange
2.2.1 Verhalten von Listen 16 // ----------------------------------------
17 // Mit der AddRange Methode kann eine Liste
Bei einer Liste handelt es sich um eine geordnete Da- 18 // von Elmenten an das Ende der Liste ge-
tenstruktur auf die man wie bei Arrays über einen nu- 19 // setzt werden
merischen Index zugreifen kann. Folgende Methoden 20 public void AddRange(List<T> l){...};
werden dabei von der Datenstruktur unterstützt. 21
29
Softwareentwicklung
1 // ---------------------------------------- 1 // ----------------------------------------
2 // Syntax: Clear 2 // Syntax: Insert
3 // ---------------------------------------- 3 // ----------------------------------------
4 // Mit der Clear Methode werden alle Elemente 4 // Mit der Insert Methode kann ein Element
5 // aus der Liste geloescht. 5 // an einem bestimmten Index in die Liste
6 public void Clear(){...}; 6 // eingefuegt werden. Elemente deren Index
7 7 // groesser bzw gleich dem angegebenem
8 public class ListUnitTest{ 8 // Index ist, werden um eine Stelle nach
9 [Test] 9 // hinten verschoben
10 public void TestClear(){ 10 public void Insert(int index, T elem){...};
11 List<Point> points = new List<>(); 11
22 } 22 [Link](4, [Link]);
23 } 23
24 24 [Link](1, 21);
25 // ---------------------------------------- 25
48 48 [Link](new Point(3,4));
49 [Link]([Link](p)); 49 [Link](new Point(5,2));
50 } 50 [Link](new Point(7,2));
51 } 51 [Link](new Point(2,2));
30
© Paul Panhofer
❑
❑
31
Softwareentwicklung
24 // ----------------------------------------
‚ pop: Mit der Pop Methode wird das oberste Element
25 // Syntax: Pop
vom Stapel entfernt.
26 // ----------------------------------------
‚ peek: Die Peek Methode gibt eine Referenz auf das 27 // Mit der Pop Methode wird das oberste
oberste Element im Stapel zurück. 28 // Element vom Stapel entfernt.
29 public T Pop(){...};
30
36 [Link](new Point(4,7));
37 [Link](new Point(0,0));
38
39 Point p = [Link]();
40 [Link](new Point(0,0), p);
41 [Link](2, [Link]);
42 }
43 }
32
© Paul Panhofer
Seite
Befehl Beschreibung
Push Die Methode fügt ein Element zum Stack hinzu. Dazu wird das Element oben auf 32
den Stack gelegt.
Pop Die Methode entfernt das oberste Objekt vom Stapel. 32
Peek Die Methode gibt eine Referenz auf das oberste Element im Stapel zurück. 33
Clear Die Methode loescht alle Objektereferenzen aus dem Stack. 33
Contains Die Methode prueft ob ein bestimmtes Element in der Liste enthalten ist. 34
ToArray Kopiert die im Stack verwalteten Objektreferenzen in ein Array 34
CopyTo Kopiert die im Stack verwalteten Objektreferenzen in ein Array. Es werden alle Ele- 34
mente ab einem bestimmten Index kopiert.
Abbildung 9. Stackmethoden
1 // ---------------------------------------- 1 // ----------------------------------------
2 // Syntax: Peek 2 // Syntax: Clear
3 // ---------------------------------------- 3 // ----------------------------------------
4 // Die Peek Methode gibt eine Referenz auf 4 // Die Clear Methode loescht alle Objektre-
5 // das oberste Element im Stapel zurueck. 5 // ferenzen aus dem Stack.
6 public T Peek(){...}; 6 public void Clear(){...};
7 7
10 [Test] 10 [Test]
11 public void TestPeek(){ 11 public void TestClear(){
12 Stack<Point> pointStack = new 12 Stack<Point> pointStack = new
Stack<Point>(); Stack<Point>();
13 13
24 24 [Link](9, [Link]);
25 Point p = [Link](); 25
26 26 [Link]();
27 [Link](12, [Link]); 27
28 [Link](new Point(2,1), p); 28 [Link](0, [Link]);
29 } 29 }
30 30
31 } 31 }
33
Softwareentwicklung
1 // ---------------------------------------- 1 // ----------------------------------------
2 // Syntax: Contains 2 // Methode: ToArray
3 // ---------------------------------------- 3 // ----------------------------------------
4 // Mit der Contains Methode wird geprueft 4 public class StackUnitTest{
5 // ob ein bestimmtes Element auf dem Stack 5 [Test]
6 // enthalten ist. 6 public void TestToArray(){
7 public bool Contains(T item){...}; 7 Stack<Point> stack = new
8 Stack<Point>();
9 // Hinweis: Die Contains Methode prueft auf 8
37 36 [Link](new Point(3,4));
38 // ---------------------------------------- 37 [Link](new Point(2,1));
39 // Syntax: ToArray 38
46 }
47 }
34
© Paul Panhofer
Seite
Befehl Beschreibung
Enqueue Mit der Enqueue Methode wird ein neues Element in eine Queue eingefügt. 38
Dequeue Mit der Dequeue Methode wird das als erste eingefügte Element aus einer Queue 36
entfernt.
Peek Die Peek Methode gibt eine Referenz auf das zuerst eingefügte Element einer 37
Queue zurück.
Clear Mit der Clear Methode wird eine Queue geleert. 37
Contains Mit der Contains Methode wird geprüft ob ein bestimmtes Element in der Queue 37
enthalten ist. Elemente werden dabei auf Wertegleichheit geprüft.
ToArray Die ToArray Methode kopiert die in der Queue verwalteten Objektreferenzen in 37
ein Array
L Datenstruktur Queue
Eine Queue ist eine dynamische Datenstruktur
mit der eine beliebige Zahl von Elementen ver-
waltet werden kann.
Auflistung: Methoden
‚ Enqueue: Mit der Enqueue Methode wird ein Ele-
ment in eine Queue eingefügt.
7
First In - First Out
35
Softwareentwicklung
40 [Link](new Point(3,2));
41 [Link](new Point(6,1));
42
43 [Link](2, [Link]);
44
45 Point p = [Link]();
46
47 [Link](2, [Link]);
48 [Link](new Point(3,2), p);
49 }
50 }
36
© Paul Panhofer
40 [Link](3, [Link]); ❑
41
45 [Link](
46 points[0], [Link]()
47 );
48 }
49 }
37
Softwareentwicklung
38
© Paul Panhofer
41 grades["Softwareentwicklung"] = 2; 1 // ----------------------------------------
42 grades["Informationssysteme"] = 3; 2 // Syntax: ContainsValue
43 grades["Dezentrale Systeme"] = 2; 3 // ----------------------------------------
44 grades["Medientechnik"] = 1; 4 // Mit der ContainsValue Methode wird ge-
45 5 // prueft ob ein Dictionary einen bestimmten
46 [Link]( 6 // Wert speichert.
47 [Link]("Medientechnik") 7 public bool ContainsValue(V value){...}
48 ); 8
14 grades["Softwareentwicklung"] = 2;
15 grades["Informationssysteme"] = 3;
16 grades["Medientechnik"] = 1;
17
18 [Link](
19 [Link](3);
20 )
21 }
22 }
23
24 // ----------------------------------------
25 // Syntax: Remove
26 // ----------------------------------------
27 // Mit der Hilfe der Remove Methode kann ein
28 // Schluesseleintrag aus einem Dictionary
29 // entfernt werden.
30 public bool Remove(T key){...}
31
37 grades["Softwareentwicklung"] = 2;
38 grades["Informationssysteme"] = 3;
39 grades["Medientechnik"] = 1;
40
41 [Link](3, [Link]);
42
43 [Link]("Medientechnik");
44
45 [Link](2, [Link]);
46 }
47 }
39
Softwareentwicklung
Seite
Befehl Beschreibung
Clear Die Clear Methode löscht alle Einträge aus einem Dictionary 39
ContainsKey Mit der ContainsKey Methode wird geprueft ob ein Dictionary einen bestimmten 39
Wert als Index besitzt.
ContainsValue Mit der ContainsValue Methode wird geprüft ob ein Dictionary einen bestimmten 39
Wert speichert.
Remove Mit der Hilfe der Remove Methode kann ein Schlüsseleintrag aus einem Dictionary 39
entfernt werden.
Codebeispiel: Wertezugriff Ein Indexer ist eine Property, die den direkten
Zugriff auf den Index einer Collection erlaubt.
1 // ----------------------------------------
2 // Dictionary Properties
3 // ----------------------------------------
4 public class DictionaryUnitTest{ 2.6.1 Indexer
5 [Test]
Ein Indexer wird wie jede andere Property einer Klasse
6 public void CompareCollection(){
definiert.
7 Dictionary<String, String> phoneList
8 = new Dictionary<String,String>(); Codebeispiel: Indexer
9
1 // ----------------------------------------
10 phoneList["Haidvogl"] = "0664/89723"; 2 // Definition: Indexer
11 phoneList["Ferfeggy"] = "0650/32323"; 3 // ----------------------------------------
12 phoneList["Adler"] = "0650/56754"; 4 public class GameEngine {
13
5
14 foreach(var person in [Link]){ 6 // Definition der Collection fuer den
15 [Link](person+", "); 7 // Indexer
16 } 8 private int[] playerIds = new int[16];
17
9
18 > Ausgabe 10 // Definition eines Indexers fuer das
19 Haidvogl, Ferfeggy, Adler 11 // playerIds Array
20
12 public int this[int i]{
21 foreach(var num in [Link]){ 13 get { return playerIds[i]; }
22 [Link](num + ", "); 14 set { playerIds[i] = value; }
23 } 15 }
24
16
25 > Ausgabe 17 public GameEngine(){
26 0664/89723 0650/32323 0650/56754 18 ...
27 } 19 }
28 } 20 }
40
© Paul Panhofer
1 // ---------------------------------------- .
2 // Beispiel: Indexer
3 // ----------------------------------------
4 public class GameEngineTest {
5
6 [Test]
7 public void TestIndexer(){
8 GameEngine ge = new GameEngine();
9
10 ge[0] = 34;
11 ge[1] = 54;
12 ge[2] = 98;
13
14 ge[3] = 14;
15 ge[4] = 32;
16 ge[5] = 76;
17
18 ge[6] = 34;
19 ge[7] = 11;
20 ge[8] = 23;
21
22 [Link](34, ge[0]);
23 [Link](54, ge[1]);
24 [Link](98, ge[2]);
25
26 [Link](14, ge[3]);
27 [Link](32, ge[4]);
28 [Link](76, ge[5]);
29
30 [Link](34, ge[6]);
31 [Link](11, ge[7]);
32 [Link](23, ge[8]);
33 }
34 }
41
Softwareentwicklung
. .
42
© Paul Panhofer
L Datentyp String
String ist ein Datentyp zur Verarbeitung von
Zeichenketten.
02. Stringobjekte 47
3.1.2 Instanzieren von Strings
03. Objektmethoden 51 Für das Instanzieren von Stringobjekten stellt die .Net
Spezifikation mehrere Möglichkeiten zur Verfügung.
04. Klassenmethoden 54
Auflistung: Instanzieren von Strings
L Stringliterale
Im Gegensatz zu anderen Klassen werden
Stringobjekte nicht durch den Aufruf eines
Konstruktors sondern durch die Angabe einer
Zeichenfolge in Anführungsstrichen definiert.
Substring
Durch die Verwendung der Substring() Metho-
de, kann aus bestehenden Stringobjekten ein
neues Stringobjekt instanziert werden.
Formatstrings
Formatstrings sind Stringliterale die nicht zur
Complilier- sonder Ausführungszeit eines Pro-
gramms ausgewertet werden.
43
Softwareentwicklung
19 22 //------------------------------------------
20 > Ausgabe 23 // Beispiel: Substring
21 In einem Loch im Boden, da lebte ein "Hobbit". 24 //------------------------------------------
22 Nicht in einem feuchten, schmutzigen ... 25 //Index: 012345678910
23 26 string name = "Gallenblase";
24 27
❑
❑
44
© Paul Panhofer
45
Softwareentwicklung
1 //------------------------------------------ 1 //------------------------------------------
2 // Beispiel: Append 2 // Beispiel: Replace
3 //------------------------------------------ 3 //------------------------------------------
4 // Example 1 4 [Link]();
5 [Link]("BMI Datenformular - Person"); 5 [Link]("c:\\Programme\\java");
6 [Link]("firstName: "); 6 [Link](’\’, ’/’);
7 [Link]("Tobias"); 7 ’
8 [Link](); 8 String data = [Link]();
9 [Link]("lastName: "); 9 [Link](data);
10 [Link]("Haidvogl"); 10
14 [Link](); 14 //------------------------------------------
15 [Link]("married: "); 15 // Syntax: Insert
16 [Link](false); 16 //------------------------------------------
17 17 /*
18 String data = [Link](); 18 * Mit der Insert Methode wird an einem be-
19 [Link](data); 19 * stimmten Index im StringBuilder eine
20 20 * Zeichenkette eingefuegt.
21 > Ausgabe 21 */
22 22 public StringBuilder Insert(int i, var v);
23 BMI Datenformular - Person 23
32 32 > Ausgabe
33 data = [Link](); 33
39 39 //------------------------------------------
40 //------------------------------------------ 40 // Syntax: Remove
41 // Syntax: Replace 41 //------------------------------------------
42 //------------------------------------------ 42 /*
43 /* 43 * Mit der Remove Methode wird ab einem
44 * Mit der Replace Methode kann ein bestimmtes 44 * bestimmten Index eine Zahl von Zeichen aus
45 * Zeichen im StringBuilder durch ein anderes 45 * der Zeichenfolge geloescht.
46 * Zeichen ersetzt werden. 46 */
47 */ 47 public StringBuilder Remove(
48 public StringBuilder Replace( 48 int index,
49 char oldValue, 49 int length
50 char newValue 50 );
51 );
❑
46
© Paul Panhofer
Erklärung: Stringobjekte
‚ Folgende Beispiel zeigen den konzeptionellen Unter-
schied auf.
‚ Zum Instanzieren von Stringobjekten wird kein
Konstruktor verwendet. Codebeispiel: Leere Strings
‚ Stringobjekte sind immutable8 . Die im Stringobjekt 1 //------------------------------------------
gespeicherte Zeichenkette kann nach der Instanzie- 2 // Leere Strings vs. Nullreferenz
rung nicht mehr geändert werden. 3 //------------------------------------------
4 public class StringTest {
Codebeispiel: Stringobjekte 5
1 //------------------------------------------ 6 [Test]
2 // Immutable 7 pulic void TestEmptyString(){
3 //------------------------------------------ 8 string str = "...hello";
4 // Stringobjekte sind immutable. Die Methoden 9
26 > Ausgabe ❑
27 Hello World
28 Hello
8
Der Zustand eines Objekts kann nach der Instanzie-
rung nicht mehr geändert werden.
47
Softwareentwicklung
. .
48
© Paul Panhofer
28 [Link]("hello", 38 [Link]("mjqqu",
[Link]()); [Link]());
29 } 39 }
30 } 40 }
❑ ❑
49
Softwareentwicklung
Seite
Befehl Beschreibung
Contains() Mit der Contains() Methode kann geprüft werden ob eine String eine bestimmte 51
Zeichenkette enthält.
EndsWith() Mit der EndsWith() Methode kann geprüft werden ob am Ende eines Strings eine 51
bestimmte Zeichenkette auftritt.
IndexOf() Mit der IndexOf() Methode kann geprüft werden an welcher Stelle eine bestimmte 51
Zeichenkette in einem String auftritt.
Insert() Mit der Methode Insert() kann an einem bestimmten Index in einen String eine 52
Zeichenkette eingefügt werden.
LastIndexOf() Mit der LastIndexOf() Methode kann der Index des letzten Auftretens einer Zei- 52
chenkette in einem String ermittelt werden.
Remove() Mit der Remove() Methode werden alle Zeichen ab einem bestimmten Index aus 53
einem String entfernt.
Replace() Mit der Replace Methode können alle Vorkommen einer bestimmten Zeichenket- 53
te durch eine andere Zeichenkette ersetzt werden.
Split() Mit der Split() Methode kann ein String in mehrere Zeichenketten aufgespalten 52
werden.
StartsWith Mit der StratsWith() Methode kann geprüft werden ob ein String mit einer bestimm- 51
ten Zeichenkette beginnt.
ToLower() Mit der ToLower() Methode wird ein String in Kleinschreibung umgewandelt. 53
ToUpper() Mit der ToUpper() Methode wird ein String in Großschreibung umgewandelt. 53
Trim() Mit der Trim() Methode können bestimmte Zeichen vom Anfang und Ende eines 54
Strings gelöscht werden.
TrimEnd() Mit der TrimEnd() Methode werden bestimmte Zeichen am Ende eines Strings 54
entfernt.
TrimStart() Mit der TrimStart() Methode werden bestimmte führende Zeichen aus einem String 54
entfernt.
Concat() Mit der Concat() Methode können mehrere Zeichenketten zu einem einzelnen 54
String verknüpft werden.
Join() Mit der Join() Methode können mehrere Zeichenketten zu einem einzelnen String 55
verknüpft werden. Zusätzlich wird nach jeder Zeichenkette ein Trennzeichen
eingefügt.
IsNullOrEmpty() Die IsNullOrEmpty Methode prüft ob ein String eine Nullreferenz oder ob er leer ist. ??
Length Die Length Property gibt die Anzahl der Zeichen eines String an. ??
. .
50
© Paul Panhofer
❑ ❑
51
Softwareentwicklung
26 [Link]("c", split[0]);
Syntax: Insert() Methode 27 [Link]("htlkrems", split[1]);
1 //------------------------------------------ 28 [Link]("abgabe", split[2]);
2 // Syntax: Insert() 29
❑ ❑
52
© Paul Panhofer
53
Softwareentwicklung
54
© Paul Panhofer
22 string[] values2 = {
23 "JOIN", "TABLE"
24 };
25 [Link](
26 "JOIN_TABLE",
27 [Link]("_", values2);
28 );
29 }
30 }
55
Softwareentwicklung
. .
56
© Paul Panhofer
L Fehlerbehandlung
Die Fehlerbehandlung umfasst den richtigen
Umgang mit Ausnahmen und Fehlern.
57
Softwareentwicklung
Exception Beschreibung
SystemException SystemException is the base class that all non-application errors inherit from.
IndexOutOfRangeException The IndexOutOfRangeException is thrown anytime an array or collection is acces-
sed using an index outside its bounds.
NullReferenceException If you attempt to use an object that is considered a null object, the NullReference-
Exception will be thrown.
InvalidOperationException The InvalidOperationException is thrown when the state of an object cannot sup-
port the particular method call being attempted for that object instance.
ArgumentException As the name implies, ArgumentException is thrown when a call is made to a me-
thod using an invalid argument.
ArgumentNullException ArgumentNullException is inherited from ArgumentException, but is thrown speci-
fically when a method is called that doesn’t allow an argument to be null.
ArgumentOutOfRangeException Another child of ArgumentException, the ArgumentOutOfRangeException error
is thrown when a method expects argument values within a specified range, yet
the provided argument falls outside those bounds.
UnauthorizedAccessException Der Aufrufer der Methode hat nicht das Rechte um auf das Filesystem zuzugreifen.
ArgumentException Ein Methodenparameter ist leer oder beinhaltet unzulaessige Zeichen.
ArgumentNullException Ein Methodenparemeter ist eine Nullreferenz.
PathTooLongException Ein Dateisystempfad ist zu lang.
4.1.2 Fehlerbehandlung ❑
Erklärung: Fehlerbehandlung
‚ Wird von einem Benutzer beispielsweise einen
falscher Wert eingegeben, sollte dass nicht gezwun-
gendermassen zum Absturtz des Systems führen.
Syntax: Fehlerbehandlung
1 // ----------------------------------------
2 // Syntax: Fehlerbehandlung
3 // ----------------------------------------
4 try{
5 // Der try Block umfasst jene Anweisungen
6 // die einen Fehler ausloesen koennten.
7 }catch(ExceptionType e1){
8 // Im catch Block kann auf bestimmte Fehler
9 // reagiert werden.
10 }
58
© Paul Panhofer
23 double a = 98, b = 0;
24 double result = 0;
25
26 try {
27 result = SafeDivision(a, b);
28
29 [Link](
30 "{0} divided by {1} = {2}",
31 a,
32 b,
33 result
34 );
35 } catch (DivideByZeroException e){
36 [Link]("Attempted
divide by zero.");
37 }
38 }
39 }
59
Softwareentwicklung
. .
60
© Paul Panhofer
. 5. FileIO
01. Filesystem 62
61
Softwareentwicklung
62
© Paul Panhofer
Seite
Befehl Beschreibung
GetCurrentDirectory() Mit der GetCurrentDirectory Methode kann ermittelt werden welches Ver- 66
zeichnis der Filedescriptor der Anwendung referenziert.
GetDirectories() Mit der GetDirectories Methode können alle Unterverzeichnisse eines Ver- 65
zeichnisses ermittelt werden die bestimmten Kriterien entsprechen.
GetDirectoryRoot() Die GetDirectoryRoot Methode wird verwendet um das Wurzelverzeichnis 66
für ein bestimmtes Verzeichnis zu ermitteln.
GetFiles() Die GetFiles Methode wird verwendet um alle Dateien zu ermitteln die in 66
einem bestimmten Verzeichnis gespeichert sind.
GetFileSystemEntries() Die GetFileSystemEntries wird verwendet um alle Dateien und Unterver- 65
zeichnisse für ein bestimmtes Verzeichnis zu finden.
GetParent() Mit der GetParent Methode kann das Vaterverzeichnis für ein Verzeichnis 66
ermittelt werden.
Move() Die Move Methode wird verwendet um eine Datei bzw. ein Verzeichnis im 64
Filesystem an eine andere Position zu schieben.
63
Softwareentwicklung
❑ 1 // ----------------------------------------
2 // Syntax: Move
3 // ----------------------------------------
5.2.3 Klassenmethode: Delete() 4 public static void Move(
Die Delete Methode wird verwendet um Verzeichnisse 5 string sourceDirName,
im Filesystem zu löschen. 6 string destDirName
7 );
Syntax: Delete() Methode 8
1 // ---------------------------------------- 9 // ----------------------------------------
2 // Syntax: Delete 10 // Codebeispiel: Move
3 // ---------------------------------------- 11 // ----------------------------------------
4 public static void Delete( 12 static void Main(string[] args){
5 string path 13 string sourceDirectory = @"C:\source";
6 ); 14 string destinationDirectory =
7 @"C:\destination";
8 // ---------------------------------------- 15
26 [Link](
27 "top-level directory exists: "
28 + directoryExists
29 );
30 }catch(UnauthorizedAccessException e){
31 [Link]("UnauthorizedAccess");
32 }catch(PathTooLongException e){
33 [Link]("path too long");
34 }
35 }
64
© Paul Panhofer
65
Softwareentwicklung
8 8 // ----------------------------------------
9 // ---------------------------------------- 9 // Codebeispiel: GetDirectoryRoot
10 // Codebeispiel: GetFiles 10 // ----------------------------------------
11 // ---------------------------------------- 11 public static void Main(String[] args){
12 public static void Main(string args[]){ 12 string dir = @"C:\test";
13 try{ 13
Mit der GetParent Methode kann das Vaterverzeichnis Syntax: GetCurrentDirectory() Methode
für ein Verzeichnis ermittelt werden. 1 // ----------------------------------------
2 // Syntax: GetCurrentDirectory
Syntax: GetParent() Methode
3 // ----------------------------------------
1 // ---------------------------------------- 4 public static string GetCurrentDirectory();
2 // Syntax: GetParent 5
3 // ---------------------------------------- 6 // ----------------------------------------
4 public static DirectoryInfo GetParent( 7 // Codebeispiel: GetCurrentDirectory
5 string path 8 // ----------------------------------------
6 ); 9 public static void Main(String[] args){
7
10 string path =
8 // ---------------------------------------- [Link]();
9 // Codebeispiel: GetParent 11
10 // ---------------------------------------- 12 [Link](
11
13 "The current directory is {0}",
12 . 14 path
15 );
❑ 16 }
66
© Paul Panhofer
67
Softwareentwicklung
Seite
Befehl Beschreibung
AppendAllLines() Die AppendAllLines Methode wird verwendet um eine Liste von Strings 70
an das Ende einer Textdatei zu schreiben. Existiert die Datei nicht wird sie
angelegt.
AppendAllText() Die AppendAllText Methode wird verwendet um einen String an das Ende ??
einer Textdatei zu schreiben. Existiert die Datei nicht wird sie angelegt.
AppendText() Die Methode wird verwendet um Zeichenkette an eine Textdatei 69
anzuhängen.
CreateText() Die CreateText Methode wird verwendet um Textdateien im Filesystem 68
anzulegen.
Delete() Die Delete Methode wird verwendet um Dateien zu löschen. 69
Exists() Mit der Exists Methode kann geprüft werden ob eine Datei im Filesystem 67
existiert.
OpenRead() Mit der OpenRead Methode wird eine Datei geöffnet und deren Inhalt ??
gelesen.
OpenText() Die OpenText Methode wird verwendet um eine Textdatei zu öffnen. 70
OpenWrite() Mit der OpenWrite Methode wird eine Datei für den schreibenden Zugriff ??
geöffnet. Existiert die Datei nicht wird sie angelegt.
ReadAllText() Mit der ReadAllText Methode wird eine Datei geöffnet und der Inhalt ??
ausgelesen.
ReadLines() 69
WriteAllLines() Die WriteAllLines Methode wird verwendet um eine neue Datei anzulegen ??
und eine Liste von Zeichenketten in die Datei einzutragen.
WriteAllText() Die WriteAllText Methode wird verwendet um eine neue Datei mit einem 68
bestimmten Textinhalt im Filesystem anzulegen. Existiert die Datei bereits
wird sie überschrieben.
68
© Paul Panhofer
14 if () {
Syntax: ReadLines() Methode
15 using (StreamWriter sw =
1 // ----------------------------------------
[Link](path)){
2 // Syntax: ReadLines
16 [Link]("Hello");
3 // ----------------------------------------
17 [Link]("And");
4 public static IEnumerable<string> ReadLines(
18 [Link]("Welcome");
5 string path
19 }
6 )
20 }
7 // ----------------------------------------
21
8 // Codebeispiel: ReadLines
22 using (StreamReader sr =
9 // ----------------------------------------
[Link](path)){
10 foreach (string line in
23 string s = "";
[Link](@"d:\data\[Link]")){
24 while ((s = [Link]()) != null){
11 [Link](line);
25 [Link](s);
12 }
26 }
27 }
28 } ❑
14 if (){
15 using (StreamWriter sw =
16 [Link](path)){
17 [Link]("Hello and");
18 [Link]("Welcome");
19 }
20 }
21 using (StreamWriter sw =
22 [Link](path)){
23 [Link]("This is extra");
24 }
25 }
69
Softwareentwicklung
9 // ----------------------------------------
10 // Codebeispiel: WriteAllLines
❑
11 // ----------------------------------------
12 public static void Main(string[] args){
5.3.8 Klassenmethode: AppendAllLines() 13 string path = @"c:\temp\[Link]";
14
Die AppendAllLines Methode wird verwendet um ei- 15 List<string> data = new List<string>();
ne Liste von Strings an das Ende einer Textdatei zu 16
schreiben. Existiert die Datei nicht wird sie angelegt. 17 [Link]("data 1");
18 [Link]("data 2");
Syntax: AppendAllLines() Methode 19 [Link]("data 3");
1 // ---------------------------------------- 20
9 // ----------------------------------------
10 // Codebeispiel: AppendAllLines
11 // ----------------------------------------
12 public static void Main(string[] args){
13 string path = @"c:\temp\[Link]";
14
70
© Paul Panhofer
6.1.1 Grundlagen
L Entwurfsmuster
Ein Entwurfsmuster - Design Pattern - be-
schreibt ein bestimmtes Entwurfsproblem in
der Softwareentwicklung, sowie ein Schema
zu seiner Lösung.
Erklärung: Entwurfsmuster
‚ Entwurfsmuster helfen bei der Lösung immer wieder
auftretender Probleme in der Softwareentwicklung.
‚ Design Pattern sind dabei das Result der 30 jährigen
Erfahrung der Softwarecomunity. Man darf davon
ausgehen, dass sie für ein bestimmtes Problem die
bestmögliche Lösung darstellen.
‚ Design Patterns werden in der Objektorientierten
Programmierung als Standard angesehen. Softwa-
01. Entwurfsmuster 71 rearchitekten greifen auf sie zurück, um ihre Pro-
gramme zu entwerfen.
02. Erzeugungsmuster 72
❑
03. Strukturmuster 75
6.1.2 Arten von Pattern
Je nach Entwicklungsfokus unterscheidet man unter-
schiedliche Formen von Entwurfsmustern.
r Idiom
Idiome sind Entwurfsmuster die Teil der eigent-
lichen Programmiersprache sind.
Entwurfsmuster
Entwurfsmuster beschreiben das Zusammen-
spiel von Klassen.
Architekturmuster
Architekturmuster beschreiben das Zusam-
menspiel von Komponenten.
71
Softwareentwicklung
72
© Paul Panhofer
73
Softwareentwicklung
1 // ---------------------------------------- 1 // ----------------------------------------
2 // Erzeugungsmuster: Factory 2 // Erzeugungsmuster: Factory
3 // ---------------------------------------- 3 // ----------------------------------------
4 public class DuckSimulator { 4 public class DuckFactory : IDuckFactory{
5 public void Simulate(List<IQuackBehavior> 5 public IQuackBehavior CreateReadHDuck(){
ducks){ 6 return new ReadHeadDuck();
6 foreach(IQuackBehaviour duck in ducks){ 7 }
7 [Link]([Link]()); 8
25 27 [Link]([Link]());
26 public IQuackBehavior CreateMarbledDuck(){ 28 [Link]([Link]());
27 return new OutputDecorator(new 29 [Link]([Link]());
QuackCountDecorator(new 30 [Link]([Link]());
MarbledDuck())); 31 [Link]([Link]());
28 } 32
33 38 [Link]();
34 public IQuackBehavior CreateGoose(){ 39
36 } 43 [Link](ducks);
37 } 44 }
45 }
74
© Paul Panhofer
L | 6
7
}
75
Softwareentwicklung
76
© Paul Panhofer
8 [Link](new L Command
QuackCountDecorator(new
Das Command Muster erlaubt es eine Metho-
OutputDecorator(new
de wie ein Objekt zu verwenden.
ReadHeadDuck())));
9 [Link](new Damit wird es möglich Methodenobjekte in
QuackCountDecorator(new Warteschlangen zu stellen, Logbucheinträge
OutputDecorator(new zu führen bzw. die Auswirkungen der Metho-
MarbledDuck()))); de wieder rückgängig zu machen.
10
13 //------------------------------------------
14 // Klasse: ACommand
❑
15 //------------------------------------------
16 public abstract class ACommand {
17
27 }
28
29 //------------------------------------------
30 // Klasse: Point
31 //------------------------------------------
32 public class Point {
33 private int _x;
34 private int _y;
77
Softwareentwicklung
35 1 //------------------------------------------
36 public int X { 2 // Klasse: Robot
37 get => _x; 3 //------------------------------------------
38 set => _x = value; 4 public class Robot {
39 } 5
48 _y = y; 14 //------------------------------------------
49 } 15 // Klasse: MoveUpCommand
50 16 //------------------------------------------
51 public Point CalculateNeighbour( 17 public class MoveUpCommand : ACommand{
52 EDirectionType direction 18 public MoveUpCommand(Robot robot) :
53 ) { base(robot) { }
54 Point p = null; 19
68 33 //------------------------------------------
69 case [Link]: 34 // Klasse: MoveDownCommand
70 p = new Point( 35 //------------------------------------------
71 this._x -1, this._y 36 public class MoveDownCommand : ACommand{
72 ); 37 public MoveDownCommand(Robot robot) :
73 break; base(robot) { }
74 38
78
© Paul Panhofer
8 56 return true;
9 private Robot _robot; 57 }
10 58
17 66 _history.Push(command);
18 _history.Clear(); 67 return true;
19 _commands.Push(command); 68 }
20 [Link](); 69 }
21 }
22 ❑
23 public void MoveDown() {
24 MoveDownCommand command = new
6.4.2 Verhaltensmuster - Strategy
MoveDownCommand(_robot);
25
26 _history.Clear(); L Strategy
27 _commands.Push(command); Das Strategie Muster ermöglicht es das Verhal-
28 [Link](); ten eines Objekts zur Laufzeit zu ändern. Für
29 } das Strategie Muster wird das Verhalten einer
30
Klasse in eine eigene Klasse ausgelagert.
31 public void MoveLeft() {
32 MoveLeftCommand command = new
Erklärung: Motivation und Kontext
MoveLeftCommand(_robot);
33
‚ Wir haben die Aufgabe den Warenkorb eines Web-
34 _history.Clear(); shops zu programmieren. Beim Bezahlen der Waren
35 _commands.Push(command); soll der Kunde mehrere Möglichkeiten für das Über-
36 [Link](); weisen des gewünschten Betrags haben.
37 } ‚ Der Bezahlvorgang wird als Strategie konzipiert und
38 kann dadurch bei jedem Bestellvorgang beliebig ge-
39 public void MoveRight() { wählt werden.
40 MoveRightCommand command = new
MoveRightCommand(_robot); Codebeispiel: Command
41 1 //------------------------------------------
42 _history.Clear(); 2 // Schnittstelle: IPaymentStrategy
43 _commands.Push(command); 3 //------------------------------------------
44 [Link](); 4 public interface IPaymentStrategy{
45 } 5 public void pay(int amount);
46 6 }
79
Softwareentwicklung
1 //------------------------------------------ 1 //------------------------------------------
2 // Klasse: CreditCardStrategy 2 // Klasse: Item
3 //------------------------------------------ 3 //------------------------------------------
4 public class CreditCardStrategy : 4 public class Item {
IPaymentStrategy{ 5
7 9 public UpcCode{
8 private string _cardNumber; 10 get => _upcCode;
9 private string _name; 11 }
10 12
20 } 23 //------------------------------------------
21 } 24 // Klasse: ShoppingCart
22 25 //------------------------------------------
23 //------------------------------------------ 26 public class ShoppingCart{
24 // Klasse: CreditCardStrategy 27
42 ); 47 return sum;
43 } 48 }
44 }
80
© Paul Panhofer
7 //------------------------------------------
8 // Klasse: ShoppingCartUnitTest
9 //------------------------------------------
10 public class ShoppingCartUnitTest{
11
12 [Test]
13 public void Test(){
14 ShoppingCart cart = new ShoppingCart();
15
19 [Link] =
20 new PaypalStrategy(
21 "myemail@[Link]","mypwd"
22 );
23
24 [Link]();
25 }
26
27 }
81
.
Index
Architekturmuster, 54
Entwurfsmuster, 54
Idiom, 54
Singleton, 55
82