Czy za OOP kryje się teoria / abstrakcja?

13

Programowanie funkcjonalne ma bardzo elegancki rachunek lambda i jego warianty jako teorię kopii zapasowej. Czy istnieje coś takiego dla OOP? Czym jest abstrakcja dla modelu obiektowego?

Viclib
źródło
5
Obciążenia i obciążenia. Czy próbowałeś Google? Na przykład istnieje seria warsztatów o nazwie FOOL poświęcona podstawom języków zorientowanych obiektowo, prowadzona od 1993 roku. Drapie tylko powierzchnię.
Dave Clarke
@DaveClarke. Nie do końca się zgadzam. Rachunek Lambda jest podstawą bardzo precyzyjnego programowania funkcjonalnego. Na przykład, raport Haskella mówi, że cały język Haskella można uznać za zwykły cukier składniowy dla języka podstawowego, który jest równoważny typowanemu rachunku lambda. Nie znam żadnego języka obiektowego, który mógłby twierdzić podobnie w odniesieniu do rachunku różniczkowego. Masz rację, że są „obciążenia”. Ale nic z tego nie jest właściwe.
Uday Reddy
@UdayReddy: Być może wynika to z bogactwa języka obiektowego.
Dave Clarke
1
@DaveClarke Bogactwo tematu może oznaczać, że (1) jest to dobre modne hasło, (2) tak naprawdę nie rozumiemy wystarczająco tematu, aby uzyskać konsensus, (3) mieszamy kilka zagadnień, które są prawie ortogonalne . Chociaż nie śledziłem dokładnie (najnowszej) literatury na temat programowania OO, zawsze miałem wrażenie, że chodziło o mieszanie problemów, nie zwracając na to szczególnej uwagi (oczywiście dotyczy to bardziej języków niż pracy teoretycznej). Problemy te obejmują pisanie, abstrakcję, stanowość, równoległość, ponowne użycie kodu. (Jedna) teoria prawdopodobnie nie uwzględni wszystkich wariantów.
babou

Odpowiedzi:

15

Istnieją cztery główne podejścia, które jedynie zarysowują powierzchnię tego, co jest dostępne:

  • poprzez lambdy i rekordy: chodzi o kodowanie obiektów, klas i metod w kategoriach bardziej tradycyjnych konstrukcji. Praca Benjamina Pierce'a z połowy lat 90. jest reprezentatywna dla tego podejścia.
  • Rachunki obiektowe Abadiego i Cardellego (patrz książka Teoria obiektów Abadiego i Cardellego : ich główna abstrakcja jest zapisem metod, a podejście jest bliższe prototypowej realizacji programowania obiektowego, chociaż klasy i dziedziczenie można zakodować w warunki bardziej prymitywnych elementów.
  • Rachunek multimetodowy Castagny (patrz książka Castagna Object-Oriented Programming A Unified Foundation ): jego podejście przy użyciu multimetod jest kluczową abstrakcją.
  • Rachunki klasowe (takie jak w książce Kim Bruce'a Podstawy języków zorientowanych obiektowo: Typy i semantyka lub Featherweight Java ): te podejścia mają na celu uchwycenie istoty programowania klasowego i skupienie się na klasach i dziedziczeniu.
Dave Clarke
źródło
12

Związek między rdzeniem modelu obiektowego a teorią zbiorów opisano w następujących dokumentach:

Dokumenty przedstawiają strukturę relacji instancji i dziedziczenia między obiektami. Taką strukturę można uznać za najwyższą możliwą abstrakcję OOP. Pokazano, w jaki sposób struktura ma zastosowanie do poszczególnych języków programowania (Ruby, Python, Java, Scala, Smalltalk-80, Objective-C, CLOS, Perl, Dylan, JavaScript), a także do języków ontologii (RDF Schema i OWL 2 Full).

W dokumentach klasy są oparte na obiektach , dzięki czemu struktura rdzenia jest sortowana pojedynczo. W głównej formie strukturę można wyrazić jako (O, ϵ , ≤, .ec) gdzie

  • O to zbiór obiektów ,
  • ϵ to relacja członkostwa (obiektowa) , udoskonalenie relacji instancja- ,
  • ≤ jest relacją dziedziczenia , a
  • .ec jest mapą klas mocy, która jest wyróżnionym, być może pustym, podzwiązaniem of.

Przykładową strukturę rdzenia zgodnie z modelem obiektowym Ruby pokazano na poniższym schemacie. Zielone linki pokazują relację dziedziczenia w zwrotnej redukcji przechodniej, niebieskie linki pokazują relację członkostwa w „redukcji absencji” - niebieskie łącze od x punktów do najmniejszego kontenera x . Mapę Powerclass .ec tworzą poziome niebieskie linki. Obiekty z obrazu tej mapy to klasy mocy (w kolorze szarym). W Ruby są one nazywane klasami eigenclass lub klasami singleton (ten ostatni termin jest raczej przestarzały). Obiekty s , u i v (w kolorze różowym) są końcowe, pozostałe obiekty są potomkami korzenia dziedziczenia r .

  r = BasicObject; c = Class; A = c.new(r); B = c.new(A); s = A.new; u = B.new; v = B.new; class << s; end; class << v; end

Podstawowe części modelu obiektowego wszystkich powyższych języków można traktować jako specjalizacje struktury, bez lub z kilkoma dodatkowymi składnikami. Z teoretycznego punktu widzenia najbardziej znaczącym przypadkiem dodatkowego składnika jest mapa singletonu (oznaczona .ɛϲ ) wprowadzona przez Dylana. To sprawia, że ​​Dylan jest jedynym językiem programowania (z wyżej wspomnianego), który nie podlega warunkowi monotoniczności (≤) ○ (ϵ) ⊆ (ϵ), w którym symbol kompozycji ○ jest interpretowany od lewej do prawej.

Jednym ze sposobów sformalizowania związku między rdzeniem modelu obiektowego a teorią zbiorów jest zastosowanie rodziny struktur (O, ≤, r, .ec, .ɛϲ) zwanych strukturami metaobiektu w dokumentach, do których się odwołuje, ponieważ x.ec lub x.ɛϲ można rozważyć jako metaobiekty x . W tych strukturach x.ec jest definiowany dla każdego obiektu x, a x.ɛϲ jest definiowany dla każdego ograniczonego („małego”) obiektu x . Struktury podlegają dziewięciu poniższym aksjomatom. Aksjatyzacja wykorzystuje definicję rozszerzenia, która jest dość prosta dla pierwszych ośmiu aksjomatów ( Toznacza zbiór obiektów końcowych - tych, które nie są potomkami r , a .ec jest zwrotnym, przechodnim zamknięciem .ec ), ale raczej zaangażowanym w ostatni aksjomat.

  1. Dziedziczenie jest porządkiem częściowym.
  2. Mapa klas mocy, .ec , jest wbudowaniem (O, ≤) w siebie.
  3. Obiekty z T.ec są minimalne.
  4. Każda klasa mocy jest potomkiem r .
  5. Zestaw r.ec nie ma dolnej granicy.
  6. Mapa singletonów, .ɛϲ , jest iniekcyjna.
  7. Obiekty z O.ɛϲ.ec są minimalne.
  8. Dla każdego obiektu x , y tak, że x.ɛϲ jest zdefiniowane, x.ɛϲ ≤ y.ec ↔ x ≤ y .
  9. Dla każdego obiektu x , x.ɛϲ jest zdefiniowane ↔ xd <ϖ .

W ostatnim aksjomacie ϖ jest liczbą porządkową o ustalonym limicie, a .d jest funkcją rangi wyprowadzoną z rozszerzenia definicji. Relacja członkostwa obiektu ϵ jest uzyskiwana jako (( .ɛϲ ) ∪ ( .ec )) ○ (≤). Zgodnie z ostatnim aksjomatem ograniczenie domenowe ϵ do zbioru ograniczonych obiektów wynosi ( .ɛϲ ) ○ (≤). W odnośnych dokumentach relacja ta nazywana jest członkostwem ograniczonym i oznaczana jest jako ∊. Jako istotna cecha ta relacja jest dobrze uzasadniona. Jest to sprzeczne z ϵ, który nie jest uzasadniony od r ϵ r. Okazuje się, że główną zgodność między (podstawową częścią) technologią obiektową a teorią zbiorów można wyrazić jako

∊ ↔ ∈

tzn. ograniczone członkostwo odpowiada członkostwu w zestawach między dobrze ugruntowanymi zbiorami. Jako szczególny przypadek częściowy wszechświat von Neumanna o randze ϖ + 1 jest strukturą metaobiektu z definicji. Zasadniczo każdy abstrakt ( ϖ + 1 ) - nadbudowa (O,) jest definitywnie równoważny kompletnej strukturze metaobiektu. Każda struktura metaobiektu może być wiernie osadzona w kompletnej strukturze metaobiektu, która z kolei może być wiernie osadzona we wszechświecie von Neumanna.

Termin struktura podstawowa jest używany do uogólnienia struktur metaobiektu. W tym uogólnieniu, .ec i .ɛϲ mogą być (dowolnie) częściowe, być może puste. W szczególności możliwe są skończone podstawowe struktury, przy czym minimalna struktura zawiera tylko pierwiastek dziedziczenia r . Każda podstawowa struktura może zostać rozszerzona do struktury metaobiektu poprzez uzupełnienie klasy mocy, a następnie uzupełnienie pojedynczego elementu, co z kolei sprawia, że ​​podstawowe struktury można wiernie osadzić we wszechświecie von Neumanna.

paon
źródło
@Raphael Znacznie lepiej - dzięki, paon!
David Richerby,