Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Objekt-Orienteret Programmering (OOP)

Lignende præsentationer


Præsentationer af emnet: "Objekt-Orienteret Programmering (OOP)"— Præsentationens transcript:

1 Objekt-Orienteret Programmering (OOP)

2 Oversigt Introduktion til kurset Introduktion til C#
Common Language Infrastructure Data typer Indbyggede vs. Brugerdefinerede typer Værdi- vs. Referencetyper Metoder og parametermekanismer

3 OOP Kurset Projektenhedkursus for Dat1 og SW3
Kurset skal støtte projektarbejdet Kurset eksamineres af projektvejlederen gennem den afleverede projektrapport Endvidere eksamineres Dat1 og SW3 studerende i OOP via MIP

4 Miniprojekt i Programmering (MIP)
Indhold: I skal udvikle, i grupper på højst 4 deltagere, et program, som skal løse et på forhånd formuleret og afgrænset problem. (Se eksempler på hjemmesiden) Programmet skal laves på 48 timer. Ved udløbet af tidsrummet afleveres programmet samt kortfattet dokumentation (efter nærmere retningslinier) i udskrift og på elektronisk form. Prøveform: Intern mundtlig prøve. Bedømmelse: Individuel bedømmelse bestået/ikke bestået.

5 Miniprojekt i Programmering (MIP)
Mål: Efter et gennemført miniprojekt i programmering skal den studerende kunne: udvikle et program, som opfylder relativt præcist beskrevne krav forklare og argumentere for sammenhænge og detaljer i et program, som den studerende har udarbejdet sammen med andre studerende demonstrere forståelse af nøglebegreber og -mekanismer i det objekt-orienterede programmeringsparadigme relativt til det udviklede program udforme et program som er forståeligt/læsbart af andre programmører benytte korrekt fagterminologi

6 Kursusplan Introduktion til kurset og C# Klasser og objekter
Nedarvning og polymorfisme Interfaces Generiske typer og metoder Delegates, lamda udtryk og events Collections Exception Handling Testing 1 Testing 2 Design By Contract Design Patterns TBA

7 Litteratur Primært: ”Essential C# 4.0” af Mark Michaelis Derudover
”C# 4.0 In a Nutshell” af Joseph & Ben Albahari MSDN Library ( Fri-tekst søgning, fx ”int”, ”string”, … IDE Programming Guide Reference, inkl. Language Specification Diverse online materiale

8 Installation af C# Windows: .NET Framework og command-line:
Visual C# 2010 Express (gratis, kræver registrering) Visual Studio 2010 Professional, Premium eller Ultimate (gratis via MSDNAA) Linux/Windows/Mac OS X: Mono (cross-platform, open source implementation af .NET Framework) MonoDevelop Statisk og dynamisk typetjek – dyn: når der foretages et downcast Strongly typed (strikse regler for lovlige operationer på typer, type-konverteringer, exceptions)

9 Introduktion til C# Implementation af det objekt-orienterede paradigme der inkluderer indkapsling, nedarvning og polymorfisme. Bygger på C, C++ (& Java) syntaks og features Dog Pascal casing i C# Del af en større eksekveringsplatform kaldet Common Language Infrastructure (CLI)

10 Common Language Infrastructure (CLI)
Åben specifikation (ECMA-335) der specificerer følgende (MS: .NET Framework): Common Type System (CTS) Common Language Specification (CLS) [assembly: CLSCompliant(true) ] Common Intermediate Language (CIL) Virtual Execution System (VES) (MS: CLR) Base Class Library (BCL) (MS: FCL) Sprog-interoperabilitet, platforms portabilitet, managed execution COMMON LANGUAGE INFRASTRUCTURE Common Language Infrastructure (CLI): A specification for the format of executable code, and the runtime environment that can execute that code. COMMON TYPE SYSTEM Hvordan typer erklæres, bruges og håndteres af runtime. - Indbyggede typer, semantik for værdi- og ref typer, regler for type-konvertering, System.Object arv. Og synlighed, nedarvnings-regler Ensartet typesystem – data mellem sprog Vi kommer ind på reglerne løbende i kurset. COMMON LANGUAGE SPECIFICATION Regler om case-insensitivity, kompatible returtyper Kun offentlige medlemmer Klassebiblioteks-design COMMON INTERMEDIATE LANGUAGE Instruktionssættet der forstås af VES VES: Loader og eksekverer CLI-kompatible programmer (assemblies) Managed execution: Hukommelses-allokering/deallokering, Exception handling, Tråd-synkronisering *

11 Kompilering til CIL *.dll eller *.exe <- VES

12 Typer Indbyggede typer: Direkte understøttet af CTS
Brugerdefinerede typer: komplekse typer sammensat af andre typer. Værdityper vs. referencetyper

13 Indbyggede typer Værdityper (primitive typer): Referencetyper
Numeriske typer: Positive Helttal (Z+): byte, ushort, uint, ulong Helttal (Z): sbyte, short, int, long Reelle tal (R): float, double, decimal Logisk type: bool Karakter: char Referencetyper string object

14 Indbyggede heltals-typer
Size Range (Inclusive) BCL Name Signed sbyte 8 bits -128 to 127 System.SByte Yes byte 0 to 255 System.Byte No short 16 bits -32,768 to 32,767 System.Int16 ushort 0 to 65,535 System.UInt16 int 32 bits –2,147,483,648 to 2,147,483,647 System.Int32 uint 0 to 4,294,967,295 System.UInt32 long 64 bits –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 System.Int64 ulong 0 to 18,446,744,073,709,551,615 System.UInt64 8- og 16-bit integers har ingen aritmetiske operatorer. Base 16 Decimal notation: int x1 = 127; Hexadecimal notation (0x præfix, 0-9, A-F): int x2 = 0x7F

15 Indbyggede komma-tals typer
Size Range (Inclusive) BCL Name Significant Digits float 32 bits ±1.5 × 10⁻⁴⁵ to ±3.4 × 10+38 System.Single 7 double 64 bits ±5.0 × 10−324 to ±1.7 × System.Double 15-16 Større tal, mindre præcision (afrundings-fejl) – videnskabelig beregninger Mindre tal, større præcision (ingen afrundings-fejl) – finansielle beregninger Type Size Range (Inclusive) BCL Name Significant Digits decimal 128 bits 1.0 × 10−28 to approximately 7.9 × 10+28 System. Decimal 28-29 positiveInfinity, negativeInfinity, NaN – double og float Decimal notation: double billion1 = Exponential notation (E): double billion2 = 1E9

16 Numerisk Suffiks Type-inferens: Hardcodede værdier (litteraler) fortolkes som int (derefter uint, long, ulong) eller double (afhængig af . ) Suffiks kan tilføjes for at tvinge litteral til en bestemt data type: Suffix Type Numeric Suffix Example unsigned int U or u uint x = 100U; long L or l long x = 100L; unsigned long UL or ul ulong x = 100UL; float F or f float x = 100F; double D or d double x = 100D; decimal M or m decimal x = 100M; float f = 6.5; Decimal d = 6.5; Kan ikke kompilere – brug hhv. f og d

17 Numeriske konverteringer
Er implicit når destinationstypen kan holde alle værdier fra source-typen. Ellers kræves eksplicit konvertering (cast). short s1 = 10; int i1 = s1; short s2 = (short)s1; sbyte short int long float double byte ushort uint ulong decimal char

18 Eksplicit konvertering
Kan resultere i tab af præcision eller OverflowException. decimal -> helttal: Værdi afrundes Værdi uden for range : OverflowException double/float -> heltal: Værdi kappes af efter komma. Værdi uden for range: Checked: OverflowException Unchecked: Uspecificeret Double -> float: Afrunding Værdi uden for range: 0 eller infinity. float/double -> decimal: Konvertering til decimal repræsentation Værdi for lille: 0. Værdi er NaN (not a number), infinity, eller for stort: OverflowException Decimal -> float/double: Afrunding til nærmeste værdi double d = double.MaxValue; int x = checked ( (int) d ); Værdi = resulterende værdi For lille til at blive repræsenteret som decimal Source og destinationtypens værdi

19 bool og char bool: true eller false. char
Ingen konvertering til/fra andre typer char Unicode tegn (karakter) Konverteres til ushort (og derfra videre) Bool - kontrolstrukturer char x1 = 'X'; // Character literal char x2 = '\x0058'; // Hexadecimal char x3 = (char)88; // Cast from integral type char x4 = '\u0058'; // Unicode

20 Unicode Escape Characters
Escape Sequence Character Name Unicode Encoding \’ Single quote \u0027 \” Double quote \u0022 \\ Backslash \u005C \0 Null \u0000 \a Alert (system beep) \u0007 \b Backspace \u0008 \f Form feed \u000C \n Newline \u000A \r Carriage return \u0009 \v Vertical tab \u000B \uxxxx Unicode character in hex \u0029 (example) Alle unicode karakterer har en 4-cifret unicode encoding

21 String string klassen repræsenterer et array af char.
String klassen har et rigt API bestående af statiske metoder (kaldes via klassenavn) og instans-metoder (kaldes via variabel-navn). static Main { string s1 = new string(new char[] {’H’, ’e’, ’l’, ’l’, ’o’}); string s2 = ”hello world”; string stutter = string.Concat(s1, s2); int isSame = string.Compare(s1.ToLower(), s2.ToLower()); //og mange flere… } Statisk metode System.Text.StringBuilder Instans-metode

22 Opbygning af tekst Strings er immutable (uforanderlige/konstante).
string s1 = ”Pizza”; //et nyt string objekt s1 += ” med pepperoni, ” + ”pølser, ” + ” og skinke”; 5 string objekter: 1) ”med pepperoni, ” 2) ”pølser, ” 3) ” og skinke” 4) ”med pepperoni, pølser” 5) Resultatet gemmes i nyt string objekt. System.Text.StringBuilder modificerer tekst uden at lave en ny kopi for hver modifikation StringBuilder: Append(), Insert(), Remove(), Replace(). På sin plads at nævne System.Text.StringBuilder samt konsol I/O

23 Konsol I/O Input: Output Console.Read() Console.ReadKey()
Console.Readline() Output Consoler.Write(…) Console.WriteLine(…) Main() { Console.WriteLine(”Enter name”); string name = Console.ReadLine(); Console.WriteLine(”Hi ” + name); }

24 Konvertering mellem string og numeriske typer
Konvertering fra en string type til en numerisk type: Parse() Parse() er defineret for alle numeriske data typer. TryParse() håndterer konverteringsfejl ved at returnere false istedet for at kaste en exception: string emergencyText = “911”; int emergencyNum = int.Parse(emergencyText); if (int.TryParse(emergencyText, out emergencyNumber)) { // Converted correctly, now use number }

25 System.Object Roden i type hierakiet Equals(Object)
Object.Equals(Object a, Object b) Object.ReferenceEquals(Object a, Object b) GetHashCode ToString GetType Finalize MemberwiseClone Equals – samme VÆRDI Finalize – til at frigive UNMANAGED resourcer, fx db-connection, files, stream and handles (Dispose fra Idisposable) - Kan ikke kaldes direkte

26 Data strukturer i BCL Arrays (fixed størrelse collection)
List (variabel størrelse collection) System.Collections.Generic namespace indeholder desuden Dictionary, LinkedList, Stack, Queue, …

27 Array erklæring og initialisering
//1. Erklæring efterfult af initialisering string[] languages; languages = new string[3]; //default: 0, ‘\0’, null, false languages[0] = “C#”; languages[1] = “Java”; languages[2] = “Ruby”; Languages[3] = ”Illegal”; //IndexOutOfRangeException //2. Andre initialiseringsmåder: string[] languages = (new string[(3)]) { "C#“, "Java", "Ruby“ }; languages = {”C#”, ”Java”, ”Ruby”}; languages = new string[] {”C#”, ”Java”, ”Ruby”}; languages = new string[3] {”C#”, ”Java”, ”Ruby”}; //array initializer skal matche længde () betyder her ”frivillig” Array initializer

28 Multi-dimensionelle arrays
Rektangulære arrays (dimensioner af samme længde) int[,] tal = int[3,3]; int num = 1; for (int i = 0; i < tal.GetLength(0); i++) for (int j = 0; j < tal.GetLength(1); j++) tal[i, j] = num++; //Initialisering af 2-dimensionelt array int[,] tal = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; Jagged arrays (arrays af arrays) int[][] tal3 = new int[][] { new int[] {1, 2}, new int[] { 3, 4, 5 }, new int[] { 6, 7, 8, 9 } }; //rektangulær //array tilgang tal[0, 0] //1 tal[2, 2] //9 //jagged array //tilgang tal[0][0] // 1 tal[2][3] //9

29 List collection Bruges til variabel-størrelse samling af elementer (~ Java ArrayList) Implementeret internt som et array der kan vokse når kapacitet nås

30 API – Tilføje og fjerne elementer
public List <T> { public List(); public List(IEnumerable<T> collection); public List(int capacity); //tilføj og indsæt elementer public void Add( T item); public void AddRange( IEnumerable<T> collection); public void Insert( int index, T item); public void InsertRange( int index, IEnumerable<T> collection ); //fjern elementer public bool Remove(T item); public void RemoveAt(int index); public void RemoveRange(int index, int count); public void RemoveAll( Predicate<T> match); }

31 List collection List<string> languages = new List<T>();
languages.Add(”C#”); Languages.Add(”Java”); // {C#, Java} languages.AddRange( {”Ruby, Scala”} ); // {C#, Java, Ruby, Scala} languages.Insert(1, ”Python”); // {C#, Python, Java, Ruby, Scala} languages.InsertRange(1, {”F#, Haskell”} ); // {C#, F#, Haskell, Python, Java, Ruby, Scala} languages.Remove(”Haskell”); //nu {C#, F#, Python, Java, Ruby,Scala} languages.RemoveAt(1); //nu {C#, Python, Java, Ruby, Scala} languages.RemoveRange(2, 2); //nu {C#, Python, Scala} languages.RemoveAll(elem => elem.StartsWith(”S”)); // { C#, Python } Languages[1] = ”Iron Python” // { C#, Iron Python } Console.WriteLine(languages.Count()); // 2 Console.WriteLine(languages[5]); //IndexOutOfRangeException

32 Brugerdefinerede typer
Enums Structs Klasser Interfaces og delegates senere..

33 Enum Gruppe af heltalsværdier Type-definition:
public enum Weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; public enum StatusCode : ushort { OK = 200, Created, Accepted, NotFound = 404 }; Brug: Weekday day = Weekday.Sat; //5, da 0 indexeret bool weekend = (day == Weekday.Sat || day == Weekday.Sun);

34 Klasse vs. struct public class Point { private int x, y;
public CPoint(int x, int y) this.x = x; this.y = y; } public void MovePoint(int x, int y) this.x += x; this.y += y; public struct Point Point p = new Point(2, 4); p.MovePoint(3, 3) //p.x= 5, y = 7

35 Klasse vs. struct Ens, bortset fra: Struct bruges når:
Struct er en værditype Klasse er en referencetype Struct: Ingen nedarvning Struct bruges når: værditype semantik er at foretrække, fx komplekse numeriske typer. Til letvægts-typer (<= 16 byte)

36 Værdityper vs. Referencetyper
En type er en værditype eller en referencetype. En værditype-variabel indeholder en værdi. En referencetype-variabel indeholder en reference til et objekt. Reference = hukommelsesadresse hvor objektet befinder sig. Værdi-typer: Alle numeriske typer, char, bool, structs og enums. Alt andet er reference-typer: Klasser, arrays, delegates og interfaces. Værdityper gemmes på stakken, referencetyper gemmes i heap.

37 Heap Stak Main() { int num1 = 17; int num2 = num1; int num2 = 23; Person ib = new Person(); ib.Alder = 23; ib.Navn = ”Ib”; Person ib2 = ib; ib2.Alder = ib2.Alder * 2; ib1.Navn = ”Bo”; ib = null; ib2 = null; } 17 [hex1] null [hex1] null 23 [hex1] hex2 23 [hex1] hex2 46 [hex2] ”Ib” 23 17 null hex1 [hex3] ”Bo” hex1 null Pointe: Ændringer til et objekt foretaget via én ref-variabel vil kunne ses i andre ref-variable der peger på samme objekt (da de netop refererer til samme objekt). Referencetype variable har separat allokering af reference og objekt der tillader dette. Værditype variable kan ikke referere til samme hukommelsesplads (med mindre… out, ref)

38 Person[] p1 = new Person[2]; p1[0] = new Person(”Per”);
Stak Heap [hex1] 4 5 Main() { Point p1 = new Point(4, 5); Point p2 = p1; p2.X = 10; int[] a1 = {1, 2, 3} int[] a2 = a1; a2[2] = a1[0] * 10; Person[] p1 = new Person[2]; p1[0] = new Person(”Per”); Person[] p2 = p1; p2[1] = new Person(”Kaj”); } [hex2] 10 5 [hex2] 4 5 [hex3] 1 2 3 [hex3] 1 2 10 [hex5] ”Per”** null hex3 [hex6] ”Kaj”** null hex3 [hex4] hex5 null [hex4] null [hex4] hex5 hex6 hex4 hex4 **Snyder med string-ref pga. plads-mangel

39 Erklæring Parametermekanismer Overloads (operationel polymorfisme)
Metoder Erklæring Parametermekanismer Overloads (operationel polymorfisme) Vi starter med parameter-mekanismer

40 Metode-erklæring En metode erklæres inde i en klasse eller struct Form: Adgangs-modifikator: public, private, protected, internal Static: Klasse-metode i stedet for instans-metode. Kaldes Klasse.Metode() i stedet for var.Metode() Retur-type: void, indbygget type eller brugerdefineret type Ex. public static double SquareRoot(double num) {…} int Sum(int a, int b) { … } [adgangs-modifikator][static] retur-type metode-navn ( [parametre] )

41 Værdi-parametre Default: Pass By Value
Værdi af call site argument kopieres til target parameter //call site static Main() { int x = 5; Person p = new Person(); //hex1 p.Navn = ”Ib”; MethodA(x); //x = 5 MethodB(p); //p.Navn = ”Kong Ib”; MethodC(p); } static void MethodA(int a) { a += 10; } 5 (int a = x) static void MethodB(Person b) { b.Navn += ”Kong ” + b.Navn; } hex1 (Person b = p) hex1 static void MethodC(Person c) { c = null; } (Person c = p)

42 Reference-parametre (ref)
Parameter-passing mekanismen kan eksplicit ændre til pass by reference. ref angiver at target-parameter er alias for call-site argument (ikke en kopi) //call site static Main() { int x = 5; Person p = new Person(); //hex1 p.Navn = ”Ib”; MethodA(ref x); //x = 15 MethodB(ref p); //p.Navn = ”Kong Ib” (som før) MethodC(ref p); //p == null } static void MethodA(ref int a) { a += 10; } a alias for x b alias for p static void MethodB(ref Person b) { b.Navn += ”Kong ” + b.Navn; } c alias for p static void MethodC(ref Person c) { c = null; }

43 Output-parametre (out) – også pass by reference
Som ref, dog behøver parametre behøver ikke være initialiseret ved kald. Parameter skal være initialiseret inden retur til call site //call site static Main() { int x; MethodA(out x); //x = 10 Person p; MethodB(out p); //p.Navn = ”Ib” //p refererer til nyt objekt } static void MethodA(out int a) { a = 10; } static void MethodB(out Person b) { b = new Person(); b.Navn += ”Ib”; }

44 Forskel i en nøddeskal default (sende parameter ind)
Almindeligt input (langt den mest almindelige) ref (sende parameter ind og ud) Manipulation af multiple værdier out (sende parameter ud) Multiple returværdier

45 Parameter arrays params modifer kan specificeres som sidste parameter i en metode Angiver at metoden accepterer et vilkårligt antal (0..n) parametre af en given type (et array er også ok). Parameter typen skal erklæres som et array static int Sum(params int[] numbers) { int sum = 0; for (int i = 0; i < numbers.Length) sum += numbers[i]; return sum; } static Main() { int total0 = Sum(); int total1 = Sum(1, 2, 3, 4); int total2 = Sum(new int[] { 1, 2, 3, 4 }); }

46 Metode Overloading Multiple metoder med samme navn, men forskellig signatur (antal og/eller type af parametre). Forskellige måder at kalde en metode Implementér logik i én metode som de andre overloadede metoder kalder (maintainability). Title(string name) { return Title(name, Sex.Male, 10, false) } Title(string name, Sex s) { return Title(name, s, 10, false); } Title(string name, Sex s, int age) { return Title(name, s, age, false); } Title(string name, Sex s, int age, bool married) { /* implementation */ }

47 Frivillige (optional) parametre
Alternativ til normal metode overload En frivillig parameter kan udelades i metodekald En frivillig parameter specificerer en default værdi Rækkefølge: [krævede parametre,] frivillige parametre [, params]

48 Original metode overload:
Title(string name) { return Title(name, Sex.Male, 10, false) } Title(string name, Sex s) { return Title(name, s, 10, false); } Title(string name, Sex s, int age) { return Title(name, s, age, false); } Title(string name, Sex s, int age, bool married) { /* implementation som nedenunder */ } Med frivillige parametre: string Title(string name, Sex s = Sex.Male, int age = 10, bool married = false) { string prefix; if (s == Sex.Male) prefix = ”Mr. ”; else if (married) prefix = ”Mrs. ”; else prefix = ”Ms. ”; return prefix + name + ”, age ” + age + (married ? ”, married” : ”not married”); } Call site (klient): string a = Title(”Mox”); //”Mr. Mox, age 10, not married” string b = Title(”Bee”, Sex.Female); //”Ms. Bee, age 10, not married” string c = Title(”T”, Sex.Male, 50); //”Mr. T, age 50, not married” string d = Title(”Jones”, Sex.Female, 45, true); //”Mrs. Jones, age 45, married”

49 Navngivne (named) parametre
Identificering af argumenter ved navn i stedet for position Navngivne parametre kan optræde i vilkårlig rækkefølge Positionelle og navngivne parametre kan blandes. Positionelle skal stå først (ellers kan compileren ikke afgøre parameter) Ulempe: Parameter-navne bliver del af API’et. string Title(string name, Sex s = Sex.Male, int age = 10, bool married = false) { return prefix + name + ”, age ” + age + (married ? ”, married” : ”not married”); } string a = Title(”Mox”, age: 36); string b = Title(age:36 name:”Mox”); string c = Title(”T”, Sex.Male, married:false, age:50); string c = Title(”Error”, age:30, 29); //compile-time fejl (positionel efter navngiven)

50 Diverse Namespaces Exception handling

51 Namespaces Namespace: Overordnet kategorisering af typer med relateret funktionalitet, fx. System.Math. Konvention: CompanyName.ProductName.FunctionalArea (hierakisk) Fx Microsoft.Win32.Networking Importer namespace med using (ingen *)

52 Exception handling En exception kastes (throw) når en (seriøs) fejl ikke er håndteret. try…catch…finally Catch blokke skal ordnes efter mest specifikke exception. System.Exception er mindst specifik og skal optræde sidst. C# specificerer ikke exceptions

53 Opsummering Grundlæggende elementer af C#:
Common Language Infrastructure Data typer Indbyggede typer og brugerdefinerede typer (kort) Værdi- vs. Referencetyper Metoder Kontrolstrukturer (selection statements) og operatorer


Download ppt "Objekt-Orienteret Programmering (OOP)"

Lignende præsentationer


Annoncer fra Google