Czym jest zorientowany obiektowo proces myślowy? [Zamknięte]

9

Przez ostatnie kilka miesięcy studiowałem OOP w połączeniu z implementacją Zend MVC. Ogólnie jestem całkiem nowy w programowaniu, ale zdecydowanie uważam, że powinienem uczyć się rzeczy „we właściwy sposób”, co dla mnie oznacza upewnienie się, że rozumiem, dlaczego rzeczy są wykonywane tak, jak są. Tzn. Odkryłem, że ucząc się, jak coś zrobić (cokolwiek, powiedzmy muzykę), najlepszym sposobem, aby dowiedzieć się, jak coś zrobić, jest wiedzieć, dlaczego tak się dzieje.

W każdym razie bardzo trudno mi było zrozumieć, jak opracować własne modele biznesowe (tj. M z MVC), i zdecydowałem, że to nie dlatego, że ogólnie nie rozumiem OOP, ponieważ studiowałem go przez kilka miesiące i nie sądzę, że koncepcje są bardzo trudne do zrozumienia. Przykłady, które studiowałem, są bardzo intuicyjne. Myślę, że problem polega na przełożeniu własnych problemów na rozwiązania obiektowe. Przykłady w książkach (które do tej pory przeczytałem) są zbyt oczywiste, więc proces tłumaczenia problemu na obiekty nie jest bardzo trudny. Wydaje mi się, że brakuje mi abstrakcyjnego procesu na wysokim poziomie. Jakaś lista kroków lub pytań, na które każde rozwiązanie obiektowe musi odpowiedzieć na najwyższym poziomie.

Gdybyś musiał opisać taki proces w nie więcej niż pięciu krokach, co by to było i dlaczego? Jaki jest najskuteczniejszy proces w tłumaczeniu dowolnego problemu na rozwiązanie obiektowe?

Inżynier świata
źródło
1
OOP nie zawsze to wszystko ...
Job
Czy podczas studiowania OOP czytałeś już coś o wzorach projektowych ?
Zoredache,
1
Polecam przeczytanie książki Erica Evana o projektowaniu opartym na domenie, gdy masz trudności z tworzeniem modeli. Zobacz także odpowiedź @ Simona Stellingsa. Książka dość szczegółowo omawia ten proces.
Falcon
@Zoredache Natknąłem się na koncepcję wzorców projektowych, a także kilka przykładów niektórych, takich jak singleton, fabryka i samo MVC (które w implementacji Zend jest również kontrolerem frontowym). Był to jednak mój następny ruch, że tak powiem. Wziąłem książkę Martina Fowlera na temat wzorców przedsiębiorczości i do tej pory przeczytałem tylko część wstępu. Czy poleciłbyś jasne, łatwe do odczytania wprowadzenie?
@ Falcon Miałem pytanie dotyczące php / MySQL i formatowania daty SO na drugi dzień i wybrałbym twoją odpowiedź, ale był to tylko komentarz, za ile jest wart.

Odpowiedzi:

10

Znalezienie odpowiedniego modelu nie zawsze jest proste. Jest to jedna z tych rzeczy, które wymagają więcej doświadczenia niż zwykłej wiedzy. Jednak następujący prosty przepis może pomóc ci pokonać początkowy blok mentalny.

Został pierwotnie opisany w tym artykule przez Abbott i jest często określany jako „analiza tekstowa Abbott”.

  1. Napisz specyfikację zwykłego tekstu.
  2. Zidentyfikuj klasy: Rzeczowniki są dobrymi kandydatami.
  3. Znajdź atrybuty: Przymiotniki / przysłówki są dobrymi kandydatami.
  4. Znajdź operacje: czasowniki są dobrymi kandydatami.
  5. Znajdź powiązania między klasami.
  6. Oczyścić.

Przykład:

Rzeczowniki , czasowniki i adjectivessą oznaczone.

Biblioteka zawiera książki i czasopisma . Może mieć kilka kopii danej książki . Niektóre książki są przeznaczone wyłącznie na short-term pożyczki . Wszystkie inne książki mogą być wypożyczane przez dowolnego członka biblioteki na trzy tygodnie. Członkowie biblioteki mogą zwykle pożyczyć do sześciu elementów jednocześnie, ale członkowie personelu mogą pożyczyć do 12 elementów jednocześnie. Tylko członkowie personelu mogą wypożyczać czasopisma .

Pierwsza iteracja analizy dałaby:

Klasy:

  • Biblioteka
  • Książka, dziennik
  • Kopiuj
  • Pożyczka
  • Członek biblioteki
  • Pozycja
  • Pracownik

Odtąd możesz zastanowić się, która klasa potrzebuje atrybutów i metod, aby wdrożyć zachowanie, a następnie udoskonalać ten model w coraz większym stopniu.

blubb
źródło
1
Dobra odpowiedź. Oprócz artykułu Abbotta polecam książkę Erica Evana na temat projektowania opartego na domenach . Uczy tworzenia wszechobecnego języka dla projektu i destylacji z niego potężnego modelu.
Falcon
Pociąga mnie ta odpowiedź, ponieważ trochę studiowałem językoznawstwo i ma ona dla mnie sens intuicyjny bez większego wysiłku, jednak obawiam się jej z tych samych powodów, ponieważ odkryłem, że zbyt duża analogia może doprowadzić mnie na manowce .
@Falcon +1 za polecenie książki z okładką Kandinsky'ego.
@ tbj1982: Masz absolutną rację. Jest to prosta heurystyka, dlatego należy o tym pamiętać. To nie jest złota kula, ale może być pomocnym starterem.
blubb
4

Moim zdaniem przyjęcie podejścia TDD jest naturalne i skuteczne:

  1. Zapisz szczegółowe wymagania (biorąc pod uwagę, kiedy, wtedy)
  2. Przetłumacz każde wymaganie (najważniejsze najpierw) na test jednostkowy.
  3. Napisz najmniejszą ilość kodu, aby zdać test napisany w punkcie 2.
  4. Po przejściu testu ponownie koduj kod zgodnie z zasadami projektowania SOLIDD.
  5. Po # 4 upewnij się, że kod nadal przechodzi wszystkie zapisane testy.
  6. Powtórz 2-5.

Dzięki temu procesowi możesz stopniowo wytwarzać testowalny kod z dźwiękiem. Na początku możesz pomyśleć, że test pisania jest niepotrzebny, ale ta aktywność faktycznie pomaga zbudować architekturę dźwięku.

Tae-Sung Shin
źródło
3

Oto kroki, których używam w kodzie c ++:

  1. zdecyduj nazwę klasy
  2. decydować parametry konstruktora i członków danych.
  3. decyduj o nazwach i prototypach funkcji składowych
  4. uniezależnić go od innych klas
  5. Projekt jest gotowy, a wszystko inne to tylko wdrożenie.

Powodem (1) jest to, że określa zakres tego, jaka funkcjonalność należy do klasy. Powodem (2) jest to, że określa, w jaki sposób klasa komunikuje się ze światem zewnętrznym. Powodem (3) jest to, że określa, jak wybrać, która funkcjonalność klasy jest potrzebna w każdej sytuacji. Powodem (4) jest to, że pozwala na użycie klasy w wielu różnych sytuacjach. Powodem (5) jest to, że określa granicę między projektowaniem a wdrożeniem.

tp1
źródło
+1 za nazewnictwo. To niesamowite, jak bardzo dodawanie nazw może organizować procesy myślowe, ponieważ w sposób dorozumiany przenosisz całą wiedzę o „prawdziwym świecie”.
Mark Brackett,