Programowanie Obiektowe

Programowanie Obiektowe
KR
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:4
0

Hej, potrzebuje Was, aby wskoczyć na właściwą ścieżkę...
Do tej pory wszystko robiłem proceduralnie, ale ostatnio przyswoiłem sobie podstawy obiektów.
Wiecie jak jest z podstawami - tworzy się kota, który potrafi jeść, pić i chodzić...

Natomiast tworzę sobie we własnym zakresie pewną aplikację, obecnie jestem na etapie implementacji systemu odznak.
Użytkownik może dostać odznakę za np. utworzenie konta jako jeden z pierwszych, napisanie X komentarzy itd.
Chciałbym - w ramach nauki - zastosować OOP. Ale za nic nie wiem jak do tego podejść.

Pomóżcie mi proszę, wyjaśnijcie w czym OOP okaże się bardziej skuteczne od napisania kilku prostych funkcji, które będą odpowiedzialne za przyznanie odznaki użytkownikowi, pobranie wszystkich odznak użytkownika itd.

Nie proszę o gotowe rozwiązania, ale o nakierowanie.
Niestety, nie widzę związku między stworzeniem kota czy psa, a moim problemem.

Dzięki!

V-2
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:671
1

W przypadku prostej aplikacji nie jest wcale powiedziane, że OOP koniecznie musi być lepsze.

Programowanie obiektowe to nie jest jakiś święty Graal i cel sam w sobie, że jego użycie z automatu uszlachetnia każdy projekt ;) Ma ono również swój koszt - chociażby taki, że przeważnie wymaga większej ilości kodu (tzw. boilerplate). Nie brak ludzi krytycznie nastawionych wobec programowania obiektowego i atakujących je z rozmaitych pozycji.

Na pewno jednym z atutów jest to, że programując obiektowo izolujesz od siebie różne komponenty. To bardzo pomaga w pisaniu np. testów jednostkowych. Jeśli twój użytkownik jest obiektem "User", możesz łatwo (na potrzeby testu) sfingować fałszywego użytkownika, tworząc go - że tak powiem obrazowo - w probówce, i sprawdzić na nim działanie logiki. Oto np. użytkownik który ma 99 komentarzy, i test sprawdza, co się stanie, gdy dojdzie kolejny.

Gdyby projekt składał się wyłącznie z funkcji grzebiących w bazie danych naprawdę, zasymulowanie takiego scenariusza (i czyszczenie po nim!) byłoby bardziej kłopotliwe.

Drugim atutem jest lepsze posegregowanie kodu. Wiadomo z góry, że kodu związanego z użytkownikiem trzeba będzie szukać w jego klasie, a nie włócząc się po wszystkich możliwych plikach. Oczywiście użycie obiektów samo w sobie tego nie gwarantuje. Aby ten atut się zrealizował, trzeba przestrzegać różnych zasad, jak SRP czy prawo Demeter itd.

Zgadzam się i zawsze mówię, że uczenie dziedziczenia na bazie durnych przykładów z kaczką itp. jest głupotą, która nic początkującym nie wyjaśnia. Amatorom tego podejścia wydaje się, że jak przykład będzie infantylny, to siłą rzeczy będzie zrozumiały, a to bzdura.


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem, ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia. W drugiej firmie której już pracuję mam palących marihuanę programistów [...] piszą kod "leniwie", często nie wysilając się, rozwlekając ten kod, unikając np. programowania funkcyjnego (mówię tutaj o lambdach w javie).
edytowany 2x, ostatnio: V-2
KR
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:4
0

Dzięki za odpowiedź.
Masz rację. I ja to wszystko doskonale rozumiem. Nie twierdzę, że akurat pochylając się nad tym zagadnieniem (system odznak użytkowników) lepiej będzie skorzystać z OOP.
Nie.
Mimo wszystko postawiłem sobie za cel, że spróbuję to wykonać właśnie w ten sposób.

Nawet nie wiem od czego zacząć.
Dla mnie to wszystko można oprzeć o utworzenie jednej klasy, która będzie zawierać kilka metod (m.in. award_badge($badge_id, $user_id), remove_badge($badge_id, $user_id), get_user_badges($user_id)...).
Czy to właściwy trop?

V-2
Zauważ, że już w tym przykładzie z linka (choć tego nie komentują), zrobili InMemoryRepository, czyli wersję tego obiektu, która trzyma dane wyłącznie w pamięci, w jakichś kolekcjach. Ma to związek z pierwszym atutem o którym napisałem, czyli możliwością prostego testowania. Na potrzeby napisania testów zamiast obiektu Repository który naprawdę zapisuje dane do bazy, podstawiasz taki InMemoryRepository i masz szybkie i łatwe testy, po których nie trzeba nic sprzątać, bo wraz z instancją InMemoryRepository ulotnią się także natychmiast wszystkie zapisane w niej dane.
KR
Dziękuje Ci za pomoc. Doceniam to.
Sławomir Własik
  • Rejestracja:około 9 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Kostrzyn nad Odrą
  • Postów:27
0

Moim zdaniem warto zawsze oprzeć się o programowanie obiektowe. Nie widzę sensu tego unikać.
Wprawdzie ja uczyłem się programowania obiektowego już 19 lat temu :) na studiach ale myślę, że teraz też mogę Ci polecić, jak ją gdzieś wykopiesz, Symfonię C++ Grębosza. Wiem, że to C++ ale ta książka jest tak napisana, że naprawdę trzeba by było być jełopem aby nie zrozumieć najważniejszych rzeczy z programowania obiektowego. Pamiętam, że bez problemu przeskoczyłem na obiektowe w PHP choć wtedy to dopiero wchodził PHP 4 i to obiektowe było w sumie bardzo umowne i ułomne i problematyczne. Jednak myślę, że to najlepsza książka na początek. Zwłaszcza teraz gdy mamy PHP 7. Nie jest to książka w stylu "w 24h" czy "dla opornych" ale czyta się lekko, przykłady są świetne, analogie obrazowe. Warto.

pozdro
Sławek

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8409
1

Pomóżcie mi proszę, wyjaśnijcie w czym OOP okaże się bardziej skuteczne od napisania kilku prostych funkcji,
które będą odpowiedzialne za przyznanie odznaki użytkownikowi, pobranie wszystkich odznak użytkownika itd.

W niczym, w zasadzie zarówno OOP jak i programowanie proceduralne można napisać dobrze, albo spieprzyć. Równie dobrze możesz na siłę pchać jakieś obiekty, a możesz zrobić to proceduralnie i nie będzie to gorsze. Pod warunkiem, że napiszesz to proceduralnie w sposób dobry (zarazem elastyczny, ale i niezbyt skomplikowany, dający się łatwo zmienić w przyszłości, ale nie wymagający zbytniej konfiguracji itp. -- można to sprowadzić do paru prostych akronimów typu SOLID czy DRY albo KISS - chociaż też nie należy brać tych akronimów jak dogmat. To są tylko wskazówki jak ładnie pisać). Więc to nie kwestia paradygmatu (OOP, proceduralny, funkcyjny itp.) a raczej ogólnej jakości kodu.

Z drugiej strony nic nie stoi na przeszkodzie, żeby to zrobić obiektowo.

Chciałbym - w ramach nauki - zastosować OOP. Ale za nic nie wiem jak do tego podejść.

Wskazówka. Jak masz rzeczownik, to często się to przekłada bezpośrednio na obiekt, jak masz czasownik to na metodę.

Użytkownik może dostać odznakę za np. utworzenie konta jako jeden z pierwszych, napisanie X komentarzy itd.

Chciałbym - w ramach nauki - zastosować OOP. Ale za nic nie wiem jak do tego podejść.

Tu już masz obiekty w zasadzie. Użytkownik to obiekt, "pisz" to metoda, "komentarz" to jakiś inny obiekt (metoda "pisz" operuje na tych obiektach-komentarzach itp.).

Oczywiście, czasem takie podejście będzie zbyt naiwne, jednak myślę, że to dobry punkt startowy. W końcu już de facto masz (w wyobraźni) jakieś obiekty typu użytkownik, konto, komentarz. Nie zawsze się to można przełożyć 1:1 na kod (czasem potrzeba w kodzie dodatkowych abstrakcji, albo odwrotnie - jakichś uproszczeń), jednak obiektówka miała chyba w założeniu odzwierciedlać rzeczywistość (stąd te pszczółki i kotki w podręcznikach).

Druga wskazówka - warto rysować na papierze kwadraty(reprezentujące poszczególne obiekty) i łączyć je strzałkami. To pomaga zwizualizować sobie co właściwie te obiekty robią, w jaki sposób są połączone.


edytowany 2x, ostatnio: LukeJL
kchteam
Nic dodać, nic ująć :)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)