530 likes | 747 Views
Objekt-Orienteret Programmering (OOP). Oversigt. Introduktion til kurset Introduktion til C# Common Language Infrastructure Data typer Indbyggede vs. Brugerdefinerede typer Værdi- vs. Referencetyper Metoder og parametermekanismer. OOP Kurset. Projektenhedkursus for Dat1 og SW3
E N D
Oversigt • Introduktion til kurset • Introduktion til C# • CommonLanguageInfrastructure • Data typer • Indbyggede vs. Brugerdefinerede typer • Værdi- vs. Referencetyper • Metoder og parametermekanismer
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
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 mundtligprøve. • Bedømmelse: Individuelbedømmelsebestået/ikkebestået.
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 somerforståeligt/læsbartafandreprogrammører • benyttekorrektfagterminologi
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 • Design Patterns • TBA • TBA
Litteratur • Primært: ”Essential C# 4.0” af Mark Michaelis • Derudover • ”C# 4.0 In a Nutshell” af Joseph & Ben Albahari • MSDN Library (http://msdn.microsoft.com/en-us/library/kx37x362.aspx) • Fri-tekst søgning, fx ”int”, ”string”, … • IDE • Programming Guide • Reference, inkl. LanguageSpecification • Diverse online materiale
Installation af C# • Windows: • .NET Framework og command-line: • http://msdn.microsoft.com/en-us/netframework/default.aspx • Visual C# 2010 Express (gratis, kræver registrering) • http://www.microsoft.com/express/downloads/ • Visual Studio 2010 Professional, Premium eller Ultimate (gratis via MSDNAA) • http://msdn60.e-academy.com/elms/Storefront/Home.aspx?campus=msdnaa_DK9220 • Linux/Windows/Mac OS X: • Mono (cross-platform, open source implementation af .NET Framework) • MonoDevelop • http://www.mono-project.com/Main_Page
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 CommonLanguageInfrastructure (CLI)
CommonLanguageInfrastructure (CLI) • Åben specifikation (ECMA-335) der specificerer følgende (MS: .NET Framework): • Common Type System (CTS) • CommonLanguageSpecification (CLS) • [assembly: CLSCompliant(true) ] • CommonIntermediateLanguage (CIL) • Virtual Execution System (VES) (MS: CLR) • Base ClassLibrary (BCL) (MS: FCL) • Sprog-interoperabilitet, platforms portabilitet, managedexecution *http://www.ecma-international.org/publications/standards/Ecma-335.htm
Kompilering til CIL *.dll eller *.exe <- VES http://en.wikipedia.org/wiki/Common_Language_Infrastructure
Typer • Indbyggede typer: Direkte understøttet af CTS • Brugerdefinerede typer: komplekse typer sammensat af andre typer. • Værdityper vs. referencetyper
Indbyggede typer • Værdityper (primitive typer): • 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
Indbyggedeheltals-typer Decimal notation: int x1 = 127; Hexadecimal notation (0x præfix, 0-9, A-F): int x2 = 0x7F
Indbyggedekomma-talstyper • Større tal, mindre præcision (afrundings-fejl) – videnskabelig beregninger • Mindre tal, større præcision (ingen afrundings-fejl) – finansielle beregninger Decimal notation: double billion1 = 1000000000 Exponential notation (E): double billion2 = 1E9
NumeriskSuffiks • Type-inferens: Hardcodedeværdier (litteraler) fortolkessomint (derefteruint, long, ulong) ellerdouble (afhængigaf. ) • Suffikskantilføjes for at tvingelitteraltil en bestemt data type: float f = 6.5; Decimal d = 6.5; Kan ikke kompilere – brug hhv. f og d
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
Eksplicit konvertering • Kan resulterei tab afpræcisionellerOverflowException. • decimal -> helttal: Værdiafrundes • Værdiuden for range : OverflowException • double/float -> heltal: Værdikappesafefterkomma. • Værdiuden for range: • Checked: OverflowException • Unchecked: Uspecificeret • Double -> float: Afrunding • Værdiuden for range: 0 eller infinity. • float/double -> decimal: Konverteringtil decimal repræsentation • Værdi for lille: 0. • VærdierNaN (not a number), infinity, eller for stort: OverflowException • Decimal -> float/double: Afrundingtilnærmesteværdi double d = double.MaxValue; int x = checked ( (int) d );
bool og char • bool: true eller false. • Ingen konvertering til/fra andre typer • char • Unicode tegn (karakter) • Konverteres til ushort (og derfra videre) • http://www.unicode.org/charts/ • char x1 = 'X'; // Character literal • char x2 = '\x0058'; // Hexadecimal • char x3 = (char)88; // Cast from integral type • char x4 = '\u0058'; // Unicode
String • stringklassenrepræsenterer et array af char. • String klassenhar et rigt API beståendeafstatiskemetoder (kaldes via klassenavn) oginstans-metoder(kaldes via variabel-navn). static Main { string s1 = newstring(new char[] {’H’, ’e’, ’l’, ’l’, ’o’}); string s2 = ”helloworld”; stringstutter = string.Concat(s1, s2); intisSame = string.Compare(s1.ToLower(), s2.ToLower()); //og mange flere… } Statisk metode Instans-metode
Opbygningaftekst • Strings erimmutable (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 nytstring objekt. • System.Text.StringBuildermodificerertekstuden at lave en ny kopi for hvermodifikation • StringBuilder: Append(), Insert(), Remove(), Replace().
Konsol I/O • Input: • Console.Read() • Console.ReadKey() • Console.Readline() • Output • Consoler.Write(…) • Console.WriteLine(…) Main() { Console.WriteLine(”Entername”); stringname = Console.ReadLine(); Console.WriteLine(”Hi ” + name); }
Konverteringmellem string ognumerisketyper • Konverteringfra en string type til en numerisk type: Parse() • Parse() erdefineret for allenumeriske data typer. • TryParse() håndtererkonverteringsfejlved at returnerefalseistedet for at kaste en exception: string emergencyText = “911”; intemergencyNum = int.Parse(emergencyText); if (int.TryParse(emergencyText, outemergencyNumber)) { // Converted correctly, now use number }
System.Object • Rodeni type hierakiet • Equals(Object) • Object.Equals(Object a, Object b) • Object.ReferenceEquals(Object a, Object b) • GetHashCode • ToString • GetType • Finalize • MemberwiseClone
Data strukturer i BCL • Arrays (fixed størrelse collection) • List (variabel størrelse collection) • System.Collections.Genericnamespace indeholder desuden Dictionary, LinkedList, Stack, Queue, …
Array erklæringoginitialisering //1. Erklæringefterfultafinitialisering string[] languages; languages = newstring[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 = (newstring[(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
Multi-dimensionelle arrays Rektangulære arrays (dimensioner af samme længde) int[,] tal= int[3,3]; intnum = 1; for (int i = 0; i < tal.GetLength(0); i++) for (int j = 0; j < tal.GetLength(1); j++) tal[i, j] = num++; //Initialiseringaf 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
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
API – Tilføje og fjerne elementer • public List <T> • { • public List(); • public List(IEnumerable<T> collection); • public List(intcapacity); • //tilføj og indsæt elementer • public voidAdd( T item); • public voidAddRange( IEnumerable<T> collection); • public voidInsert( intindex, T item); • public voidInsertRange( intindex, IEnumerable<T> collection ); • //fjern elementer • public boolRemove(T item); • public voidRemoveAt(intindex); • public voidRemoveRange(intindex, intcount); • public voidRemoveAll( Predicate<T> match); • }
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] = ”IronPython” // { C#, IronPython } Console.WriteLine(languages.Count()); // 2 Console.WriteLine(languages[5]); //IndexOutOfRangeException
Brugerdefinerede typer • Enums • Structs • Klasser • Interfaces og delegates senere..
Enum • Gruppe af heltalsværdier Type-definition: public enumWeekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; public enumStatusCode : ushort { OK = 200, Created, Accepted, NotFound = 404 }; Brug: Weekdayday = Weekday.Sat; //5, da 0 indexeret bool weekend = (day == Weekday.Sat || day == Weekday.Sun);
Klasse vs. struct Point p = new Point(2, 4); p.MovePoint(3, 3) //p.x= 5, y = 7
Klasse vs. struct • Ens, bortset fra: • 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)
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.
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; } 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)
Stak Heap 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”); } **Snyder med string-ref pga. plads-mangel
Metoder Erklæring Parametermekanismer Overloads (operationel polymorfisme)
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-typemetode-navn ([parametre])
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); //p.Navn = ”Kong Ib”; } staticvoidMethodA(int a) { a += 10; } 5 (int a = x) staticvoidMethodB(Person b) { b.Navn += ”Kong ” + b.Navn; } hex1 (Person b = p) hex1 staticvoidMethodC(Person c) { c = null; } (Person c = p)
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 } staticvoidMethodA(refint a) { a += 10; } a alias for x b alias for p staticvoidMethodB(ref Person b) { b.Navn += ”Kong ” + b.Navn; } c alias for p staticvoidMethodC(ref Person c) { c = null; }
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” MethodB(out p); //p refererer til nyt objekt } staticvoidMethodA(outint a) { a = 10; } staticvoidMethodB(out Person b) { b = new Person(); b.Navn += ”Ib”; }
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
Parameter arrays • paramsmodifer 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 staticint Sum(paramsint[] 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 }); }
Metode Overloading • Multiple metoder med sammenavn, men forskelligsignatur (antalog/eller type afparametre). • Forskelligemåder at kalde en metode • Implementér logik i én metode som de andre overloadede metoder kalder (maintainability). Title(stringname) { returnTitle(name, Sex.Male, 10, false) } Title(stringname, Sex s) { returnTitle(name, s, 10, false); } Title(stringname, Sex s, int age) { returnTitle(name, s, age, false); } Title(stringname, Sex s, int age, boolmarried) { /* implementation */ }
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]
Original metode overload: Title(stringname) { returnTitle(name, Sex.Male, 10, false) } Title(stringname, Sex s) { returnTitle(name, s, 10, false); } Title(stringname, Sex s, int age) { returnTitle(name, s, age, false); } Title(stringname, Sex s, int age, boolmarried) { /* implementation som nedenunder */ } Med frivillige parametre: stringTitle(stringname, Sex s = Sex.Male, int age = 10, boolmarried = false) { stringprefix; if (s == Sex.Male) prefix = ”Mr. ”; elseif (married) prefix = ”Mrs. ”; elseprefix = ”Ms. ”; returnprefix + 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”
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. stringTitle(stringname, Sex s = Sex.Male, int age = 10, boolmarried = false) { … returnprefix + 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)
Diverse • Namespaces • Exception handling