60.18.1. OOP

Poznámky a náměty k realizaci OOP v bashi.

2007-02-15

Abstrakt

Pokus o konstrukci jednoduchého oběktově orioentovaného systému v bashi.

60.18.1.1. Varianta první

Začal jsem uvažovat o objektově orientovaném programování v bashi. Na mysli mi přišla představa kterou tady popíši a kterou chci vyzkoušet.

Objektově orientované programování, dál již jen OOP má několik základních vlastností, jsou to:

Zapouzdření (Encapsulation) znamená že existuje hranice ktaré vyděluje vnitřní části objektu od okolního světa.

Polymorfismus, to je, že každý objekt reaguje na stejnou zprávu mu zaslanou z vnějšku svým vlastním osobitým způsbem. Mějme dva objekty ''a'' a ''b''. Každému z nich pošleme stejnou zprávu

# a pozdrav
dobrý den
# b pozdrav
čau

Tedy oba objekty dostali stejnou zprávu ale každý na ni reaguje jiným způsobem.

Objekty. V bashi nemáme mnoho možností jak reprezentovat objekty, paměťové struktury jsou značně primitivní. Zbývá použít souborový systém. Objekt tedy reprezentujeme nějakým elementem soborového systému. K dispozici máme jen dvě možnosti: soubor a adresář.

Objekt reprezentovaný souborem. Pokud budeme chtít reprezentovat objekt souborem, tedy jedním souborem, musíme se vyrovnat s tím, jak do něj uložit vše potřebné, tedy metody a atributy. T.j. v souboru budou části reprezentující jednotlivé části oběktu a při měnách v těchto částech musí být soubor měněn (editován). Editován myslím progamově.

Objekt si můžeme představit jako skript/program. Volání metody objektu je pak spuštění programu s metodou jako parametrem:

# obj method
# obj method

Celkově se mi zdá tento způsob implementace objektů nevhodný z důvodů komplikovného meodfikování atributů objektu.

Objekt reprezentovaný adresářem. Druhá možnost je reprezentovat objekt skupinou souborů, každý pro jeden atribut/metodu. Změna hodnoty atributu se pak uskuteční jednoduše přepsáním souboru. Například nastavení atributu **var** na hodnotu 45 realizujeme snadno následovně:

echo 45 >var

Soubory můžeme "svázat" jménem, respektive jeho částí, nebo adresářem. V tomto případě tvoří obsah adresáře jeden objekt.

Máme-li jméno objektu (adresáře) v proměnné **obj** , můžme volat metodu **metoda** s parametrem 42 takto:

$obj/metoda 42

Zprávu objektu pak pošleme pomocí zprostředkovatelské funkce/příkazu **sendmsg**:

sendmsg $obj metoda 42

Základní metody:

obj addSlot: <symbol>
obj addSlot: <symbol> valued: <value>
obj addImmutableSlot: <symbol> valued: <value>
obj removeSlot: <symbol>

Objekty jsou reprezentovány adresáři. Jeden adresář jeden objekt. Uvnitř adresáře jsou soubory reprezentující jednotlivé části objektu jako jsou: