Programowanie strukturalne a programowanie OO

11

Przygotowuję prezentację, która pokazuje różnice między programowaniem strukturalnym a programowaniem obiektowym i chcę zilustrować, dlaczego ludzie potrzebują OOP, na przykładzie, w którym zastosowanie koncepcji OOP znacznie ułatwi kodowanie, dzięki czemu odbiorcy naprawdę poczują, że potrzebują OOP.

Jakieś pomysły ??

Ahmed
źródło
2
zadając to pytanie na programmers.stackexchange.com otrzymasz więcej odpowiedzi.
reggie
2
Jaka jest twoja publiczność? Doświadczeni programiści spoza OO (cobol itp.)? nisko doświadczeni programiści (studenci itp.)? Kierownictwo (w ogóle nie programistów)?
Nie słyszałem o tym wcześniej, ale przeczytałem FAQ i chyba lepiej o to zapytać.
Ahmed
mało doświadczony.
Ahmed
4
Chciałbym, żeby niektóre programy OO były lepiej skonstruowane.
Scott Whitlock

Odpowiedzi:

17

Możesz zajrzeć na ten szybki blog wideo . Rezultat jest taki, że różnica między programowaniem strukturalnym a programowaniem OO zależy od tego, co zabierają programowaniu, a nie od tego, co dodają. Dyscypliny oprogramowania, takie jak programowanie strukturalne i programowanie obiektowe, są ograniczające, a nie włączające. Oto kilka definicji. Ostrzeżenie: nie polubisz ich.

  • Programowanie strukturalne to dyscyplina narzucona goto (bezpośrednie przekazanie kontroli)

  • Programowanie OO to dyscyplina nałożona na wskaźniki do funkcji (pośrednie przekazanie kontroli)

  • Programowanie funkcjonalne to dyscyplina narzucana przy przydzielaniu zadań.

    Pierwszy nie jest zbyt trudny do zrozumienia. Dijkstra stwierdził, że niemożliwe było stworzenie ogólnych dowodów poprawności, gdy goto było dozwolone w algorytmach. Jeśli jednak struktury kontrolne byłyby ograniczone do sekwencji, selekcji i iteracji, możliwe byłyby dowody poprawności . Oczywiście nie próbujemy nawet dzisiaj udowodnić, że wszystko jest w porządku, ale podoba nam się prostota i elegancja programowania strukturalnego.

Trochę trudniej zrozumieć OO. Często definiujemy OO jako enkapsulację, dziedziczenie i polimorfizm. Mniejsze jest to, że wszystkie trzy z tych atrybutów są osiągalne i często zostały osiągnięte w C. Rzeczywiście, C ++ zaczęło się jako preprocesor skompilowany do C. Nie jest tak naprawdę trudne do enkapsulacji w C. Nie jest też trudne do zbudowania struktury danych, które są wzajemnie podzbiorami, symulując dziedziczenie. Polimorfizm jest jednak nieco trudniejszy. Wymaga wskaźników do funkcji, które w C są trudne do dobrego zarządzania. Języki takie jak C ++ dały nam dyscyplinę narzuconą na te wskaźniki funkcji. Kompilator C ++ zbudował dla nas vtables i zainicjował wskaźniki w nich zgodnie z surowym formalizmem. W bardzo realnym sensie OO jest po prostu dyscyplinąpośrednie przekazanie kontroli, tj. wskaźników do funkcji.

Programowanie strukturalne polega na tym, jak nie używać goto. OO polega na tym, jak nie używać wskaźników do funkcji. Również programowanie funkcjonalne polega na tym, czego nie należy robić. W programowaniu funkcjonalnym nie przypisujemy zmiennych, z wyjątkiem najbardziej ściśle kontrolowanych przypadków.

W końcu wszystkie te „technologie” programowania faktycznie ograniczają dyscypliny, a nie technologie wspomagające. Mówią nam, co nie robić więcej niż mówią nam, co do zrobienia. A to oznacza, że ​​rozwój oprogramowania nie rozwinął się w ciągu ostatnich 40 lat. Raczej się skurczył. Staje się coraz bardziej ograniczony, ponieważ nauczyliśmy się wszystkich rzeczy, których nie powinniśmy robić.

Uczenie się, czego nie należy robić, jest dobre; ale oto niepokojące pytanie: jakie nowe rzeczy nauczyliśmy się robić?

Wujek Bob.
źródło
@Ahmed: +1 za „TL; DR, dzięki za wideo” - podejrzany komentarz (żart)
n611x007
link rot ... dead link
slashdottir
7

Istnieją 3 podstawowe sposoby programowania komputera:

  1. Programowanie nieustrukturyzowane - za pomocą gotos, jak w starych tłumaczach BASIC lub w asemblerze. Niewiele osób programuje już w ten sposób.
  2. Strukturalne programowanie imperatywne - jak w C lub PASCAL.
  3. Strukturalne programowanie funkcjonalne - jak w Haskell, ML lub Lisp.

Moim zdaniem programowanie obiektowe jest czymś innym. Chodzi o to, jak zorganizować swój program na większą skalę. Nie zastępuje ani nie dezaktualizuje żadnego z 3 paradygmatów, o których wspomniałem powyżej - w ciele metody nadal musisz wybrać jeden z 3 paradygmatów z listy, aby zapisać.

Ken Bloom
źródło
Nie rozumiem cię dobrze! Masz na myśli, że musimy używać jednego z 3 paradygmatów, ale MY nie wiemy .. a OOP to tylko większa organizacja?
Ahmed
Nie można programować bez nauki programowania strukturalnego imperatywnego lub programowania funkcjonalnego. Te dwa paradygmaty dotyczą robienia rzeczy. Z drugiej strony, OOP dotyczy modularyzacji programu, który pojawia się dopiero, gdy twój program osiągnie określony rozmiar. Chociaż zdecydowanie pojawia się w bibliotekach, których używasz podczas programowania przez cały czas, możesz mieć doskonale dobrą bibliotekę klas bez funkcji OO, takich jak dziedziczenie, na przykład biblioteki klas Haskell, LISP lub Standard ML.
Ken Bloom
4

Wszystko zależy od tego, jak przewidujesz zmiany.

Obie koncepcje nadają się do ponownego użycia, ale OOP otwiera drzwi do łatwiejszych zmian. Program OOP ma wszystkie możliwości wielokrotnego użytku, jakie oferuje programowanie strukturalne, ale można go również użyć do tworzenia nowych funkcji przy mniejszym wysiłku.

Można powiedzieć, że OOP dziedziczy całą funkcjonalność programowania strukturalnego z dodatkową funkcjonalnością dziedziczenia! :-RE

corsiKa
źródło
W tej chwili nie przepadam za dziedziczeniem.
4
Ja też nie jestem, ale to dlatego, że rząd wykręcił mojego dziadka z jego emerytury. Pod względem OOP dziedziczenie całkiem mi jednak służyło!
corsiKa
Z mojego doświadczenia wynika, że ​​w OOP najlepiej unikać dziedziczenia. Jak często budujesz nadklasę zamiast interfejsu? Preferuj kompozycję jako ogólną zasadę.
Janx,
1
@Janx: „Jak często budujesz nadklasę zamiast interfejsu?” Co? Nie „budujesz superklas”; bierzesz istniejące klasy i budujesz z nich podklasy i robisz to cały czas. Jeśli nie korzystasz z dziedziczenia, nie zyskujesz korzyści z podstawienia i polimorfizmu Liskowa, więc co robisz w programowaniu obiektowym? Kompozycja to inne narzędzie z innym przypadkiem użycia, a nie zamiennik dziedziczenia. Nie powinieneś „faworyzować” jednego nad drugim; powinieneś użyć obu, z których każdy jest użyteczny.
Mason Wheeler,
1
@Mason - warto zauważyć, że Barbara Liskov (z Liskov Substitution Principle) faktycznie powiedziała (długi film), że nie szczególnie lubi dziedziczenia.
Aidan Cully,
2

Pojęcia są ortogonalne. Programowanie strukturalne polega na tworzeniu kodu w ramach procedur / funkcji / metod. Podczas wykonywania OOP jest całkowicie możliwe (i pożądane) przestrzeganie zasad programowania strukturalnego w ramach metod klasowych.

Nemanja Trifunovic
źródło
1

To rodzaj subiektywnego sformułowania - programowanie strukturalne i OOP to style rozwiązywania problemów, a jedno nie zawsze jest lepsze od drugiego. Pisanie biblioteki metod numerycznych ma sens, jeśli jest wykonywane w stylu strukturalnym, w którym przeprowadzane są transformacje danych wejściowych. Jednak prosty agent obsługiwany przez maszynę stanu może być łatwo wyrażony jako samodzielna klasa w Javie lub C ++. OOP może być naturalnym sposobem wyrażania kontenerów pamięci dla struktur danych.

Mówienie o ukrywaniu informacji i modułowości jest dobrym sposobem na naturalną motywację OOP jako stylu.

Ciekawe podejście do tej kwestii napisał Steve Yegge - w pewnym sensie jeden z lepszych opisów różnic w podejściach między tymi dwoma stylami.

użytkownik18014
źródło
0

OOP jest łatwiejsze do zrozumienia, kiedy tworzysz model biznesowy. Kiedy myślisz o elementach aplikacji, używasz między nimi OBIEKTÓW i STOSUNKÓW, np. Książka ma Autorów, Tytuł, ISBN. Książka jest wynajmowana w Bibliotece i może być pożyczona przez Studenta. Programowanie strukturalne wymusza myślenie o konkretnych procesach, implementacjach nie w abstrakcji.

OOP jest przeznaczony do łatwych zmian. Zmiana w programie strukturalnym jest możliwa, ale musi być opisana kodem. Zmianę w programie OO można opisać abstrakcyjną zmianą modelu.


źródło
0

Zmienny zakres:

Myślę, że zasadą języków zapewniającą dobre programowanie jest ograniczenie zakresu zmiennych. W językach strukturalnych, takich jak C, zakres obejmuje głównie dwa typy -

  • Zakres globalny
  • Lokalny / funkcja / zakres metody

Wszyscy wiemy, że globalny zasięg jest szkodliwy. Ale czasem lokalne zakresy nie wystarczą do uruchomienia programu. Unikanie globalnych zasięgów ma wtedy szersze zastosowanie wskaźników, które umożliwiają stosowanie zmiennych poza zakresem. Ale wskaźniki są trudne do zrozumienia i użycia.

Języki OOP, takie jak C ++, dodają nowy typ zakresu - zakres klasy / obiektu poprzez enkapsulację. Ten zakres jest dodatkowo wzmacniany przez odmiany prywatne / publiczne. I to rozwiązuje wiele problemów związanych ze zmiennym określaniem zakresu. Zakresy są bardziej zdefiniowane w OOP. Wskaźniki są mniej potrzebne.

Jest to jedna z wielkich funkcji OOP.

Gulszan
źródło