Jak mogę ćwiczyć lepsze programowanie obiektowe? [zamknięte]

Od lat zajmuję się programowaniem w językach obiektowych, ale z zazdrością patrzę na niektóre rzeczy, które robią moi koledzy. Wielu z nich wydaje się mieć jakiś wewnętrzny instynkt OO, którego ja nie mam - bez względu na to, jak bardzo się staram. Przeczytałem wszystkie dobre książki O OO, ale nadal nie mogę go złamać. Czuję się jak facet, który dał 110%, aby zostać zawodowym piłkarzem, ale po prostu nie miał naturalnego talentu, aby to zrobić. Jestem w rozsypce i myślę o zmianie kariery-co należy zrobić Ja?

 68
oop
Author: JB King, 0000-00-00

21 answers

Powiedziałbym, że mniej skupiam się na programowaniu OO, a bardziej na projektowaniu oo . Weź papier i ołówek (a może narzędzie do modelowania UML) i odejdź od ekranu.

Ćwicząc jak zaprojektować system, zaczniesz mieć naturalne wyczucie relacji z obiektami. Kod jest tylko produktem ubocznym projektu. Rysuj schematy i modeluj swoją aplikację w formie czysto pozakodowej. Jakie są relacje? W jaki sposób twoje modelki wchodzą w interakcje? Nawet nie myśl o kod.

Po spędzeniu czasu na projektowaniu... następnie przetłumacz go do kodu. Będziesz zaskoczony, jak szybko kod można napisać z dobrego projektu OO.

Po wielu praktykach projektowych zaczniesz widzieć wspólne obszary, które mogą być modularyzowane lub abstrakcyjne, a zobaczysz poprawę zarówno w projektach, jak i w kodzie.

 102
Author: zombat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:07:31

Najprostszym sposobem jest nauczenie się takich pojęć jak SOLID, DRY, FIT, DDD, TDD, MVC itp. Gdy spojrzysz w górę tych akronimów, doprowadzi cię to do wielu innych króliczych nor, a gdy skończysz czytać, powinieneś dobrze zrozumieć, czym jest lepsze programowanie obiektowe!

Solidne podcasty: http://www.hanselminutes.com/default.aspx?showID=168, http://www.hanselminutes.com/default.aspx?showID=163

SOLID breakdown: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Suche: http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

Dopasowanie: http://www.netwellness.org/question.cfm/38221.htm

DDD: http://dddcommunity.org/

DDD wymagany odczyt: http://www.infoq.com/minibooks/domain-driven-design-quickly

TDD: http://en.wikipedia.org/wiki/Test-driven_development

MVC: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

I tak, zakasanie rękawów i kodowanie to zawsze dobry pomysł. Zrób mały projekt w najlepszym ze swoich obecnych możliwości. Następnie przeczytaj artykuł z góry. Następnie refaktoruj kod, aby zaspokoić potrzeby tego, co właśnie przeczytałeś. Powtarzaj, dopóki nie zmienisz swojego kodu. Na koniec powinieneś nie tylko wiedzieć, o co chodzi w OO, ale powinieneś być w stanie wyjaśnić, dlaczego jest to ważne i jak żeby dostać je za pierwszym razem. Nauka refaktoryzacji jest kluczem do dobrego kodu. To, co jest teraz, nie jest jutro.

 36
Author: Andrew Siemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 08:49:49

W wielu dziedzinach jest "eureka" moment, w którym wszystko się łączy.

Pamiętam uczucie frustracji w geometrii liceum. Nie wiedziałem, które twierdzenie zastosować na każdym kroku dowodu. Ale trzymałem się tego. Szczegółowo zbadałem każde twierdzenie i zbadałem, w jaki sposób stosuje się je w różnych przykładach dowodów. Ponieważ rozumiałem nie tylko definicję każdego twierdzenia, ale jak go używać, zbudowałem "zestaw narzędzi" znanych mi technik, które mogłem wyciągnąć jako potrzebne.

Myślę, że to samo jest w programowaniu. Dlatego algorytmy, struktury danych i wzorce projektowe są badane i analizowane. Nie wystarczy przeczytać książki i uzyskać abstrakcyjną definicję techniki. Musisz też zobaczyć to w akcji.

Więc spróbuj przeczytać więcej kodu , oprócz ćwiczeń pisania go samodzielnie. To jedno piękno open source, możesz pobrać dużo kodu do nauki. Nie cały ten kod jest dobry, ale studiowanie złego kodu może być tak samo edukacyjny jako studiowanie dobrego kodu.

 12
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:17:34

Moja propozycja to nauczenie się czegoś innego.

Naucz się programowania funkcyjnego i zastosuj to, czego się z tego nauczysz do OOP. Jeśli znasz C++, pobaw się programowaniem generycznym.

Ucz się języków nieobiektowych.

Nie tylko dlatego, że powinieneś używać wszystkich tych rzeczy (powinieneś), lub dlatego, że powinny one całkowicie zastąpić OOP( prawdopodobnie nie powinny), ale dlatego, że możesz zastosować lekcje z nich również do OOP.

Sekret do OOP jest to, że nie zawsze ma sens używać go . Nie wszystko jest klasą. Nie każdy związek lub zachowanie powinny być modelowane jako klasa.

Ślepa próba zastosowania OOP, lub dążenie do napisania najlepszego kodu OOP prowadzi do ogromnych przesadnych bałaganów z zbyt wieloma poziomami abstrakcji i indirection i bardzo małą elastycznością.

Nie próbuj pisać dobrego kodu OOP. Spróbuj napisać dobry kod. I używać OOP, gdy przyczynia się do tego Gol.

 12
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:18:32

Zbyt wiele osób myśli o kodowaniu najpierw, obiekty, ostatni.

Możesz czytać wszystkie książki, które chcesz, ale to nie nauczy Cię, jak myśleć obiektowo-to wymaga praktyki i pewnej metodologii.

  1. Oto kilka metod, które mają pomógł mi: Kiedy jesteś z dala od pracy i otwartości można ćwicz, patrząc na wszystko jak na przedmiot . Nie patrz na to. obiekty i ciekawe jak ci idzie aby je zaprogramować, spójrz na oni jako tylko właściwości i funkcje oraz jak się odnoszą lub dziedziczą po każdym inne. Na przykład, gdy widzisz osoby, są przedmiotem i dlatego reprezentowałby klasę. Mają właściwości takie jak włosy kolor, odcień skóry, wysokość itp. Oni wykonuj również pewne funkcje. Oni spacer, rozmowa, sen itp. Niektóre z funkcje, które ci ludzie wykonują wyniki. Na przykład ich praca funkcja zwraca kwotę w dolarach. Możesz to zrobić ze wszystkim, co chcesz zobacz, bo wszystko jest obiekt. Rower, Samochód, Gwiazda itp.

  2. Przed zakodowaniem projektu, Zaprojektuj go przez korzystanie z notatek post-it I Suchościeralnego Zarząd.To będzie dobra praktyka dopóki tego nie zrozumiesz. Pomyśl o swoim konkretnym obiekt / funkcja / właściwość. Każdy z te przedmioty będą miały swój własny kartka pocztowa. Umieść je jako hierarchia na tablicy suchościeralnej. W w tym względzie, funkcja / właściwości zostaną umieszczone pod obiektem. Jeśli masz inny obiekt, zrób to samo za to. Więc zapytaj siebie, do każdy z tych postów notuje (obiekty / funkcje/właściwości) odnosić się do siebie. Jeśli dwa obiekty użyj tej samej funkcji, Utwórz obiekt nadrzędny (notatka post-it) I put nad innymi z funkcja wielokrotnego użytku pod nowym Uwaga. Narysuj linię za pomocą marker suchościeralny od dwójki dzieci obiekty do rodzica.

  3. Kiedy to wszystko się skończy, martw się. o tym, w jaki sposób Klasa działa.

 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-21 18:10:30

Naucz się innego języka! Większość programistów używających tylko Javy (tylko jako przykład) ma ograniczone rozumienie OO, ponieważ nie mogą oddzielić funkcji i pojęć językowych. Jeśli jeszcze tego nie wiesz, zajrzyj do Pythona. Jeśli znasz Pythona, naucz się Ruby. Lub wybierz jeden z języków funkcyjnych.

 9
Author: Achim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:09:03

Aswer jest w twoim pytaniu;)

Praktyka, praktyka, praktyka.

Przejrzyj własny kod i ucz się na błędach.

 7
Author: Neil N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:05:42

TDD pomógł mi najbardziej w poprawie ogólnego zestawu umiejętności, w tym OOP.

 5
Author: jamesaharvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 20:03:32

Im więcej kodu napiszesz, tym bardziej zauważysz pułapki pewnych praktyk programistycznych. Po wystarczająco dużo czasu, i wystarczająco dużo kodu, będzie w stanie zidentyfikować znaki ostrzegawcze tych pułapek i być w stanie ich uniknąć. Czasami, kiedy piszę kod, dostanę ten swędzenie z tyłu mojego umysłu, mówiąc mi, że może być lepszy sposób, aby to zrobić, nawet jeśli robi to, czego potrzebuję. Jedną z moich największych słabości programistycznych jest "przecenianie" rzeczy tak bardzo, że zaczyna znacznie spowolnić czas rozwoju. Staram się zapobiegać tym "swędzeniom", spędzając trochę więcej czasu na projektowaniu, co zwykle skutkuje dużo mniejszą ilością czasu na pisanie kodu.

...potajemnie patrzę na niektóre rzeczy, które robią moi koledzy z zazdrością. Wielu z nich wydaje się mieć jakiś wewnętrzny instynkt OO, którego ja nie mam - bez względu na to, jak bardzo się staram...

Myślę, że odpowiedziałeś tutaj na swoje pytanie. Czytanie dobrego kodu to dobry początek, a zrozumienie dobrego kodu to nawet lepiej, ale zrozumienie kroków, aby dostać się do tego dobrego kodu jest najlepsze. Kiedy zobaczysz jakiś kod, którego zazdrościsz, może zapytasz autora, w jaki sposób doszedł do takiego rozwiązania. Jest to całkowicie zależne od Twojego środowiska pracy, a także od relacji z kolegami. W każdym razie, jeśli ktoś zapyta mnie o proces myślowy za każdym kodem, który piszę, nie waham się im powiedzieć, ponieważ Wiem, że chciałbym, aby zrobili to samo dla mnie.

 4
Author: SuperSized,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 21:27:51

Projektanci języków interpretowali "Programowanie obiektowe" na różne sposoby. Na przykład, zobacz jak Alan Kay, człowiek, który po raz pierwszy użył terminu OOP, zdefiniował go:

OOP dla mnie oznacza tylko wiadomości, lokalne przechowywanie i Ochrona oraz ukrywanie stan-proces, a skrajne późne wiązanie wszystkich rzeczy. Może być zrobione w Smalltalku i w Lispie. Tam są ewentualnie inne systemy, w których jest to możliwe, ale nie jestem świadomy oni.

(cytat z http://userpage.fu-berlin.de / ~ ram / pub / pub_jf47ht81Ht / doc_kay_oop_pl).

Może wydawać się dziwne, że nie bierze pod uwagę języków Java i C++ OOP! Ale jako projektant jednego z pierwszych i najlepszych języków OOP (Smalltalk) ma swoje własne uzasadnione powody. Dlaczego Alan Kay uważał Lisp za język zorientowany obiektowo, a nie Javę? To pytanie wymaga poważnego rozważenia przez każdego, kto twierdzi, że rozumie OOP.

Erlang ma zupełnie inny implementacja OOP, schemat ma inny. Warto rozważyć wszystkie te alternatywne poglądy. Jeśli to możliwe, naucz się wszystkich tych języków! To da ci szerszą perspektywę, umieść kilka nowych i potężnych narzędzi w dłoni i uczyni cię lepszym programistą.

Podsumowałem moje eksperymenty z implementacją języka OOP, bazując na pomysłach zapożyczonych z Smalltalk, Scheme i Erlang w tym artykule.

 4
Author: Vijay Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 04:00:45
       public void MasteryOfOOP() 
    { 
       while(true)

        /* My suggestion is: */
     DO: find a lot of well-written object oriented code and read it.  Then 
try to use the insights from it on your own coding.  Then do it again.  Then 
have a colleague who is a good OOP look at it and comment. Maybe post a chunk 
of your code on SO and ask for how it could be improved.

        Then read some more of those books.  Maybe they make a little more 
sense now...?

        Now go back to the top of this post, and do it again. 

        Repeat Forever.

        }
    }
 4
Author: Alex Baranosky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-08 09:29:06

Jeśli nie wiesz, jak projektować systemy obiektowe, zacznij od danych. Dowiedz się, jakie rzeczy musisz śledzić i jakie informacje naturalnie idą w parze(na przykład wszystkie specyfikacje modelu samochodu ładnie się łączą).

Każda z tych rzeczy, które zdecydujesz się śledzić, staje się klasą.

Wtedy, gdy trzeba umieć wykonywać określone czynności (np. oznaczanie modelu samochodu jako wycofanego z eksploatacji) lub zadawać konkretne pytania (dla przykład, pytając ile z danego modelu samochodu zostało sprzedanych w danym roku), ładujesz tę funkcjonalność na klasę, z którą współdziała najbardziej.

Ogólnie rzecz biorąc, zawsze powinno być całkiem naturalne miejsce dla danego bitu kodu, aby żyć w Twojej strukturze klasowej. Jeśli nie ma, to sygnalizuje, że jest miejsce, w którym trzeba zbudować konstrukcję.

 3
Author: chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:10:40

Jest zbyt wiele informacji o obiektach. Najważniejsze jest opanowanie podstaw, a wszystko łatwiej układa się na swoim miejscu.

Oto sposób myślenia o przedmiotach. Pomyśl o strukturach danych w językach proceduralnych. Są grupą pól bez zachowania. Pomyśl o funkcjach, które otrzymują wskaźniki do tych struktur danych i manipulują tymi ostatnimi. Teraz, zamiast rozdzielać je, zdefiniuj funkcje wewnątrz definicji struktur i Załóżmy, że funkcje zwykle otrzymują wskaźnik do struktury danych do manipulowania. Ten wskaźnik nazywa się tak. Podsumowując, pomyśl o obiektach jako o kombinacji statusu (danych) i zachowania (metod - wymyślna nazwa funkcji w OOP).

To jest absolutna podstawa. Są jeszcze trzy pojęcia, które musisz bezwzględnie opanować:

Dziedziczenie-chodzi o ponowne użycie kodu.

Enkapsulacja - chodzi o ukrywanie implementacji przed interfejsem. Po prostu, wszystko powinno być prywatne, dopóki nie udowodni się inaczej.

Polimorfizm - nie ma znaczenia typ zmiennej referencyjnej, ale Typ rzeczywistej instancji, aby wiedzieć, które zachowanie (metoda) jest wywoływane. Java nie ułatwia tego pojęcia, ponieważ z definicji wszystko jest polimorficzne. . Net ułatwia zrozumienie, gdy decydujesz, co jest polimorficzne, a co nie, zauważając różnicę w zachowaniu. Osiąga się to poprzez połączenie wirtualne i nadpisane.

Jeśli te pojęcia są bardzo dobrze zrozumiane, będzie dobrze.

Ostatnia wskazówka: wspominasz o najlepszych książkach. Czytałeś" Thinking in Java "Bruce' a Eckela? Polecam tę książkę nawet osobom, które zaczynają w. Net, ponieważ koncepcje OOP są jasno określone.

 3
Author: Rui Craveiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 15:23:32

Stań się bardziej zwinny, poznaj junit testing i dowiedz się o Domain Driven Design. Proponuję książkę Domain-Driven Design: Contracting Complexity in the Heart of Software, chociaż w niektórych momentach jest to trochę trudne.

 2
Author: cherouvim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:06:48

Umiejętności OOP przychodzą z czasem. Odczyt 1, 2 ...10 książek nie wystarczy. Poćwicz pisanie kodu. Jeśli pracujesz w środowisku programistycznym...to może być pomocne. Jeśli nie spróbujesz się do niego dostać. Oferta opracowania niektórych aplikacji za darmo. Musisz ubrudzić sobie ręce. Remember...no aplikacja jest idealna od podstaw.Dlatego jest re-factoring.

Również...nie daj się ponieść OOP much...it z czasem. Martwić się o rozwój w pełni aplikacje funkcjonalne.

 2
Author: Saif Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:19:54

Spróbuj programowania w Self , jednym z najczystszych języków OO. Tak czysty, że nawet nie ma klas, tylko obiekty. Nie ma również zmiennych, pól, statyki, atrybutów, tylko metody. Interesujący jest również fakt, że każdy obiekt w systemie jest również obiektem na ekranie i vice-versa.

Niektóre z ciekawych artykułów o sobie są prototypowa Budowa aplikacji z wykorzystaniem własnej 4.0 (samouczek), ja: Siła prostoty oraz organizowanie programów bez zajęć. Również, Self: The Video (Randall B. Smith; Dave Ungar) to wspaniałe, że dwóch projektantów języka tłumaczy swoje pomysły.

To działa w prawie każdym pojęciu, właściwie, przynajmniej dla mnie: znajdź język, który najbardziej czysto uosabia pojęcie, o którym chcesz się dowiedzieć i po prostu go użyj.

 2
Author: Jörg W Mittag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 19:45:29

OO W końcu kliknął na mnie po tym, jak próbowałem zaprogramować program podobny do banku, który obsługiwał transakcje, obliczał odsetki i śledził wszystko. Zrobiłem to, gdy uczyłem się Javy. Sugerowałbym po prostu wypróbowanie go, ukończenie go, a potem, gdy skończysz, spójrz na dobre rozwiązanie i zobacz, co mogłeś zrobić lepiej.

 2
Author: Joe Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 04:03:47

Myślę również, że umiejętności OOP wzmacniają się głównie z praktyką. Zastanów się nad zmianą firmy, jeśli jesteś tam od ponad 3 lat. Z pewnością nie jest to ważne dla wszystkich miejsc pracy, ale często człowiek przyzwyczaja się do projektów i praktyk w firmie i przestaje się rozwijać w miarę upływu czasu.

 2
Author: Vladimir Grigorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 15:05:42

Sam powiedziałeś odpowiedź: ćwicz. Najlepszym rozwiązaniem jest opracowanie gry. Wykorzystaj pojęcia, których nauczyłeś się w książkach.

 1
Author: aviraldg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:07:39

Czy czytałeś rozdział o OO z pierwszego wydania książki Scotta Meyersa " efektywne C++"? Nie dotarło to do późniejszych wydań, ale było świetnym wyjaśnieniem. Tytuł brzmiał w zasadzie "say what you mean, mean what you say" o odpowiednich konwencjach.

Właściwie, może chciałbyś zobaczyć moją odpowiedź na podobne pytanie w tutaj .

HTH

Pozdrawiam,

 1
Author: Rob Wells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:17

Podwiń rękawy i Szyfruj!

 0
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 18:03:24