Jak można uczyć OO bez odwoływania się do fizycznych obiektów świata rzeczywistego? [Zamknięte]

14

Pamiętam, że czytałem gdzieś, że oryginalne koncepcje OO polegały na znalezieniu lepszej architektury do obsługi przesyłania danych między wieloma systemami w sposób, który chroniłby stan tych danych. Jest to prawdopodobnie kiepska parafraza, ale sprawiło, że zastanawiałem się, czy istnieje sposób uczenia OO bez analogii obiektów (Rower, Samochód, Osoba itp.), A zamiast tego koncentruje się na aspektach związanych z przesyłaniem wiadomości. Jeśli masz artykuły, linki, książki itp., Byłoby to pomocne.


źródło
6
Wierzę, że pochodzenie OO było w języku zaprojektowanym do symulacji , który był bardzo mocno osadzony w obiektach świata rzeczywistego. To nie znaczy, że OO nie jest przydatne w przypadku nierzeczywistych obiektów, ale niekoniecznie możesz spojrzeć na jego historię pod kątem oświetlenia.
Tom Anderson
7
Dlaczego podczas nauczania chciałbyś unikać znanych, zrozumiałych przedmiotów z realnego świata?
Adam Crossland,
1
To interesujące pytanie. Bez względu na to, czy OO jest zakorzenione w fizycznym, i czy dobrym pomysłem jest nauczanie OO w kategoriach świata fizycznego, czy nie, lepiej byłoby wiedzieć o produktywnym sposobie nauczania bez odniesienia do świata fizycznego.
Tom Anderson
3
Szczerze mówiąc, chciałbym zobaczyć jeszcze kilka przykładów używania obiektów do GUI i aplikacji internetowych (tak jak modele danych i widoki), ponieważ są to przecież mięso i ziemniaki rozwoju. „Rzeczywiste” obiekty to skorupa - przydatna, ale nie zawsze potrzebna do dobrego posiłku
HorusKol,
1
@HorusKol: Masz to dokładnie do tyłu. Podstawowym modelem domeny jest posiłek. To prawie zawsze koncentruje się na obiektach z prawdziwego świata. W przeciwnym razie, po co pisać oprogramowanie? GUI lub prezentacja internetowa to tylko talerz do serwowania. Co ciekawe, prezentacja wymaga tylu wysiłków. Być może mówi to coś o prymitywności narzędzi.
S.Lott,

Odpowiedzi:

4

Oryginalna koncepcja OO nie ma nic wspólnego z dzisiejszym OO. (Zobacz, co * miał * na myśli * Alan Kay naprawdę miał na myśli termin „obiektowy”? ). Dzisiejsze programowanie obiektowe JEST o tworzeniu obiektów takich jak metafory rowerów, domów i ludzi itp. Gorąco polecam trzymanie się ich, ponieważ celem tych metafor jest pomoc ludziom w zrozumieniu za pomocą koncepcji, którą już rozumieją. Pomóż im dostrzec korelację, a następnie pomóż im dostrzec różnice, Później zanurz się w głębsze rzeczy na temat OO.

EDYCJA: Dzisiejszy OO polega na tworzeniu w pełni samodzielnych obiektów, których właściwości i zdolności są w pełni / częściowo opisane przy użyciu różnych metod (funkcji) i atrybutów (odwołuje się do zmiennych i stałych AKA).

Kenneth
źródło
4

Możesz mówić o koncepcjach sprzężenia i spójności. Obiekty powinny składać się z atrybutów i metod o wysokiej kohezji i domyślnie wysokim sprzężeniu. Powinny one być odwzorowane na najmniej szczegółowe operacje i atrybuty potrzebne do działania systemu. Powinny również zaspokoić pragnienie, aby kod był jak najmniejszy i najprostszy, tj. Kodowanie z myślą o konserwacji i rozszerzalności.

Zapobiega to także „eksplozji obiektu”, nadmiernej uogólnieniu i błędnemu wyborowi metafory, które są powszechnymi błędami.

dietbuddha
źródło
1
Potrzebne jest +1 za faktyczne udzielenie odpowiedzi na pytanie zamiast odpowiedzi na analogię!
Steven Jeuris
1
Uważam też, że to jest właśnie istota OO. To wyjaśnia OO w pewnym sensie, jakie są jego zalety zamiast tego, jak wygląda. Dodaj możliwość ponownego użycia do listy i chciałbym jeszcze raz głosować za odpowiedzią. ; p
Steven Jeuris
2

Nie skupiałbym się na obiektach z prawdziwego świata i nie skupiałbym się również na przesyłaniu wiadomości. Zamiast tego użyłem przykładu w grafice, w której chcesz mieć obiekty, które „potrafią się rysować”.

Jeśli pracujesz na przykład w C, który nie ma wbudowanego OO, wygodne może być przechowywanie wskaźników do funkcji wewnątrz obiektów danych. Jeśli tak, to wkraczasz do OOP.

Nie lubię odnosić się do Alana Kaya, jakby był Mojżeszem, który podaje tablice. Uważam, że był raczej szkolony z matematyki i bio. Jako matematyk prawdopodobnie znał Lambda Calculus, który był dość abstrakcyjny, niezwiązany ze sprzętem. W LC można powiedzieć, że wszystko jest „obiektem” - podobnie jak liczba 0 i liczba 1 są obiektami, które oceniają różne rzeczy po podaniu argumentu. To całkiem ładnie prowadzi do Smalltalk. Idea „wiadomości” polega na tym, że możemy uniknąć rozmowy o sprzęcie. Można powiedzieć, że gdy wywołujesz funkcję (lub metodę obiektu), wysyłasz jej wiadomość, a gdy ona powraca, wysyła wiadomość do ciebie (lub do kontynuacji). Zostało to przyjęte jako sposób opisania sposobów komunikacji między programami działającymi asynchronicznie na osobnym sprzęcie. W porządku, ale w przypadku zwykłego programowania jest to porywające. Aby uzyskać wartość idei OOP, nie musisz zaprzeczać trafności konkretnego zadania, które próbujesz wykonać, ani zaprzeczać konkretności sprzętu, na którym pracujesz. Myślę, że nauczanie o OOP w kategoriach wymyślonych analogii prowadzi ludzi do zbytniego myślenia o projektowaniu oprogramowania w kategoriach struktury danych, co prowadzi do jego nadprojektowania, co prowadzi do rozdęcia kodu i ogromnych problemów z wydajnością, które muszę poświęcić na sprzątanie, kiedy robi się wystarczająco źle.

Mike Dunlavey
źródło
Jeśli przeczytasz dyskusję, do której się odniosłem, zobaczysz, że wskazano, że to, co Alan Kay nazywał OO, nie ma nic wspólnego ze współczesnym OO ... dlatego się do tego odniosłem.
Kenneth
@Kenneth: Oto link. Nie słyszę, by AK mówił, że chciał, aby jego pomysły były niczyją bibliją. Był to po prostu sprytny pomysł, który jego zdaniem był naprawdę dobry. W szczególności odnosi się on do PLANERA Hewitta (na którym zostałem całkowicie zindoktrynowany) jako ulepszenia. Są to dobre pomysły inteligentnych ludzi, które w żadnym wypadku nie powinny być uważane za świętych Graali, w porównaniu do których inne rzeczy należy uważać za niedoskonałe.
Mike Dunlavey,
@Mike Być może nadal nie rozumiesz, co mówię ... Odniosłem się do dyskusji, którą zrobiłem, aby wskazać, że jego oryginalne pomysły NIE DOTYCZĄ wiele współczesnego OO. Zdecydowanie nie czczę jego pomysłów ani nawet ich nie studiuję.
Kenneth
@Kenneth: Czuję się zamknięty w moich „gorących przyciskach”, na przykład kiedy słyszę, jak ludzie mówią o prawdziwym OOP lub co naprawdę znaczyła AK . Przepraszam.
Mike Dunlavey,
@Mike Alan Kay mówi, że czerpie wiele inspiracji ze szkolenia w dziedzinie mikrobiologii. W szczególności jego koncepcja przedmiotu była (i nie pamiętam, w którym z jego artykułów / przemówień on wspomina) oparta na komórce.
Frank Shearar,
1

Twierdziłbym, że nie ma różnicy w użyciu obiektu fizycznego na przykład i użyciu obiektu niefizycznego jako przykładu. W kodzie oba mają dokładnie te same części. Jeśli użyjemy przykładu graficznego i nauczymy go za pomocą Kuli, sześcianu, cylindra, będzie on prawie taki sam jak użycie kulki, pudełka i słupa.

Więc, aby uczyć tego bez użycia przykładów fizycznych, sugerowałbym, aby w ogóle nie używać żadnych przykładów, ale nie rozumiem, dlaczego nie chcielibyście przykładów fizycznych, więc moje stanowisko w tej sprawie brzmi:

Nie, nie powinieneś tego uczyć bez fizycznych obiektów świata rzeczywistego

Tim
źródło
1

Nie rozumiem, jak możesz uniknąć rozpoczynania od prawdziwych metafor, ale nie chcesz tam pozostać . Jeśli dobrze robisz OOP, szybko staje się ono abstrakcyjne, ale na następnym poziomie zrozumienia uczeń powinien rozumieć przedmioty jako obiekty.

użytkownik1936
źródło
1

Co ciekawe, niektóre z moich ulubionych przykładów nie są przedmiotami fizycznymi. Weźmy na przykład konto bankowe. Każdy „rozumie”, dlaczego depozyt () i wypłata () powinny pobierać opłatę za usługę, zamiast polegać na kodzie telefonicznym w celu zmiany wartości salda i pamiętać o zdjęciu opłaty za usługę. Kształty na ekranie są podwójnie niematerialne, a Stroustrup powiedział mi, że klasyczny przykład „Kształty” jest jednym z dwóch najstarszych przykładów OO, które zna, sprzed 40 lat (drugi to pojazdy, które mają teraz 44 lata).

Ważne jest, aby ludzie od razu zrozumieli twoje przykłady. Windy stanowią dobry przykład tylko dla osób, które są zaznajomione z windami. Itp.

Kate Gregory
źródło
1

Jeśli jesteś w grupie programistycznej, zbierz kilka osób i zacznij dyskutować, w jaki sposób powiedziałbyś sobie nawzajem, aby zrobili to, czego potrzebujesz od systemu. Dosłownie przyjmuj role w systemie (możesz to zrobić sam, po prostu grając każdą rolę, ale łatwiej jest z grupą ludzi. Zabawki pomagają, jeśli jesteś sam). Skoncentruj się na tym, co każda osoba robi / zrobi, a nie na tym, jakie dane ma. Robienie tego z ludźmi pomaga skupić się na wiadomościach i rolach, ponieważ ludzie zwykle pamiętają, co robią, ale nie dane, które mają.

Zwróć uwagę na to, co musisz sobie nawzajem zrobić i jakie informacje musisz to zrobić. Chroń swoje dane, jeśli inny programista poprosi o twoje dane, powiedz „nie” i zapytaj, dlaczego ich potrzebuje (pomaga w enkapsulacji danych).

Cormac Mulhall
źródło
Dodałbym również, że jest to dobry sposób, aby dowiedzieć się, czy masz obiekty, które są tylko kolekcjami danych, ponieważ skończysz z osobą, która dosłownie nie ma nic do roboty. Zastanów się zatem, gdzie są używane dane obiektów, i czy sensowniejsze byłoby, aby dane te znajdowały się w tych obiektach.
Cormac Mulhall
0

Myślę, że przydatne może być podejście oddolne / metalowe. Najpierw wyjaśnij struktury i wskaźniki w stylu C, aby pokazać, w jaki sposób można uporządkować dane, a nie tylko bezpośrednio używać prymitywów. Następnie wyjaśnij wskaźniki późnego wiązania i funkcji. Następnie wyjaśnij, że możesz ich użyć do budowy obiektów, które są właściwie dobrze zamkniętymi stertami danych i wskazują funkcje potrzebne do działania na tych danych.

Wyjaśnienie to jest sprzeczne z konwencjonalnym sposobem nauczania koncepcji matematyki / comp sci niezależnie od implementacji, ale to perspektywa sprawiła, że ​​(co prawda ktoś z inżynierią, a nie z wykształceniem inżynieryjnym) w końcu dostałem OO.

dsimcha
źródło