Jaka jest według Ciebie ta funkcja, która sprawiła, że programowanie obiektowe odniosło tak duży sukces?
- Przekazywanie wiadomości
- Dziedzictwo
- Wielopostaciowość
- 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?
object-oriented
Tony
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
Ukrywanie danych zapewniane przez enkapsulację.
źródło
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
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.
źródło
Abstrakcja
Zapewnienie niezbędnych usług ukrywających niepotrzebne rzeczy. Zobacz moje wyjaśnienie tutaj - co to jest abstrakcja?
źródło
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ą.
źródło
Pytanie „ ADT 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.
źródło
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.
źródło
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ć
więc 1. Przekazywanie wiadomości i 3. Polimorfizm faktycznie obsługuje 2. Dziedziczenie i 4. Kapsułkowanie.
źródło
Moim zdaniem trzy ostatnie funkcje są najważniejsze, gdy miały wpływ na szerokie zastosowanie OOP:
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 :)
źródło