Objekt-orienteret programmering: Ekstra materiale

Kurt Nørmark ©
Institut for Datalogi
Aalborg Universitet


Sammendrag

Stikord Referencer Indhold
Ekstra materiale til det tredie seminar i OOI (Ideer i Objekt-orienteret analyse, design og programmering) i forhold til kurset i objekt-orienteret programmering på det første år af datalogiuddannelsen.


INTRODUKTION TIL IDEER I OBJEKT-ORIENTERET PROGRAMMERING

OOA, OOD og OOP
Slide Note Indhold Stikord
Referencer 

  • Objekt-orienteret tankegang i

    • Analyse

    • Design

    • Programmering

De oprindelige ideer omkring 'objekt-orientering' er udviklet i tilknytning til programmering

OOP Historie
Slide Note Indhold Stikord
Referencer 
Her giver vi kort vores bud på OO programmeringssproglige milepæle, samt omtrentlige årstal.

  • Udvalgte milepæle i udviklingen af Objekt-orienterede programmeringssprog:

    • Simula-67 i Norge (Nygaard)

    • Smalltalk-80 i Californien (Kay)

    • C++ i 1983 hos AT&T (Stoustrup)

    • Java i 1995 hos Sun (Gosling)

Litteratur i denne kursusdel
Slide Note Indhold Stikord
Referencer 
Vi giver her en kort oversigt over litteratur og materiale til 'Ideer i OOP' som hold på grundlagssemestret, åben uddannelse i datalogi

  • Primær litteratur

    • Gosling and Mcgilton: The Java Language Environment - A White Paper

    • Oscar Nierstrasz: A survey of object-oriented concepts

  • Supplerende litteratur

    • The Java Tutorial

    • The Java Language - An overview (kort 'white paper')

  • Forelæsningsnoter i Objekt-orienteret Programmering

    • Dette materiale, som diskuteres i uddrag ved dette seminar

  • Anbefalet bog

    • Bertrand Meyer: Object-oriented Software Construction , Prentice Hall (Eiffel baseret)

Henvisninger

OOP Fjernundervisning
Slide Note Indhold Stikord
Referencer 

  • CHAT Mandag 13. November 20.00 - 22.00

  • IDAFUS aktiviteter i OOP i ugerne 45 - 48

    • Kursusforummet til offentlig diskussion

    • Opgaveaktiviteter med løsninger

      • Kør diskussioner i kursusforummet

  • CD'en med mange opgaver og løsninger


OBJEKT-ORIENTERET PROGRAMMERING I JAVA

Synopsis
Slide Note Indhold Stikord
Referencer 
Et sammendrag af de væsentligste ideer i objekt-orienteret programmering

Ideen om dataabstraktion var en afgørende inspiration

Indkapsling og synlighedskontrol udgør fundamentet i OOP

En klasse beskriver fælles egenskaber for en mængde af objekter - klassens instanser

Et objekt repræsenterer indkapslet data på 'run time'

Et objekt kan kun påvirkes udefra gennem dets offentlige grænseflade

Objekter interagerer via beskeder

 

Synopsis
Slide Note Indhold Stikord
Referencer 
En synopsis om Java

Java er et rent objekt-orienteret sprog

Java minder syntaktisk om C++, men Java er mindre kompleks end C++

Initialisering af nyskabte objekter bestyres af konstruktorer

Objekter fjernes af garbage collectoren når de ikke længere kan tilgås fra faste holdepunkter

Java har fire kategorier af synlighed

Statiske egenskaber i Java er klassetilknyttede - Øvrige egenskaber er objekt-tilknyttede

 

Synopsis
Slide Note Indhold Stikord
Referencer 
Et sammendrag af de vigtigste observationer om nedarvning

Vi skelner mellem specialisering og udvidelse

Nedarvning benyttes ofte til både at opnå specialisering og udvidelse

Java understøtter enkelt nedarvning mellem klasser

Interfaces er ekstremt abstrakte klasser

En klasse kan arve fra en klasse og implementere multiple interfaces

Interfaces giver betydelig fleksibilitet i typesystemet

 

Synopsis
Slide Note Indhold Stikord
Referencer 
Et sammendrag af de vigtigste forhold omkring polymorfi og dynamisk binding

Polymorfi medfører at variable kan referere objekter af mange typer

Polymorfireglerne er designet med henblik på bevarelse af statisk typesikkerhed

Java's konsekvente brug af dynamisk binding betyder at alle operationer er virtuelle

Polymorfi reglerne siger, som bekendt, at en instans af en specialiseret type T kan assignes til en variabel af en mere generel type S. (T er altså en subtype/subklasse af S). Dette er typesikkert idet et T objekt har alle S's egenskaber, og måske flere

 


TEMA 1: BASAL OBJEKT-ORIENTERET PROGRAMMERING


TEMA 2: OBJEKT-ORIENTERET PROGRAMMERING I JAVA


TEMA 3: SPECIALISERING, UDVIDELSE OG NEDARVNING


TEMA 4: POLYMORFI OG DYNAMISK BINDING

Nedlæggelse af objekter i Java
Slide Note Indhold Stikord
Referencer 
Man skulle måske tro, at objektnedlæggelse er af mindre betydning end objektoprettelse. Men dette er ikke tilfældet. Det er ofte meget vigtigt at skaffe sig af med unyttige objekter, idet vi ellers på et eller andet tidspunkt løber tør for lager (uanset hvor mange Mbyte vi end har). Det er endvidere helt afgørende for et program, at objekter ikke nedlægges for tidligt.

Et objekt kan nedlægges på to forskellige måder:
    Eksplicit ved en programmeret sletning Implicit, når objektet ikke længere kan påvirke resten af programudførelsen

  • Eksplicit nedlæggelse: Programmet udfører en kommando, som sletter objektet

    • Man risikerer let at slette et objekt som bruges fra et andet sted

    • Hvis man forsømmer at slette ubenyttede objekter kan man helt unødigt løbe tør for lager

  • Implicit nedlæggelse: Objektet slettes automatisk af en garbage collector, når det kan bevises, at det ikke længere kan påvirke den fremtidige programudførelse

    • I praksis slettes objektet når det ikke længere kan nås fra en mængde af objekt-udgangspunkter

I forbindelse med eksplicit sletning af et objekt er faren, at vi sletter objektet 'for tidligt'. Hvis vi efter sletningen forsøger at tilgå objektet via en reference til det, opstår der en 'grim' fejl (køretidsfejl)

Implicit og automatisk sletning af objekter kaldes ofte for garbage collection. Når et programmeringssprog understøtter garbage collection fritages programmøren for en væsentlig byrde, idet han eller hun ikke skal bekymre sig om, hvornår 'der skal siges farvel' til objekterne

Java anvender implicit objekt nedlæggelse via garbage collection

Objekter og referencer
Slide Note Indhold Stikord
Referencer 
Ethvert objekt i Java tilgås via en reference. Vi vil her se nærmere på objekter i forhold til referencer, og vi vil også diskutere 'objekt navne' og 'objekt variable'

  • Objekter har ikke navne, men identitet

  • Objekter i Java tilgås altid via en reference

    • En reference svarer til en restringeret pointer

  • Man kan ikke identificere et objekt med den (navngivne) variabel, som refererer objektet

    • Et objekt kan refereres fra mange variable: aliasing

  • Variable af klassetyper, som endnu ikke er initialiseret, har værdien null

Figur. To objekter: en bankkonto og en streng. Bankkontoen refereres af to forskellige variable. Streng objektet refereres ikke fra en variabel, men fra bankkontoen

Konstruktorer i Java
Slide Note Indhold Stikord
Referencer 
Initialisering af et nyskabt Java objekt sker gennem en såkaldt konstruktor

Begrebet konstruktor: En konstruktor er en procedure som har til opgave at initialisere instansvariablene af et nyskabt objekt

  • Karakteristik af konstruktorer i Java:

    • En konstruktor skal have samme navn som klassen

    • En konstruktor angives uden returtype

      • Dette er den eneste syntaktiske forskel mellem en metode og en konstruktor

    • Konstruktorer kan overloades

      • Overloadede konstruktorer tillader os parametermæssigt at variere initialiseringen af et nyskabt objekt

Enhver klasse bør mindst have én konstruktor, som garanterer en eksplicit programmeret initialisering af nyskabte objekter

Henvisninger

Organisering af klasser i pakker i Java
Slide Note Indhold Stikord
Referencer 
Hvis man har mange klasser er det en praktisk nødvendighed at kunne gruppere disse på en hierarkisk måde. Det er netop det man kan med Java's pakkebegreb.

Begrebet pakke: En pakke i Java er en mængde af logisk sammenhørende klasserPakkebegrebet tillader os at gruppere klasserne i logisk sammenhørende delmængder

  • Karakteristika ved pakkebegrebet i Java

    • Pakker er organiseret hierarkisk i operativsystemets kataloger og filer

    • Hver pakke udgør et navnerum således at to klasser af samme navn - i hver sin pakke - ikke konflikter

    • 'Information hiding' i Java afhænger af pakkebegrebet

    • Navnet på en java fil skal svare til den offenlige klasse i filen

    • Ved brug af en import clause kan man referere til klasser i en pakke med navns nævnelse

Henvisning

En pakke i Java svarer til en klynge i OOA&D

Problemstillinger
Slide Note Indhold Stikord
Referencer 
Vi starter med at se på de overordnede problemstillinger omkring polymorfi og dynamisk binding

Kan variable og parametre referere til objekter af forskellige typer?

Hvad sker der, hvis man i flæng sender beskeder til objekter af forskellige typer?

Ønsker vi at gå på kompromis med at alle typefejl fanges inden programudførelsen?

Polymorfi, dynamisk binding og interfaces
Slide Note Indhold Stikord
Referencer 
Vi vil her studere vekselvirkningen mellem polymorfi, dynamisk binding og anvendelsen af interfaces

Objekter af forskellige klasser, der implementerer det samme interface, kan anvendes i flæng

Program: Klassen Bygning.
class Bygning {

  public double areal(){
    return 50.0;
  }

  public int ibrugTagningsAar(){
    return 2000;
 }

  public double vurderingsSum (){
    return 200000.0;
  }
} // end Bygning

Program: Klassen Køretøj.
class Køretøj {

  public int købsÅr(){
    return 1997;
  }

  public int maxHastighed(){
    return 190;
  }
 
  public int nyPris() {
    return 800000;
  }
} // end Køretøj

Program: Interfacet SkatteMål.
interface SkatteMål {
  double skatteVærdi ();
} // end SkatteMål

Program: Klassen SkatteBygning.
class SkatteBygning extends Bygning implements SkatteMål {

  public double skatteVærdi() {
    return vurderingsSum() * 0.95;
  }
}  // end SkatteBygning

Program: Klassen SkatteKøretøj.
class SkatteKøretøj extends Køretøj implements SkatteMål{

  private static final int IÅR = 2000;

  public double skatteVærdi() {
    return nyPris() / (IÅR - købsÅr() + 1);
  }
} // end SkatteKøretøj

Program: En flexibel applikation.
class Flex {
  static Bygning b = new SkatteBygning();
  static Køretøj k = new SkatteKøretøj();
  static SkatteMål s;

  public static void main (String[] args){

    System.out.println(((SkatteMål)b).skatteVærdi());
    System.out.println(((SkatteMål)k).skatteVærdi());

    boolean cond = true;

    s = cond ? (SkatteMål)b : (SkatteMål)k;
    System.out.println(s.skatteVærdi());
  }
}  // end Flex

Program: Alt i ét.
class Bygning {

  public double areal(){
    return 50.0;
  }

  public int ibrugTagningsAar(){
    return 2000;
 }

  public double vurderingsSum (){
    return 200000.0;
  }
} // end Bygning


class Køretøj {

  public int købsÅr(){
    return 1997;
  }

  public int maxHastighed(){
    return 190;
  }
 
  public int nyPris() {
    return 800000;
  }
} // end Køretøj


interface SkatteMål {
  double skatteVærdi ();
} // end SkatteMål


class SkatteBygning extends Bygning implements SkatteMål {

  public double skatteVærdi() {
    return vurderingsSum() * 0.95;
  }
}  // end SkatteBygning

  
class SkatteKøretøj extends Køretøj implements SkatteMål{

  private static final int IÅR = 2000;

  public double skatteVærdi() {
    return nyPris() / (IÅR - købsÅr() + 1);
  }
} // end SkatteKøretøj


class Flex {
  static Bygning b = new SkatteBygning();
  static Køretøj k = new SkatteKøretøj();
  static SkatteMål s;

  public static void main (String[] args){

    System.out.println(((SkatteMål)b).skatteVærdi());
    System.out.println(((SkatteMål)k).skatteVærdi());

    boolean cond = true;

    s = cond ? (SkatteMål)b : (SkatteMål)k;
    System.out.println(s.skatteVærdi());
  }
}  // end Flex
  

Specialisering
Slide Note Indhold Stikord
Referencer 
Specialisering er en form for abstraktion hvormed vi danner et nyt begreb fra et eksisterende begreb. Vi vil nu gå over til også at tale om specialisering af klasser. Specialisering benyttes i en objekt-orienteret modelleringsproces

Specialisering tager udgangspunkt i en klasse opfattet som et begreb

Specialisering er derfor nyttig i forbindelse med modellering af programbegreber i en designprocess

Begrebet specialisering: En specialisering af en klasse A betegner en ny klasse B hvor
    Instanserne af B er en delmængde af instanserne af A Operationerne fra klassen A er også anvendelige på instanser af klassen B Nogle af A operationerne er tilpassset de særlige egenskaber, som karakteriser klassen B
Når vi specialiserer en klasse A danner vi en ny klasse som vi her vil kalde B. Mængden af B-objekter er en delmængde af A-objekterne. Ligeledes gælder at de operationer, som virker på objekter af typen A, også virker på objekter af typen B. Klassen B kan indeholde nye redefinerede operationer af A operationerne. Endvidere er det muligt og typisk, at klassen B definerer helt nye operationer i forhold til klassen A. De nye operationer i B relaterer sig til de specielle egenskaber, som B delmængden af A besidder.

Henvisninger

Udvidelse
Slide Note Indhold Stikord
Referencer 
Udvidelse af en klasse A med nye egenskaber er centralt fra et genbrugsperspektiv. Vi ønsker at holde klassen A intakt. I en ny klasse B ønsker vi at have alle egenskaber i A plus et antal nye egenskaber, som kun eksisterer i B.

Udvidelse tager udgangspunkt i en klasse opfattet som et modul

Udvidelse er en nyttig genbrugsmekanisme som gør det muligt at undgå håndtering og vedligeholdelse af flere kopier af det samme stykke program

Begrebet udvidelse: En udvidelse af en klasse A betegner en ny klasse B som
    Tilføjer nye egenskaber (variable og metoder) i forhold til A. Egenskaberne af A kan også betragtes som egenskaber i klassen B.
Når vi udvider en klasse A tilføjer vi nye instansvariable og metoder. Lad os kalde den nye udvidede klasse B. B har således alle A's egenskaber plus de nye 'udvidede egenskaber'.


Samlede referencer
Indhold Stikord
The Java Tutorial
Referencen ovenfor går til en Java Tutorial sideReferencen ovenfor går til materiale på Internettet
Lærebog på Dat1 OOP kursus: Lewis and Loftus, JAVA Software Solutions - Foundation of Program Design
Referencen ovenfor går til papirmateriale
The Java Language Environment - A White Paper (lokal pdf version)
Referencen ovenfor går til materiale på Internettet
The Java Language Environment - A White Paper
Referencen ovenfor går til materiale på Internettet
Providing constructors for your classes
Referencen ovenfor går til en Java Tutorial sideReferencen ovenfor går til materiale på Internettet
Creating objects
Referencen ovenfor går til en Java Tutorial sideReferencen ovenfor går til materiale på Internettet
Creating and using packages
Referencen ovenfor går til en Java Tutorial sideReferencen ovenfor går til materiale på Internettet
Specialisering af begreber fra introduktions lektionen
Referencen ovenfor går til materiale i disser noterReferencen ovenfor peger tilbage i noterne
Abstrakte datatyper fra introduktions lektionen
Referencen ovenfor går til materiale i disser noterReferencen ovenfor peger tilbage i noterne


Kildefiler i denne lektion
Indhold Stikord Referencer
/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/nedarvning/Flex.java

 

Objekt-orienteret programmering: Ekstra materiale
Kurset's hjemmeside     Forfatteren's hjemmeside     Om frembringelsen af disse sider     Forrige lektion (top)     Næste lektion (top)     Forrige lektion (bund)     Næste lektion (bund)     
Genereret: 7. Oktober 2002, 10:32:15