Autor Wątek: Prototypowy model obiektowości i polimorfizm zależny od wszystkich argumentów  (Przeczytany 923 razy)

Offline ajuc

  • Użytkownik
    • strona domowa

# Maj 25, 2012, 19:02:32
Niedawno trafiłem na fajny artykuł o innym podejściu do programowania obiektowego. http://lee.fov120.com/ecoop.pdf

Artykuł proponuje rozwiązanie 2 częstych problemów w tradycyjnym programowaniu obiektowym (z polimorfizmem zależnym tylko od typu właściciela metody, i ze sztywną hierarchią klas).

Przykładowy kod napisany w tradycyjny sposób:

class Animal {
    abstract method encounter (other : Animal);
    method swimAway (other : Animal) { ... }
}
class Fish inheriting Animal {
    method encounter (other : Animal) {
        if (other.isShark())
            if (other.isHealthy())
                swimAway();
    }
}
class Shark inheriting Animal {
    variable healthy : boolean;
    method isHealthy() {
        return healthy;
    }
    method swallow (other : Animal) { ... }
    method encounter (other : Animal) {
        if (isHealthy())
            if (other.isFish())
                swallow (other);
            else if (other.isShark())
                fight (other);
        else
            swimAway();
    }
    method fight (other : Shark) {
        healthy := False;
    }
}

I kod w języku obsługującym prototypy i multiple dispatch:
object Animal;
object Fish;
object Shark;
object HealthyShark;
object DyingShark;

addDelegation (Fish, Animal);
addDelegation (Shark, Animal);
addDelegation (Shark, HealthyShark);

method swimAway (animal : Animal) { ... }
method encounter(animal : Fish, other : Animal) /* A */ { }
method encounter(animal : Fish, other : HealthyShark) /* B */ {
    swimAway();
}
method swallow (animal : Shark, other : Fish) { ... }
method fight (animal : HealthyShark, other : Shark) {
    removeDelegation(animal, HealthyShark);
    addDelegation(animal, DyingShark);
}
method encounter (animal : HealthyShark, other : Fish) /*C*/ {
    swallow (other)
}
method encounter (animal : HealthyShark, other : Shark) /*D*/ {
    fight (other)
}
method encounter (animal : DyingShark, other : Animal) /*E*/ {
    swimAway();
}

Zauważcie, że nie ma żadnych ifów w metodach, nie trzeba duplikować kodu, łatwo dodawać nowe typy obiektów i nowe interakcje między nimi bez modyfikowania starych.

Wg mnie fajny pomysł, szkoda, że na razie popularne języki tego nie obsługują.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Maj 25, 2012, 20:03:09
Obsluguja np ObjC :)

Offline ajuc

  • Użytkownik
    • strona domowa

# Maj 25, 2012, 20:57:18
Obsluguja np ObjC :)

Z tego co mi wiadomo ObjC nie ma prototypów? Ale języka nie znam, więc mogę się mylić.