Co było pierwsze funkcja czy klasa ?

Pewnego razu gdy medytowałem nad sensem świata, pewna ciekawa rzecz zaprzątnęła moim umysłem. Pytanie co było pierwsze – funkcja czy klasa ? Pytanie, co jest bardziej pierwotnym pojęciem w programowaniu?

Nie ma to może żadnych poważniejszych implikacji dla nas koderów, jednak można dojść do całkiem ciekawych wniosków. Odpowiedzią na pytanie zadane w tytule jest: pierwszy był… void ;).

A tak już całkiem na serio. W matematyce, w algebrze zbiorów najszerszym pojęciem jest klasa, jest ona bytem szerszym od zbioru. Klasa agreguje różne zbiory.

W programowaniu, klasa ma podobne znaczenie, jest czymś co określa pewien rodzaj obiektów. I tu właśnie zaczynają się schody, bo jak wiemy w klasie są metody, czyli funkcje. Więc jak to jest ? Czy może istnieć klasa która składa się z funkcji ? A może, istnieje sobie np. klasa funkcji kwadratowych, czyli wszystkich funkcji w postaci Ax2+bx+c czy klasa funkcji ekspotencjalnych. Co ciekawe np. w języku php da się stworzyć takie klasy:

class SquareFunction {

    protected $_a = 1;

    protected $_b = 1;

    protected $_c = 1;

    public function __construct($a,$b,$c){

        $this->_a = $a;

        $this->_b = $b;

        $this->_c = $c;

    }

    public function __invoke($x){

        return $this->_a*pow($x,2) + $this->_b*$x + $this->_c;

    }

}

$func = new SquareFunction(5,6,4);

echo $func(10);

Oczywiście jest tu trochę php-owej magii związanej z funkcją __invoke(dostępna od 5.3), dzięki której można wywoływać klasę jako funkcję. Nie mniej jednak logicznie rzecz biorąc jest to podejście słuszne.

Wracając jednak do pytania podstawowego co było pierwsze. Doszedłem do wniosku przemyśliwując sprawę gruntownie, że oba pojęcia są pojęciami pierwotnymi. Nie da się zdefiniować klasy bez funkcji i funkcji bez klasy. Tak jak nie da się podzielić elektronu na pół, ponieważ jest cząstką punktową, a jak wiemy matematyczny punkt jest niepodzielny.

Przypomina mi cała sprawa rzecz wziętą z fizyki, mianowicie dualizm korpuskularno falowy, funkcja jest jednocześnie funkcją i klasą.Z istniejących języków programowania najlepiej oddaje ten dualizm Javascript, gdzie funkcja jednocześnie jest klasą i powiem szczerze, że po tych przemyśleniach okazuje się, że jednak JS ma jakiś głębszy sens 😉

  1. Rodzyn pisze:

    Pierwsze było programowanie proceduralne/strukturalne. Więc pierwsze były procedury i funkcje :)

    Swoją drogą ciekawiłby mnie bardziej przykład tych funkcji ekspotencjalnych. One obrazują potencję programisty czy co? 😛 Rozumiem, że chodziło o eksponencjalne :)

  2. Wojciech Soczyński pisze:

    Ha znasz moje słowotwórcze zboczenia 😛 Btw w tym poście nie chodzi o to co było pierwsze w kontekście historycznym, raczej o to co jest bardziej pierwotnym pojęciem w programowaniu w szerszym pojęciu :>

  3. Adam pisze:

    Oczywiście że funkcja. Klasa to tylko zbiór funkcji i atrybutów (nie mylić z obiektem), a programowanie funkcyjne obywa się bez klas. Polecam posłuchać:
    http://www.se-radio.net/podcast/2008-03/episode-89-joe-armstrong-erlang

  4. Wojciech Soczyński pisze:

    Tak ale z drugiej strony, klasa jest pojęciem, które opisuje obiekty. Klasa opisuje podobne do siebie obiekty ( w matematyce jest to dobrze widoczne, klasa to pojęcie szersze od zbioru ).

    Tak jak pokazałem w artykule można robić funkcje, które są jakiejś klasy ( w przykładzie jest to funkcja klasy „funkcja kwadratowa” ).

    Polecam spojrzeć na to zagadnienie z bardziej matematycznego punktu widzenia.

  5. Adam pisze:

    To co widać w przykładzie to tylko lukier składniowy mający na celu osłodzić brak first-class functions w PHP (razem z funkcjami anonimowymi). Funckcja i klasa są tożsame, pelecam posłuchać Dick Gabriel on Lisp (poprzednio podałem link do nie tego podcastu):
    http://www.se-radio.net/podcast/2008-01/episode-84-dick-gabriel-lisp

  6. Wojciech Soczyński pisze:

    Posłucham sobie tego. Jeżeli chodzi o funkcje anonimowe i domknięcia, to PHP je ma od 5.3 (mniejsza o sposób implementacji). Tak czy inaczej chyba się jednak nie zrozumieliśmy ;P. Może mało precyzyjnie się wysłowiłem w tym artykule – cały czas chodzi mi głównie o matematyczny punkt widzenia (matematyczne pojęcie klasy z teorii zbiorów i matematyczne pojęcie funkcji) i jak się to ma do tego czego używamy w praktyce programistycznej.

  7. Sądzę, że najpierw była funkcja. Funkcja istnieje bez klasy.

    function istniejaca()
    {
    return ‚sialalaala’;
    }

    Sądzę, że jest to rozważanie matematyczno – filozoficzne. Niestety taki ze mnie matematyk, jak filozof, a filozof ze mnie żaden :)

    @Adam: link nie działa ;/

    Error 404 – Not Found
    Sorry, but you are looking for something that isn’t here.

  8. @patryk – tylko z drugiej strony istnieją klasy funkcji:

    np.

    2x^2+5x+3 , 2x^2+6x+3 … wszystkie funkcje w postaci ax+bx+c są klasy „funkcja kwadratowa” ;). Właściwie to pojęci klasy pochodzi z teorii kategorii, a tam też wiele rzeczy określa się przez funkcje. Więc tak podsumowując cały artykuł i przemyślenia moje w tej materii to stwierdzam, że zarówno klasa jak i funkcja to pierwotne pojęcia – artefakty, których nie da się już bardziej zdekomponować.

  1. There are no trackbacks for this post yet.

Leave a Reply

Informuj mnie o odpowiedziach poprzez e-mail. Możesz również subskrybować wpis bez zostawiania komentarza.