W przypadku jakich problemów programowanie obiektowe nie jest dobrym wyborem? [Zamknięte]

19

Nieco inspirowane przez to pytanie: Na co wspólne problemów jest programowanie funkcyjne nie dobrym rozwiązaniem? - niemniej jednak pytanie, które zawsze chciałem, ale był zbyt boi się zapytać.

Byłem w ... no, nazwijmy to inżynieria rozwoju oprogramowania praktycznie całe moje życie, a przez cały ten czas, choć OO zawsze był tam (dobrze, większość tego czasu) Nigdy nie miałem potrzeby korzystania „swoje sposoby”, ani się uczyć tego paradygmatu. Zawsze używaliśmy raczej prostych struktur programów, procedur / funkcji / modułów i chociaż jest to przeciwne do dzisiejszych najlepszych praktyk zarządzania tymi programami (programy do około 300 000 LOC, nic zbyt dużego) nigdy nie okazały się trudne, a tym bardziej niemożliwe.

Chciałem więc zapytać, jakie byłyby problemy, dla których paradygmat obiektowy nie byłby dobrym wyborem? W porównaniu do programowania proceduralnego?

Wieża
źródło
Zobacz także stackoverflow.com/questions/178262/... .
S.Lott,

Odpowiedzi:

8

Programowanie obiektowe jest programowanie proceduralne. Tym, co sprawia, że obiekt OO zorientowana jest, jak Robert Harvey wspomina w komentarzu, że OO abstrahuje dane w sposób szczególny (słownie: łączenie funkcji, które działają na konstrukcji z tej struktury).

William Cook ładnie wyjaśnia różnicę między obiektami a abstrakcyjnymi typami danych.

Więc na ryzyko brzmiące Facile, powiedziałbym, że obiekty nie są dobrym rozwiązaniem, gdy trzeba łatwo rozszerzyć (liczba), które wykonują operacje na danych, i nie trzeba mieć różne implementacje swoje dane. To powiedziawszy, są rzeczy, które możesz zrobić, aby zbliżyć je do siebie.

Frank Shearar
źródło
5

Główną wartością OO jest to, że zapewnia odsprzęganie pomiędzy komponentami twojego systemu, ułatwiając pisanie kodu DRY i dostosowując się do określonych rodzajów zmian, które planujesz w swoim projekcie. Koszt jest to, że dodaje warstw zadnie, które może sprawić, że trudniej jest kod przyczyny o mniej efektywny i trudniejszy do modyfikacji w nieprzewidzianych sposobów (sposoby, które nie są wspomagane przez oddzielenie projektowania zapewnia). Jest to więc strata czasu dla każdego subproblem gdzie nie trzeba oddzielenie zapewnia. W szczególności strata czasu polega na tym, że można łatwo napisać kod DRY bez niego i nie przewidywać żadnych konkretnych zmian wymagań, które skorzystałyby na silnym odsprzężeniu zapewnianym przez OO.

dsimcha
źródło
3
Oddzielenie jest miłym efektem ubocznym programowaniu obiektowym dobrze, ale chciałbym powiedzieć, że podstawową zaletą programowania oo jest hermetyzacja organizacyjną funkcjonalności.
Robert Harvey
1
@Robert Harvey: Mam inny punkt widzenia tej samej rzeczywistości: dla mnie enkapsulacji organizacyjną funkcjonalność jest środkiem uzyskania oddzielenia, co z kolei umożliwia ponownego użycia.
mouviciel
@Robert Harvey: Sprzęgło i spójność są dwa sposoby patrzenia na gruncie rzeczy to samo, co jest swego rodzaju miejscowości, gdzie można coś zrozumieć bez konieczności zrozumieć zbyt wiele innego.
David Thornley
Myślę, że część sporu polega na tym, że IMHO przy użyciu OO oznacza, że ​​używasz polimorfizmu i dziedziczenia, przynajmniej interfejsów, w szerokim zakresie. Przez moją definicję oo, na przykład C # lub D elemencie lub przy użyciu tylko wersja ostateczna / klas zapieczętowanych i nie Interfejs byłoby uznane tylko lukrem składniowym oraz kilka atrybutów kontroli dostępu, a nie prawdziwy OO.
dsimcha
3

współbieżności: mechanizm blokujący wydaje rodzaju problematyczne; tylko kilka bardzo dobrych programistów są wprowadzane do pracy na część gwintowania projektów

rozszerzenie: nie wiem jak EXTANDABLE obecne są w językach OO. wiedz tylko, że Java jest zła. nich DSL (specyficzne dla domeny języków) muszą być realizowane jako Ram. Clojure z drugiej strony (która jest funkcjonalna), posiada makra.

Belun
źródło
+1 za argument blokujący - wydaje się, że logika blokowania na obiektach zmiennych staje się niemożliwie skomplikowana poza pewnym punktem w językach OO
mikera
+1 dla wspomnieć współbieżności. Koncepcja podobna do obiektów, ale współbieżności nośnej jest to, że aktor. Aktorzy są podmioty jednoczesnych które komunikują poprzez wymianę komunikatów asynchronicznych.
Giorgio
Ditto na współbieżności; Zrobiłem stwierdzenie, że OO, zachęcając was do identyfikacji / utrzymanie odrębnych jednostek stanie , rzeczywiście zachęca do problemów współbieżności.
user1172763
0

Większość programistów, OO wiedzą lub nie zastosował pojęcia jak abstrakcji, ukrywania informacji i interfejsów w ich kodzie. Języki OO po prostu sprawia, że ​​łatwiej, ponieważ te pojęcia są już wbudowane. Nie trzeba im wymyślać samemu.

Algorytm rdzenia, taki jak, qsort()wykorzystuje abstrakcje do porównywania dowolnych obiektów. fread()używa interfejsu do wyodrębnienia szczegółów strumienia itp.

Z tego punktu widzenia trudno mi wymyślić żadnego konkretnego problemu, które są lepiej rozwiązany z podejściem non-OO.

Martin Wickman
źródło
0

Myślę, że budując systemy łączące inne systemy za pomocą api internetowej (reszta, xmlprc, zwykły curl / wget), możesz pisać opakowania OO, ale jest to po prostu wygoda. Jeśli serwis internetowy ma być używany, proste, i to tylko kwestia jednego lub dwóch linii, a następnie OO jest zbyt wiele. Z drugiej strony, jeśli skończysz z owijaniem skomplikowanego interfejsu API (np. Amazon AWS), dobrze jest mieć bibliotekę opakowań (jak boto w python dla AWS).

Myśli?

Christopher Mahan
źródło
0

Czystej językach obiektowych nie nadają się do wielu spraw. Ponieważ istnieją kryteria, które należy spełnić, aby być czysto obiektowym językiem. Zobacz-
/programming/250062/what-is-meant-by-the-term-true-object-orientation/250098#250098

Ale najczęściej używanymi językami programowania są paradygmaty. Zawierają wiele funkcji innych niż OO, aby napotkać różne rodzaje problemów związanych z programowaniem i programowaniem. C ++, C #, Java lub Ruby mają funkcje inne niż OO. Mogą więc zmierzyć się z problemami, w których czysty OO nie jest dobry.

Gulszan
źródło
0

Programowanie obiektowe może służyć do modelowania domeny. Klasy mogą służyć do reprezentowania stanu i zachowania encji, agregatów, współpracy, usług w ramach modelu domeny. Ponadto wywołania metod i protokoły między obiektami mogą modelować dynamiczne relacje między jednostkami.

I okazało się, że użytecznym sposobem wytwarzania model DRY, który może czysto reprezentowania zasady i zachowania aplikacji w sposób, który jest oddzielony od zagadnień technicznych (takich jak korzystanie z bazy danych, albo kolejki komunikatów, albo fakt, że jest to aplikacja internetowa). Dobra książka na ten temat to Projektowanie oparte na domenie

Ważną rzeczą do odnotowania tutaj jest to, że „istoty”, o których wspomniałem powyżej, nie muszą mapować obiektów rzeczywistych! Mogą reprezentować abstrakcyjne części domeny Twojej aplikacji.

Więc jeśli w tym jest dobre programowanie obiektowe; w czym nie jest dobry? Cokolwiek, gdzie model domeny nie może być dobrze wyrażony jako obiekty. Na przykład niektóre programy matematyczne (statystyczne, logiczne itp.) Lub techniczne (np. Kompilator) są wyraźniejsze w różnych stylach. I odkryli, że dla aplikacji Business Workflow kombinacja technik oo oraz zwyczaj DSL były bardzo skuteczne w pozwalając nam modelować rodzaje relacji i zdarzeń występujących w procesie biznesowym. Do weryfikacji programu i zautomatyzowanego sprawdzania dowodu często stosuje się podejście funkcjonalne , ponieważ jego czyste funkcje umożliwiają bardziej bezpośrednie rozumowanie matematyczne.

Flamingpenguin
źródło