Czym jest programowanie obiektowe?

Programowanie imperatywne, funkcyjne i obiektowe


dr inż. Aleksander Smywiński-Pohl

apohllo@o2.pl

http://apohllo.pl

Program imperatywny

instrukcje + dane = program

Asembler - język imperatywny

mov ax, 5
mov bx, 6
add ax, bc
push ax
push msg
call _printf

Języki imperatywne

  • Asembler
  • FORTRAN
  • ALGOL
  • COBOL
  • BASIC
  • Pascal
  • C
  • ...

Program funkcyjny

Ewaluacja funkcji + dane = program

Haskell - język funkcyjny

silnia :: Int -> Int
silnia 0 = 1
silnia x = x * silnia(x-1)

silnia 5 --> 120

znak :: Int -> Int
znak x 
  | x == 0 = 0
  | x < 0 = -1
  | otherwise = 1

znak 10 --> 1
znak (-10) --> -1
pierwiastki :: Double -> Double -> Double -> [Double]
pierwiastki a b c
  | delta < 0 = []
  | delta == 0 = [- b / (2 * a)]
  | delta > 0 = [(- b - sqrt(delta)) / (2 * a), (- b + sqrt(delta)) / (2 * a)]
  where
    delta = b ^ 2 - 4 * a * c

pierwiastki (-3) 1 2
[1.0,-0.6666666666666666]
rownanie_kwadratowe :: Double -> Double -> Double -> Double -> Double
rownanie_kwadratowe a b c x = a * x ^ 2 + b * x + c

jakas_funkcja_kwadratowa :: Double -> Double
jakas_funkcja_kwadratowa x = rownanie_kwadratowe 1 (-1) 5 x
jakas_funkcja_kwadratowa 10 -- > 95.0
razy_dwa :: Int -> Int
razy_dwa x = 2 * x

map razy_dwa [1..10] -- > [2,4,6,8,10,12,14,16,18,20]

map (\x -> x * 3) [1..10] -- > [3,6,9,12,15,18,21,24,27,30]

Przykłady języków funkcyjnych

  • Lisp (Clojure, Scheme)
  • Haskell
  • Clean
  • OCaml
  • Erlang
  • Scala
  • Elixir
  • ...

Program obiektowe

Obiekty + interakcje = programy

Typowe cechy języków obiektowych

  • abstrakcja
  • ukrywanie implementacji
  • przesyłanie komunikatów
  • polimorfizm
  • dziedziczenie

Abstrakcja

struct complex {
  double re;
  double im;
}

struct complex cpx_add(struct complex arg1, struct complex arg2){
  struct complex result = malloc(sizeof(complex));
  result.re = arg1.re + arg2.re;
  result.im = arg1.im + arg2.im;
  resturn result;
}

Abstrakcja w językach obiektowych

class Complex {
    public double re;
    public double im;

    public Complex(double re, double im){
        this.re = re;
        this.im = im;
    }

    public Complex add(Complex other){
        return new Complex(this.re + other.re, this.im + other.im);
    }

    public String toString(){
        return "Re: " + this.re + ", Im: " + this.im;
    }
}
Complex a = new Complex(1,2);
Complex b = new Complex(-2,-1);
Complex c = a.add(b);            // -> Complex(1,1)

Cykl życia obiektu

Cechy oraz związki obiektu

class Car {
    private String vin;
    private Color color;
    private Person owner;
    private int speed;
}

Rodzaje notacji - dygresja

  • PascalCase - notacja Pascala
  • camelCase - notacja wielbłądzia
  • snake_case - notacja z pokreśleniami (wężowa?)
  • lisp-case - notacja lispowa (choć bardziej odpowiada nam szaszłykowa)

Powstawanie obiektu

enum Color {
    Red,
    Green,
    Blue
}
class Person {
    private String name;
    private String surname;

    public Person(String name, String surname){
        this.name = name;
        this.surname = surname;
    }

    public String toString(){
        return "imię: " + this.name + ", nazwisko: " + this.surname;
    }
}
Person baltazar = new Person("Baltazar", "Gąbka");

Powstawanie obiektu

class Car {
    private String vin;
    private Color color;
    private Person owner;
    private int speed;

    public Car(String vin, Color color, Person owner){
        this.vin = vin;
        this.color = color;
        this.owner = owner;
        this.speed = 0;
    }

    public String toString(){
        return "VIN: " + this.vin + ", kolor: " + this.color +
            ", właściciel: " + this.owner + ", prędkość: " + this.speed;
    }
}
Car baltazarsCar = new Car("24-564", Color.Green, baltazar);

Baltazar Gąbka

Komunikaty - odczyt oraz zmiana stanu

class Car {
    private String vin; private Color color; 
    private Person owner; private int speed;

    public Car(String vin, Color color, Person owner){
        this.vin = vin; this.color = color;
        this.owner = owner; this.speed = 0;
    }

    public int getSpeed(){
        return this.speed;
    }

    public void start(){
        this.speed = 30;
    }

    public void stop(){
        this.speed = 0;
    }

    public void sell(Person newOwner){
       this.owner = newOwner;
    }
}
Car car = new Car("24-564", Color.Green, baltazar);
car.getSpeed(); // -> 0
car.start();
car.getSpeed(); // -> 30
car.stop();
car.getSpeed(); // -> 0

Polimorfizm - brak mechanizmu w języku C

struct matrix {
    //...
}
struct tensor {
    //...
}

struct matrix matrix_add(struct matrix matrix_1, struct matrix matrix_2);
struct tensor matrix_add(struct matrix matrix_1, struct tensor tensor_2);
struct tensor tensor_add(struct tensor tensor_1, struct matrix matrix_2);
struct tensor tensor_add(struct tensor tensor_1, struct tensor tensor_2);

Polimorfizm - interfejsy

interface ITensor {
    ITensor add(ITensor other);
}

class Matrix implements ITensor {
    public ITensor add(ITensor other){
        //...
    }
}

class Tensor implements ITensor {
    public ITensor add(ITensor other){
        //...
    }
}
ITensor[] tensors = new ITensor[4];
tensors[0] = new Matrix();
tensors[1] = new Matrix();
tensors[2] = new Tensor();
tensors[3] = new Tensor();

tensors[0].add(tensors[1]);
tensors[0].add(tensors[2]);

Porfiriusz i Awerroes

Porfiriusz i Awerroes

Dziedziczenie - klasa Vehicle

class Vehicle {
    protected int speed;

    public Vehicle(){
        this.speed = 0;
    }

    public void start(){
        this.speed = 10;
    }

    public void stop(){
        this.speed = 0;
    }

    public int getSpeed(){
        return speed;
    }
}

Dziedziczenie - klasa Car

class Car extends Vehicle {
    private String vin;

    public Car(String vin){
        super();
        this.vin = vin;
    }

    public void accelerate(int delta){
        this.speed += delta;
    }
}
Car car = new Car("44332211");
car.start();
car.accelerate(10);
car.getSpeed();                    //-> 20

Pytania?