TDA550 Objektorienterad programmering, fortsättningskurs. Föreläsning 1. Introduktion Variabler och typer

Relevanta dokument
Föreläsning 3 Arvsmekanismen Variabler och typer Typer och subtyper

Classes och Interfaces, Objects och References, Initialization

Föreläsning 3. UML Arvsmekanismen Variabler och typer Typer och subtyper. Vad är UML?

Föreläsning 3. UML Arvsmekanismen Variabler och typer Typer och subtyper. Vad är UML?

Introduktion. Grundkursen

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad programmering, allmänt

Viktiga egenskaper hos ett program (Meyer): Objektorienterad programmering, allmänt. Vilka egenskaper vill vi att våra program ska ha?

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsning 1. Introduktion Utveckla för förändring

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Objektorienterad programmering

Föreläsning 3. Arvsmekanismen. Typer och subtyper. Abstraction & Information Hiding. Nested Objects. Separation of concerns. Delegating responsibility

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Föreläsning 1 Introduktion Utveckla för förändring

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Objektorienterad programmering. Grundläggande begrepp

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Imperativ programmering. Föreläsning 4

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Encapsulation. Composition. Distribution of Responsibility. Message Passing. Inheritance. Föreläsning 3

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

DAT043 - Föreläsning 7

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TDA550 - Objektorienterad programvaruutveckling, fk

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

Kopiering av objekt i Java

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Historik: OOP. Objektorientering. Historik: OOP (forts) En Dum Fråga

Föreläsning 1. Introduktion Utveckla för förändring. Grundkursen. Programming in the small. Koncept som är kända från grundkursen (?

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

OOP F1:1. Föreläsning 1. Introduktion till kursen OOP Vad är Java? Ett första Java-program Variabler Tilldelning. Marie Olsson

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

OOP Objekt-orienterad programmering

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Arv. Objektorienterad och komponentbaserad programmering

OOP Objekt-orienterad programmering

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Programmering A. Johan Eliasson

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Repetition av OOP- och Javabegrepp

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Föreläsning 2. Polyfmorfism Dynamisk bindning Interface och abstrakta klasser Överlagring Överskuggning Accessorer och mutatorer

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Föreläsning 4. Polymorfism. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Kursplanering Objektorienterad programmering

Programmering för språkteknologer II, HT2014. Rum

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Objektorienterad Programmering (TDDC77)

Repetition av OOP- och Javabegrepp

Föreläsning 13 Innehåll

F4. programmeringsteknik och Matlab

Parameteröverföring. Exempel. Exempel. Metodkropp

Klassdeklaration. Metoddeklaration. Parameteröverföring

Objektorienterad programmering

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Programmering = modellering

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Objektorienterad programmering Föreläsning 4

Programmering för språkteknologer II, HT2011. Rum

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Laboration 1: Figurer i hierarki

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

DAT043 - föreläsning 8

1 Klasser och objektorientering Vad är objektorientering?

Föreläsning 15: Repetition DVGA02

Introduktion och OO. Objekt-orienterad Programmering och Design (TDA552) Alex Gerdes, HT-2018

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Generisk klass med typparameter Inre klass - ListIterator

Tentamen Programmering fortsättningskurs DIT950

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Klasshierarkier - repetition

Personal Objektorienterad programmeringsmetodik 5DV081 5DV109

SMD 134 Objektorienterad programmering

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Introduktion till Java

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Transkript:

TDA550 Objektorienterad programmering, fortsättningskurs Föreläsning 1 Introduktion Variabler och typer Objektorienterad programmering fk 1 Föreläsning 1

Olika nivåer av programdesign Det är användbart att särskilja mellan olika perspektiv eller nivåer av mjukvarudesign: konceptuell specifikation implementation Under grundkursen låg fokus på implementationsnivån. Skall i denna kurs även beakta specifikationsnivån. Objektorienterad programmering fk 2 Föreläsning 1

Utmaningen med utveckling av mjukvarusystem När man utvecklar ett mjukvarusystem finns en rad krav och önskemål som skall uppfyllas. Vi vill åstadkomma ett system som: är färdigutvecklat på utsatt tid och inom givna budgetramar uppfyller sin uppgift så bra som möjligt är så enkelt att använda som möjligt har tillräckligt höga prestanda är felfritt är robust är så enkelt att underhålla som möjligt är så enkelt att modifiera som möjligt är så enkelt att bygga ut som möjligt är så enkelt att implementera som möjligt är så återanvändbart som möjligt... Objektorienterad programmering fk 3 Föreläsning 1

Utveckling av mjukvarusystem Det är inte ovanligt att ett programsystem består av miljontals rader kod och att 100-tals programmerare varit delaktiga i att skriva koden. Ingen enskild person kan vara insatt i och förstå alla enskilda delar i så stora system. Att ett programsystem skall vara lätt att underhålla är en mycket viktig egenskap! fel i den ursprungliga mjukvaran måste fixas mjukvaran måste anpassas till nya användarkrav den som ändrar i koden är är sällan eller aldrig den som ursprugligen skrivit koden största delen av pengarna och tiden under ett systems livstid åtgår till detta (ca 80%). Utveckla för förändring! Detta kommer att vara en ledstjärna under kursen. Objektorienterad programmering fk 4 Föreläsning 1

Utveckla för förändring Det finns många faktorer som som bidrar till hur lätt eller svårt ett system är att underhålla. Några viktiga aspekter att beakta är: Läsbarhet. En förutsättning för underhåll är att koden kan läsas och förstås. Enkelhet. Ett enkelt system är lättare att implementera och få felfritt. Flexibilitet. Innebär att ett system är lätt att ändra i. Objektorienterad programmering fk 5 Föreläsning 1

Grundläggande designprinciper Nedan ges en lista på saker som är viktiga för att åstadkomma programsystem som är lätta att underhålla: Enhetlig kodstil. Minskar risken för fel och underlättar förståelsen av koden. Genomtänkt namngivning. Ett namn skall avspegla vilken roll en entitet har. Dokumentation. Oavsett hur bra design en mjukvara har är den värdelös utan dokumentation. Modularitet. Ett system skall brytas ned till en samling sammanhängande men löst kopplade moduler. Abstraktion. Inkapsling. Abstrahera bort implementationsdetaljer Decoupling. Minimera beroenden mellan klasser, minimera beroenden av specifika typer. Delegering.Skicka vidare uppgifter till de klasser som är bäst lämpade att göra arbetet. Designmönster. Best practices. Återanvändning av kod. Objektorienterad programmering fk 6 Föreläsning 1

Complexity is your enemy Mycket i programmering handlar om att reducera komplexiteten hos den mjukvara som utvecklas. Objektorientering är en metodik som utvecklats specifikt för att reducera komplexiteten i mjukvarusystem. Komplexitet i ett program handlar inte om hur bra ett program går att köra på datorn, utan helt och hållet om hur lätt det är att läsa och förstås av människor. Miller's Law: A person can only keep 7 plus or minus 2 items in mind at one time. Man måste försöka reducera komplexiten på alla nivåer i utvecklingsarbetet, allt ifrån när man designar den övergripande systemarkitekturen till när man väljer ett variabelnamn. Man måste hela tiden vara medveten om problemet med komplexitet och lära sig best practices för hur komplexitet skall hanteras. Objektorienterad programmering fk 7 Föreläsning 1

Kodstil och namngivning För att underlätta för andra att läsa den kod du utvecklar skall du använda en kodkonvention. Lämpligen http://java.sun.com/docs/codeconv En av de viktigaste aspekterna på kodkonvention berör namngivning. Identifierarnamnen måste väljas mycket omsorgsfullt. Namnet är det första läsaren ser och skall vara en ledtråd för att förstå vad identifieraren representerar och vilken uppgift den har. Klasser: Namnen är oftast substantiv, t.ex Date, BankAccount och Car. Interface: Namnen slutar ofta på able, t.ex Cloneable och Comparable. Metoder: Namnen skall vara ett verb eller innehålla ett verb, t.ex. print, setsize, isvisible och getsize. Variabler: numberofmembers och loadingdone är bra namn. thenumberofthreadsintheapplicationrunningrightnow, nt, notyetdone och done är dåliga namn. Använd engelsk namngivning. Objektorienterad programmering fk 8 Föreläsning 1

Principer för OOP (Alan Kay) Allt är ett objekt (dvs alla datastrukturer representeras som objekt). Ett program är en samling objekt. Objekten kommunicerar genom att skicka meddelanden till varandra. Varje meddelande är en begäran om en handling (aktion) som ska utföras. Varje objekt har sitt eget minne. Ett objekt kan bestå av andra objekt. Varje objekt tillhör en klass. En klass representerar ett visst beteende alla objekt som är instanser av samma klass kan utföra samma aktioner. Klasser organiseras i en trädliknande arvshierarki. En klass ärver beteende och datastrukturer från tidigare klasser. Objektorienterad programmering fk 9 Föreläsning 1

Objekt i Java Java är ett objektorienterat språk: program skapar objekt o = new SomeClass(); program anropar metoder i objekt o.somemethod(); program hämtar värden i objekt-variabler x = o.somefield; program lägger nya värden i objekt-variabler o.samefield = 5; Om nu Java är objektorienterat, var har vi objekten i programmet? Objektorienterad programmering fk 10 Föreläsning 1

Exempel Vilka uttryck i detta program beräknas till objekt? //-- Bad code, only used for illustration --// public class NumberList { int num; NumberList next; public NumberList(int i, NumberList nl) { num = i; next = nl; } } public class TestNumList {... public void somemethod() {... NumberList nl_1 = new NumberList(52, null); NumberList nl_2 = new NumberList(71, nl_1); NumberList nl_3 = nl_2.next; nl_2.next.num = 22; int x = nl_3.num; } } Objektorienterad programmering fk 11 Föreläsning 1

Referensvariabler Det finns inga Java-uttryck som är objekt. Istället hanterar Java-program referenser till objekt. referensvariabel objekt-referens objekt variabel1 värde variabel2 värde Objektorienterad programmering fk 12 Föreläsning 1

Åter till exemplet NumberList nl_1 = new NumberList(52, null); NumberList nl_2 = new NumberList(71, nl_1); NumberList nl_3 = nl_2.next; nl_2.next.num = 22; x = nl_3.num; Uttryck som beräknas till primitiva värden: 52 71 22 nl_3.num Uttryck som beräknas till objekt-referenser: null new NumberList(52, null) nl_1 new NumberList(71, nl_1) nl_2 nl_2.next nl_3 Värden av uttryck: primitiva värden eller objektreferenser, aldrig objekt. Objektorienterad programmering fk 13 Föreläsning 1

Vad spelar det för roll Skillnaden mellan ett objekt och dess referens är mycket viktig, då det gäller: exekvering typer frågan om olika alias frågan om dynamisk bindning frågan om olika typer för objekt och deras referenser Objektorienterad programmering fk 14 Föreläsning 1

Beräkningarna i vårt exempel NumberList nl_1 = new NumberList(52, null); nl_1 num: 52 next: null NumberList nl_2 = new NumberList(71, nl_1); nl_1 nl_2 num: 71 next: num: 52 next: null NumberList nl_3 = nl_2.next; nl_1 nl_3 nl_2 num: 71 next: num: 52 next: null nl_2.next.num = 22; nl_1 nl_3 nl_2 num: 71 next: num: 22 next: null Objektorienterad programmering fk 15 Föreläsning 1

Alias Två eller flera referenser till samma objekt kallas alias. nl_1 nl_3 nl_2 num: 71 next: num: 22 next: null Allt som görs via en referens påverkar alla alias till denna referens. Risken att göra fel är stor. Man måste därför vara mycket noggrann när man använder alias. Objektorienterad programmering fk 16 Föreläsning 1

Objekt kontra referenstyper Java skiljer mellan typen av en objektreferens och typen av (det refererade) objektet. Exempel: public class SomeClass implements someinterface{... } Betrakta nu: SomeInterface si = new SomeClass(); typ: SomeInterface typ: SomeClass Variabeln si och objektet si refererar till har olika typer! Både typen av objektet och typen av dess referens är signifikanta på olika sätt. Innebär: Viktigt att förstå typer i Java. Objektorienterad programmering fk 17 Föreläsning 1

Typer i Java Java är ett starkt typat språk. Om programmet kompilerar skall man inte under körning kunna få några fel som beror på typer. Medför att vi i stor utsträckning slipper i från problem med fel sort. Typinformationen används vid två olika tillfällen vid kompilering (compile time) och vid körning (run time). Java är utvecklat för att vara typsäkert, d.v.s. de operationer man skall kunna utföra på datat i programmet skall bara vara de som anges av typen. Den statiska typinformationen används vid själva kompileringen, efter kompileringen är den borta (det finns inga int, double, i.class-filen). Förklaringen till varför saker är som de är bottnar ofta i typsäkerheten. Objektorienterad programmering fk 18 Föreläsning 1

Typer i Java Java har två olika sorters typer: Primitiva typer, dessa är inbyggda.vi kan inte ändra eller skapa nya primitiva typer. Referenstyper, vi kan skapa nya typer. float Primitive Types Numeric Types Floating-Point Types double boolean returaddress Integral Types byte short Reference Types reference class types interface types int long char array types Objektorienterad programmering fk 19 Föreläsning 1

Värde eller referens? Att det finns två olika sorters typer får följder för betydelsen av språkliga konstruktioner. Värdesemantik (by value). Inget delat tillstånd, dvs kopior saknas. Primitiva datatyper. Referenssemantik (by referencs). Tillståndet kan vara delat (d.v.s. det kan finnas alias). Referenstyper. Återkommande frågeställning: Har vi värde- eller referenssemantik? Objektorienterad programmering fk 20 Föreläsning 1

Typomvandling (casting) Typsystemet behöver inte vara hur strikt som helst, att t.ex. använda en long istället för en int innebär aldrig någon fara. Det finns ett stort antal regler för vilka typer som får användas istället för en given typ, kallas typkompabilitet. Kompilatorn känner till dessa regler och utför vid behov implicita typomvandlingar. Exempel på godtagbara omvandlingar på primitiva typer är mindre till större (i bytes) och heltal till flyttal (kallas widening): char int float long -> int -> float -> double -> float Gör vi tvärsom riskerar vi att tappa information, kallas (narrowing): (int) double (double) long Återkommande frågeställning: Är typerna kompatibla? Går det att omvandla A till B utan att typsäkerheten bryter samman. Objektorienterad programmering fk 21 Föreläsning 1

Explicit typomvandling Vi kan säga åt kompilatorn att inte kontrollera en viss sak, t.ex. Object o =...; String s = (String) o; Vi gör en explicit typomvandling. Eftersom vi här säger att o är av typen String, så kontrollerars inte detta. Ansvaret är vårt! Förhoppningsvis stämmer det, annars exekveringsfel. Explicita typomvandlingar innebär alltid en risk! Sätter typcheckningen ur spel. Kan leda till fel vid runtime. si Undvik! För att kontrollera att tilldelning och explicit typomvandling är möjlig (dvs. bibehåller typsäkerheten) kan man använda instanceof-operatorn. Men även detta bör undvikas. Object o =...; if (o instanceof String) String s = (String) o; Typomvandlingar mellan helt oreleterade typer (inget superklass/subklass förhållande) är inte tillåtet. Objektorienterad programmering fk 22 Föreläsning 1

Definiera nya typer Det finns två standardsätt i Java att definiera nya typer: klasser interface Varje klass C introducerar en typ C. Uppsättningen publika metoder som klassen C tillhandahåller utgör mängden operationer för typen C. Alla instanser av klassen C eller av subklasser till C utgör mängden av objekt för typen C. Till exempel definierar klassen Person, nedan, en typ Person som har operationerna getname() och getbirthdate(). Person -name: String -birthdate: Date +getname(): String +getbirthdate(): Date Det andra sättet att skapa typer i Java är att använda interface. Ett interface kan ses som en namngiven mängd av operationer. Alla objekt vars klasser explecit implementerar interfacet bildar mängden av objekt för typen. Objektorienterad programmering fk 23 Föreläsning 1

Interface public interface Runnable { public void run(); } Operationerna i typen Runnable består endast av metoden run(). Mängden av objekt i typen Runnable består av alla objekt av alla klasser som implementerar Runnable. Om t.ex. klasserna SlowRunner och FastRunner implementerar Runnable tillhör objekten i typerna SlowRunner och FastRunner typen Runnable. <<interface>> Runnable run() SlowRunner run() FastRunner run() Notera alltså att ett objekt av en subklass S till klassen T tillhör både typ S och typ T. Runnable thewinner = new FastRunner(); Runnable theloser = new SlowRunner(); Objektorienterad programmering fk 24 Föreläsning 1

Klassen Object Eftersom alla klasser är subklasser till klassen Object tillhör alltså ett objekt av typerna SlowRunner och FastRunner även typerna Runnable och Object. <<interface>> Runnable Object run() SlowRunner run() FastRunner run() Det finns en speciell relation mellan typen av en subklass och typen av superklassen, eftersom subklassen till en klass definierar en subtyp till superklassens typ. Om S är en subtyp till T, så är mängden av objekt i typen S en delmängd till mängden av objekt i typen T och mängden operationer i typen T är en delmängd till mängden operationer i typen S. Dessutom måste alla operationer i typen T också finnas i typen S. Objektorienterad programmering fk 25 Föreläsning 1

Polymorfism Java tillåter att man till en variabel av typen C kan tilldela objekt som är av typ C eller är subtyper till C. Till exempel är i tilldelningssatsen Runnable r = new FastRunner(); variabeln r av typen Runnable, medan det objekt som denna variabel refererar till är av subtypen FastRunner. Egenskapen att ett objekt som är en subtyp till typen C legalt att användas varhelst ett objekt av typen C förväntas kallas polymorfism. Polymorfism är en av de viktigaste koncepten i objektorientering och den allra viktigaste orsaken till att objektorienterade programspråk är så användbara. Objektorienterad programmering fk 26 Föreläsning 1