Co sprawiło, że programowanie obiektowe zakończyło się sukcesem? [Zamknięte]

17

Jaka jest według Ciebie ta funkcja, która sprawiła, że ​​programowanie obiektowe odniosło tak duży sukces?

  1. Przekazywanie wiadomości
  2. Dziedzictwo
  3. Wielopostaciowość
  4. Kapsułkowanie

Lub inna funkcja, którą możesz chcieć przedstawić.

Chciałbym również wiedzieć, jaki jest związek między typem danych abstrakcyjnych a programowaniem obiektowym?

Tony
źródło
popularne i odnoszące sukcesy nie są synonimami
Kevin Cline,

Odpowiedzi:

76

Sugerowałbym, że najważniejszą cechą programowania obiektowego jest zarządzanie złożonością .

Ludzki mózg może jednocześnie przechowywać tak wiele pojęć - często pojawia się często cytowany limit zapamiętywania 7 +/- 2 niezależnych elementów.

Kiedy pracuję nad systemem 600kloc w pracy, nie mogę od razu trzymać tego wszystkiego w głowie. Gdybym musiał to zrobić, ograniczałbym się do pracy na znacznie mniejszych systemach.

Na szczęście nie muszę. Różne wzorce projektowe i inne struktury, które zastosowaliśmy w tym projekcie, oznaczają, że nie muszę zajmować się całym systemem na raz - mogę zbierać pojedyncze elementy i pracować nad nimi, wiedząc, że pasują one do szerszej aplikacji na dobrze określone sposoby.

Wszystkie ważne koncepcje OO zapewniają sposoby zarządzania złożonością.

Hermetyzacja - pozwól mi poradzić sobie z zewnętrznym interfejsem API, który zapewnia mi różne usługi, bez obawy, jak te usługi są wdrażane.

Abstrakcja - pozwolę sobie skoncentrować się na podstawowych cechach i zignorować to, co nieistotne.

Kompozycja - pozwól mi ponownie użyć komponentów, które zostały już zbudowane w nowych kombinacjach

Polimorfizm - pozwól mi poprosić o usługę, nie martwiąc się o to, w jaki sposób różne obiekty mogą to zapewniać na różne sposoby.

Dziedziczenie - pozwól mi ponownie użyć interfejsu lub implementacji, podając tylko te elementy, które różnią się od poprzednich.

Zasada pojedynczej odpowiedzialności - pozwala zachować cel dla każdego obiektu jasny i zwięzły, dzięki czemu łatwo jest go zrozumieć

Zasada substytucji Liskowa - nie zastawiajmy sobie pułapek, wprowadzając dziwne zależności

Zasada Otwarta / Zamknięta - zezwólmy na rozszerzenie i modyfikację w sposób, który nie wymaga od nas ryzyka zepsucia istniejącego kodu

Dependency Injection - przenieśmy kompozycję na wyższy poziom i zmontuj elementy razem znacznie później.

Rozwój zorientowany na interfejs - przenieś abstrakcję na wyższy poziom i polegaj tylko na abstrakcji, nigdy na konkretnej implementacji.

Bevan
źródło
6
+1. Mogę głosować tylko raz, a szkoda, że ​​zasługuje na więcej.
Richard
1
Jest to następstwem tego, szkoda, że ​​nie mogę teraz znaleźć odnośnika, ale postaram się to sprawdzić i edytować komentarz. Tak więc badanie praktyk przeglądu kodu wykazało, że przeglądanie kodu zwykle zajmuje więcej czasu, aby znaleźć błędy w kodzie OO niż w kodzie proceduralnym, ponieważ przepływ przeskakuje bardziej w kodzie OO. Praktyki takie jak TDD i programowanie par łagodzą to, ale wciąż jest to interesujący (i dla mnie nieoczekiwany) wynik.
5
To może być idealna odpowiedź - pełna informacja, ale wystarczająco krótka, aby czytelnik nie musiał czytać powieści. Bravo
Tim Claason,
@Graham Lee: Byłbym zainteresowany przeczytaniem tego badania.
Frank Shearar,
13

Graficzne interfejsy użytkownika. Pod koniec lat osiemdziesiątych, na początku lat dziewięćdziesiątych, kiedy Mac, Amigas, Atari STs, Windows i GEM zaczęły zastępować oparte na znakach interfejsy użytkownika, stało się oczywiste, że języki takie jak C nie nadają się do pisania programów GUI. Podczas gdy tradycyjne przetwarzanie danych jest uważane za schemat „danych wejściowych -> przetwarzanie -> dane wyjściowe”, co można również zrobić w języku proceduralnym, funkcje OOs właśnie się przydały do ​​obsługi wrodzonej złożoności GUI.

użytkownik 281377
źródło
1
+1 za wzmiankę o aplikacjach GUI. Orientacja obiektowa była narzędziem pozwalającym na implementację GUI, które w innym przypadku (z kodem proceduralnym) były dość trudne w zarządzaniu.
Giorgio
7

Ukrywanie danych zapewniane przez enkapsulację.


źródło
To jest odpowiedź? ADT zapewniają ukrywanie danych (dlatego nazywane są „abstrakcjami danych”)
Frank Shearar
@Frank, poprosił o określone funkcje, a kiedy napisałem tę odpowiedź, był tylko jeden i starałem się nie powielać.
W porządku, ale kapsułkowanie nie jest specyficzne dla OO. Powinienem to sprawdzić, ale jestem pewien, że przeprowadzaliśmy enkapsulację na długo przed OO.
Frank Shearar,
1
@Frank, zgadzam się, że to nie jest specyficzne dla OO, to tylko jedna z jego głównych funkcji.
Dotyczy to większości OOPL, ale nie wszystkich. CLOS jest godnym uwagi wyjątkiem.
Frank Shearar,
7

Funkcja, o której jeszcze nie wspomniano w żadnej innej odpowiedzi: modelowanie domen . Ponieważ ludzie zwykle myślą o robieniu rzeczy z obiektami lub o obiektach, a także o obiektach o swoistych właściwościach, bardzo łatwo jest modelować problem lub przepływ pracy za pomocą oprogramowania obiektowego. Zasadniczo pozwala nam wykorzystać naszą obecną zdolność radzenia sobie z rzeczownikami, czasownikami i przymiotnikami w kodzie.


źródło
6

Myślę, że dziedziczenie jest najważniejszym punktem OOP.

[z rozwoju gry] Możesz stworzyć coś w rodzaju klasy Drawable z metodami renderowania i atrybutami oraz stworzyć klasę Spaceship i Planet, która dziedziczy po Drawable. Weź wszystkie obiekty z tych [i innych potomków Sprite], wrzuć obiekt rysunkowyObjArray i po prostu wywołaj metodę rysowania dla każdego obiektu. Musisz tylko wiedzieć, że jest to Drawable.

JulioC
źródło
2
Naprawdę?? Polimorfizm jest ZNACZNIE ważniejszy i nie wymaga dziedziczenia (z teoretycznego punktu widzenia).
Thomas Eding,
Nie wymaga nawet funkcji wirtualnych, wystarczy użyć wskaźników funkcji.
Calmarius,
1
Oryginalna koncepcja OO Alana Kaya nie obejmowała nawet dziedziczenia, ponieważ nie podobało mu się, jak zostało to wdrożone w poprzednich systemach.
Michael Borgwardt,
3

Abstrakcja

Zapewnienie niezbędnych usług ukrywających niepotrzebne rzeczy. Zobacz moje wyjaśnienie tutaj - co to jest abstrakcja?

Gulszan
źródło
Literówka: „Absraction” powinno być „Abstraction”
Vetle
2

Jest to nieco udane, ponieważ zachęca do użycia organizacji rzeczy przez ludzki umysł w obiekty. Ludzie są ogólnie dobrzy w widzeniu relacji między rzeczami - takimi jak różnice, podobieństwa i zachowania. OO zachęca do tworzenia oprogramowania naśladującego ludzką konceptualizację świata.

Uproszczenie tworzenia oprogramowania do tego, jak postrzegamy świat, ułatwia naszym umysłom radzenie sobie ze złożonością.

Tim
źródło
Być może wynika to z większego doświadczenia z procedurami, ale po użyciu obu metod nadal uważam, że procedury są bardziej intuicyjne niż OOP. Nadal jednak lubię dobre części obu stylów.
Juha Untinen,
1

PytanieADT kontra obiekty ” było tu wielokrotnie zadawane. Jednowierszowa odpowiedź brzmi: „ADT i obiekty są odwrotnością do siebie nawzajem - to, czego jedno streszczenie dobrze zgrywa, a drugie nie; każda z nich zapewnia elastyczność na różne sposoby”.

Aby uzyskać dłuższą odpowiedź, zobacz artykuł Williama Cooka Zrozumienie abstrakcji danych, ponownie . W skrócie, obiekty pozwalają na łatwe korzystanie z wielu implementacji / reprezentacji niektórych danych (coś, co wygląda jak lista, może być tablicą lub drzewem samowyważącym lub…), ale utrudniają dodawanie nowych operacji (ponieważ trzeba dodać tę nową operację do każdej reprezentacji), podczas gdy narzędzia ADT ułatwiają dodawanie nowych operacji na typie danych, ale utrudniają wiele implementacji.

Edycja: Powiedziałem, że przekazywanie wiadomości sprawiło, że OO odniosło sukces. Na podstawie komentarza Jonasa, to nie jest poprawne, ponieważ większość języków, które ludzie uważają za OO, nie używa przekazywania wiadomości. Ponieważ to nie w porządku, usunąłem to z mojej odpowiedzi.

Frank Shearar
źródło
1
Przekazywanie wiadomości nie może być odpowiedzią, ponieważ żaden z udanych języków OOP go nie używa.
Jonas
Twoje OO niekoniecznie jest moim OO. I większość języków, które nazywane są OO, nie są według definicji Alana Kaya. Zapomniałem dokładnego cytatu, ale Kay powiedziała, że ​​przedmioty nie były tym, co było ważne w Smalltalk, ale przekazywanie wiadomości (i że większość pomijała ten punkt).
Frank Shearar,
@Jonas, po ponownym przeczytaniu pytania i mojej odpowiedzi, mówię w połowie: „OO nie udaje się, ponieważ tak niewiele języków robi to dobrze”. Ale mówię takie rzeczy tylko wtedy, gdy mam na sobie ognioodporny kombinezon.
Frank Shearar,
0

Moje trzy najważniejsze funkcje. Składanie obiektów - umożliwianie współpracy obiektów. Polimorfizm - wspiera dynamiczne zachowania w czasie wykonywania. Dziedziczenie - poprzez ponowne użycie kodu i modyfikację zachowania poprzez zastąpienie metod.

ADT - możesz to mieć nawet w językach innych niż obiektowe, takich jak Pascal. Stos lub kolejka to przykłady narzędzia ADT.

StartClass0830
źródło
„ADT - możesz to mieć nawet w językach innych niż obiektowe, takich jak Pascal. Stos lub kolejka są przykładami ADT.”: Prawda. Ale OOP ułatwia zdefiniowanie interfejsu ADT i zapewnia inną, wymienną implementację (interfejs / klasa abstrakcyjna <---> podklasy / konkretne klasy). O ile mi wiadomo, Pascal nie jest tak łatwy.
Giorgio
0

w prostych słowach OOP jest kluczem do ponownego wykorzystania i enkapsulacji, co skutkuje produkcją dużych frameworków, które ułatwiają życie programistom w tej erze, ponieważ mogą po prostu wywoływać interfejsy API i robić to, czego chcą najczęściej.

ponieważ twoje pytanie dotyczy 4 funkcji OOP, więc możesz powiedzieć

  1. Dziedziczenie i 4. Hermetyzacja to najważniejsze cechy, a pozostałe dwie są bardzo potrzebne do osiągnięcia pierwszych dwóch

więc 1. Przekazywanie wiadomości i 3. Polimorfizm faktycznie obsługuje 2. Dziedziczenie i 4. Kapsułkowanie.

  1. Dziedziczenie i 4. Hermetyzacja są kluczem do sukcesu OOP
Badr uz Zaman
źródło
Dziedziczenie nie jest wymagane, definiuje element, a nawet bardzo pożądaną część OOP przez większość czasu. hermetyzacja jest ogólnie dobrą zasadą programowania. nie został wymyślony przez OOP i nie jest używany wyłącznie w OOP.
sara
-1

Moim zdaniem trzy ostatnie funkcje są najważniejsze, gdy miały wpływ na szerokie zastosowanie OOP:

2. Inheritance
3. Polymorphism
4. Encapsulation

Edycja: Kolejnym punktem będą środowiska programistyczne IDE i graficzne, takie jak Visual studio i Eclipse. Obejmując języki OOP, coraz więcej projektów dążyło do OOP.

I oczywiście SOLIDNE Zasady to te, które sprawiają, że produkty ROCK są solidne :)

Jusubow
źródło