Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Interfejs i klasa abstrakcyjna
daniel1302
post 30.11.2011, 16:40:20
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Witam, mam problem teoretyczny. Jest taka sytuacja
Mam klasę abstrakcyjną Człowiek, która realizuje jakieś opcje.
I różni ludzie dziedziczą po tej klasie np:

  1. class Daniel extends Czlowiek
  2. {
  3. ...
  4. }


i chcę aby każdy człowiek posiadał odpowiednie metody(które np ustalają co człowiek potrafi, jak myśli, dla każdego wykonanie tej metody ma być inna).

mogę zrealizować to za pomocą interfejsu np. Interface Genetyka
  1. interface Genetyka
  2. {
  3. public function wyglad();
  4. public function umiejetnosci();
  5. }

i wtedy będę miał:
  1. class Daniel extends Czlowiek implements Genetyka
  2. {
  3. ...
  4. }

ale coś mnie to kole w oczy. Ale mogę dodać metody do klasy abstrakcyjnej skoro i tak każdy człowiek po niej dziedziczy.
Co wy byście zrobili. Zastosowali interface czy dodali definicje metod do klasy.

Ten post edytował daniel1302 30.11.2011, 17:32:19
Go to the top of the page
+Quote Post
Orzeszekk
post 30.11.2011, 19:50:16
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Najczysciej będzie jak zrobisz najpierw interfejs z metodami ktore maja byc publiczne i sluzyc do komunikacji z obiektem, a pozniej klasę abstrakcyjną go implementującą, a kolejne klasy ludzi bedziesz tworzyl rozszerzajac tą klasę abstrakcyjną.

Jedna uwaga - jezeli te metody maja byc chronione/prywatne to interfejs na to nie pozwoli, wtedy zostaniesz zmuszony by byly one publiczne, co z definicji jest bez sensu bo interfejs ma byc zbiorem metod publicznych pozwalajacych sie komunikowac z obiektem.

  1. interface Genetics
  2. {
  3. public function look();
  4. public function skills();
  5. }
  6.  
  7. // Nie dodajesz juz abstrakcyjnych metod Look i Skills bo interfejs je wymusza
  8. abstract class Human implements Genetics
  9. {
  10. public function createHuman()
  11. {
  12. $this->makeHumanCosTam();
  13. $this->look();
  14. $this->skills();
  15. }
  16.  
  17. protected function makeHumanCosTam()
  18. {
  19. // TODO wpisz cos
  20. }
  21. }
  22.  
  23. class Daniel extends Human
  24. {
  25. public function look()
  26. {
  27. // TODO wpisz cos
  28. }
  29.  
  30. public function skills()
  31. {
  32. // TODO wpisz cos
  33. }
  34. }
  35.  
  36. abstract class UfoHuman implements Genetics
  37. {
  38. public function createHuman()
  39. {
  40. $this->look();
  41. $this->skills();
  42. $this->drawLegs();
  43. }
  44.  
  45. abstract protected function drawLegs();
  46. }



interfejs ma tą wadę że żadnych wspolnych metod do niego nie wrzucisz a ludzie na pewno beda mieli wspolne metody.

Albo np ludzie beda cos robic tak samo ale w nieco inny sposob, wtedy mozesz uzyc wzorca metoda szablonowa i wspolną czesc kodu zapisac w klasie abstr. a te wyrozniajace ludzi w klasach potomnych a w samym interfejsie szablonu nie zaimplementujesz.

A jak cie dalej bedzie kuło w oczy, to zacznij pisac nazwy metod i zmiennych po angielsku biggrin.gif


Interfejsu uzywaj tylko wtedy jak wiesz ze bedziesz musial dziedziczyc po kilku klasach - w php tego nie zrobisz, bedziesz musal zastapic klasy interfejsami. Choc i wtedy mozna wylaczyc wspolny czynnik przed nawias - porobic klasy abstrakcyjne dla kazdej kombinacji interfejsów ze sobą.

jesli chcesz podszkolic sie z podręcznikowej obiektowości to polecam książkę Kenta Becka chyba ale nie dam sobie głowy uciąć, w każdym razie książka nazywa się "Clean Code" lub "Czysty kod. Podręcznik dobrego programisty". Jest na pewno w twojej bibliotece na uczelni, a jeżeli nie to na necie po angielsku.

Ten post edytował Orzeszekk 30.11.2011, 20:02:50


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
Crozin
post 30.11.2011, 20:53:33
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


To co tu kole w oczy to kompletny brak związku z OOP. Daniel czy inna Ilona nie mogą dziedziczyć po klasie Człowiek, ponieważ te dwa pierwsze to imiona, zaś ostatnie to gatunek. A jak wiadomo imię nie jest wyspecjalizowaną formą gatunku, ani gatunek nie jest uogólnioną formą imienia, racja? Tak więc nie ma tutaj miejsca na jakąkolwiek hierarchiczną zależność pomiędzy tymi rzeczami - nie ma miejsca na dziedziczenie.
Imię to właściwość człowieka. Podobnie sprawa ma się z umiejętnościami. To co dany człowiek potrafi jest jego właściwością, a praktyczniej rzecz biorąc... człowiek posiada kolekcję (zbiór) umiejętności. Z wyglądem sprawa ma się dokładnie tak samo.
Tak więc powinieneś skończyć z czymś w stylu:
  1. class Human {
  2. protected $firstName;
  3.  
  4. protected $skills = array(); // umiejętności same w sobie mogą być obiektami implementującymi jakiś interfejs
  5.  
  6. public function __construct($firstName) { ... }
  7. public function setFirstName($firstName) { ... }
  8. public function getFirstName() { ... }
  9. public function addSkill(Skill $skill) { ... }
  10. public function removeSkill(Skill $skill) { ... }
  11. public function hasSkill(Skill $skill) { ... }
  12. }
Go to the top of the page
+Quote Post
Orzeszekk
post 30.11.2011, 22:25:27
Post #4





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 30.11.2011, 20:53:33 ) *
To co tu kole w oczy to kompletny brak związku z OOP. Daniel czy inna Ilona nie mogą dziedziczyć po klasie Człowiek, ponieważ te dwa pierwsze to imiona, zaś ostatnie to gatunek. A jak wiadomo imię nie jest wyspecjalizowaną formą gatunku, ani gatunek nie jest uogólnioną formą imienia, racja? Tak więc nie ma tutaj miejsca na jakąkolwiek hierarchiczną zależność pomiędzy tymi rzeczami - nie ma miejsca na dziedziczenie.
Imię to właściwość człowieka. Podobnie sprawa ma się z umiejętnościami. To co dany człowiek potrafi jest jego właściwością, a praktyczniej rzecz biorąc... człowiek posiada kolekcję (zbiór) umiejętności. Z wyglądem sprawa ma się dokładnie tak samo.
Tak więc powinieneś skończyć z czymś w stylu:
  1. class Human {
  2. protected $firstName;
  3.  
  4. protected $skills = array(); // umiejętności same w sobie mogą być obiektami implementującymi jakiś interfejs
  5.  
  6. public function __construct($firstName) { ... }
  7. public function setFirstName($firstName) { ... }
  8. public function getFirstName() { ... }
  9. public function addSkill(Skill $skill) { ... }
  10. public function removeSkill(Skill $skill) { ... }
  11. public function hasSkill(Skill $skill) { ... }
  12. }


Mnozysz byty ponad miarę. Brzytwa ockhama. Przekombinowujesz. Jezeli czlowiek o imieniu daniel ma specyficzne akcje a czlowiek o imieniu Tania ma inne akcje specyficzne dla siebie to nie widze powodu by nie mogły byc one klasami dziedziczącymi po człowieku.
Dodawanie kolejnej klasy przechowującej skile to niepotrzebne utrudnianie sobie zycia. Dodalbym ją wtedy gdy stanie sie potrzebna.

W tym kontekscie Daniel/Tania jest typem czlowieka takim samym jak homosapiens czy heterosapiens.

Czy Daniel nie jest czlowiekiem? Czy Kamil - obiekt kamil, ten ktory siedzi wlasnie przed laptopem i pisze odpowiedz nie jest czlowiekiem? Jestem imieniem?

Natomiast jezeli tworzymy gre simsy gdzie kazdemu mozna nadac wlasne imie i to są te same hipki to oczywiscie imie powinna byc wartoscią. - w tym momencie daniel jest tylko specyficznym obiektem klasy Sim

Zapedziles sie crozin. Zapominasz ze kolega nie implementuje w programie rzeczywistosci 1:1 tylko jakis własny wymysł, urojony swiat w ktorym wszystko moze byc wszystkim.

Ten post edytował Orzeszekk 30.11.2011, 22:28:24


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
Crozin
post 30.11.2011, 22:56:51
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Czy Daniel nie jest czlowiekiem? Czy Kamil - obiekt kamil, ten ktory siedzi wlasnie przed laptopem i pisze odpowiedz nie jest czlowiekiem? Jestem imieniem?
Nie wcielaj tutaj potocznych form języka. Gdy mówisz że Kamil siedzi przed komputerem albo że Audi to fajny samochód masz na myśli osobę o imieniu Kamil albo samochód marki Audi.

Cytat
Dodawanie kolejnej klasy przechowującej skile to niepotrzebne utrudnianie sobie zycia.
No właśnie błędny model - jaki Ty i autor próbujecie wprowadzić - mocno komplikuje życie. Spróbuj zmienić umiejętności Daniela (całkiem prawdopodobne zjawisko, ludzie się uczą) albo utworzyć nową osobę z nowym zestawem umiejętności. Modyfikacja istniejących i pisanie nowych klas - jak dla mnie spore utrudnienie.

Na dobrą sprawę wątek powinien trafić do przedszkola, bo mówimy tutaj o absolutnych podstawach OOP, tj. o wydzielaniu i modelowaniu prostych struktur danych i ich wzajemnych relacjach.

Ten post edytował Crozin 30.11.2011, 22:57:12
Go to the top of the page
+Quote Post
Orzeszekk
post 30.11.2011, 23:09:31
Post #6





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 30.11.2011, 22:56:51 ) *
Nie wcielaj tutaj potocznych form języka. Gdy mówisz że Kamil siedzi przed komputerem albo że Audi to fajny samochód masz na myśli osobę o imieniu Kamil albo samochód marki Audi.

No właśnie błędny model - jaki Ty i autor próbujecie wprowadzić - mocno komplikuje życie. Spróbuj zmienić umiejętności Daniela (całkiem prawdopodobne zjawisko, ludzie się uczą) albo utworzyć nową osobę z nowym zestawem umiejętności. Modyfikacja istniejących i pisanie nowych klas - jak dla mnie spore utrudnienie.

Na dobrą sprawę wątek powinien trafić do przedszkola, bo mówimy tutaj o absolutnych podstawach OOP, tj. o wydzielaniu i modelowaniu prostych struktur danych i ich wzajemnych relacjach.


bla bla bla to nie pisz klas wcale skoro to dla ciebie takie utrudnienie.

to jak pisze np FileBuffer czy cos i to ma rozne funkcje to tez zamiast utworzyc normalne metody mam utworzyc kolekcje obiektow przechowujacych po jednej czynnosci?

ty NIE WIESZ jaki model obrał sobie ten czlowiek wiec nie mów że jest błędny. Nie wiesz czy ten typ w ogole chce implementowac dowolnych ludzi w swoim programie. Daniel NIE STWIERDZIŁ że chce zaimplementować system ludzi ala sims. Jak tak stwierdzi to twoje stwierdzenie nabierze sensu. Wtedy bedzie jak najbardziej prawidłowe. Wtedy to bedzie bardzo ciekawy wzorzec umozliwiajacy przypisywanie roznych skilow roznym osobom, wymiennie.

Jak zajdzie potrzeba zmian to kolega sobie to zrefaktoryzuje i juz. Idąc twoim tokiem myslenia trzeba by bylo dodac wszystko co sie moze przydac kiedys za 20 lat do tej klasy. A moze przegladarka www sie przyda temu czlowiekowi? ziuuu - i dodajemy. a moze botnet bedzie nam za 10 lat potrzebny - uuu trzeba zaimplementowac zanim sie uzyje klasy.

Poza tym czy nie moge powiedziec ze samochody Audi mają fajny wygląd i dobrze sie nimi jezdzi?
odnoszę się w tym momencie do klasy carFromAudiFactory rozszerzającej Car. Nie mówie że TEN samochód ma fajny wygląd i sie dobrze nim jezdzi tylko że TE (Ten rodzaj jakim są samochody wyprodukowane przez markę audi) samochody mają fajny wyglad i sie nimi jezdzi.

i zebys mi nie wciskal ze to bledne uzycie potocznego jezyka - przyklad z Car i klasą dziedziczącą VolvoCar byl w ksiazce fowlera refaktoryzacja...

Ten post edytował Orzeszekk 30.11.2011, 23:15:07


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
Dipter
post 30.11.2011, 23:20:09
Post #7





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@Orzeszekk

Twoje uwagi w stosunku do Crozina mają się nijak do tematu, a założenia że klasa Daniel powinna dziedziczyć po klasie Human są idealnym przykładem, jak dziedziczyć się nie powinno.

Po pierwsze jak wspomniano wyżej Daniel to imię, a nie rodzaj człowieka, więc jakakolwiek wymiana rodzic - dziecko tutaj nie powinna mieć w ogóle miejsca.

@daniel1302

Zawsze możesz wszystko rozdzielić na kilka interfejsów, nic nie stoi na przeszkodzie.
Go to the top of the page
+Quote Post
ano
post 30.11.2011, 23:26:36
Post #8





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Orzeszekkk... przecież to teraz Ty strasznie mieszasz! ;o

Własnie o to chodzi - teoretycznie można zrobić sobie klasę VolvoCar. W klasie VolvoCar miałbyś pewnie pole "model". Bo jest wiele aut Volvo o różnej nazwie modelu.
Ale klasa "OsobaDaniel" to co innego. To jest po prostu nielogiczne, żeby tworzyć dla konkretnej osoby (czytaj: dla konkretnego MODELU samochodu Volvo) osobne klasy! I co, autor będzie musiał tworzyć dla każdej kolejnej osoby osobną klasę? ;> Gdzie tu logika? (już widzę ten folder Human\Daniel,Iwona,Ania i tu milion kolejnych imion wink.gif )


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post
Orzeszekk
post 30.11.2011, 23:39:31
Post #9





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Jak tam sobie chcecie. Dla mnie nielogiczne jest zeby zamiast utworzyc relacje rodzic dziecko opakowywac pojedyncze metody w obiekty.

Daniel moze byc rodzajem czlowieka, to juz zalezy jaki punkt widzenia sobie przyjmie autor modelu. To co, jakbym nazwał klasę Daniel klasą HomoSapiens to juz byloby poprawnie? to jest jakies duze nieporozumienie.

Moze (nie ujmując Danielom, podążając za horoskopami) kazdy daniel to swir i ma zawyzony wspolczynnik inteligencji? wtedy co? tworząc kolejnych danielów musze pamietac o ile im podniesc wspolczynnik inteligencji? czy nie naturalniejszym sposobem jest utworzenie klasy daniel ktora w konstruktorze przemnozy IQ bazowe przez to zawyzenie?

Co jezeli fabryka volvo wytwarza swoje samochody najnowsza technologia, a fabryka chinaszajs rzezbi swoje auta w drewnie? kompletnie inny proces produkcyjny - ten sam interfejs -> metoda szablonowa tak czy siak nową klase wypadaloby zrobic, niby mozna wydzielic z tego klasę ProductionProcess i dawac ją jako parametr klasy FabrykaSamochodow ale to nadal wymaga utworzenia nowej klasy przy dodaniu kolejnej fabryki.

Co jezeli Darek znacząco rozni sie dzialaniem od Izy?

jezeli ktos chce traktowac metody jak atrybuty to niech przerzuci sie z php na python

jak dla mnie sensowne jest utworzenie klasy volvocar, a nastepnie nawet klas volvoX40, volvoS60 - w koncu to są wzorce (modele) tych samochodów -> obiektami będą już konkretne samochody jezdzace po ulicy przy czym bedzie kilka milionów obiektów klasy volvoS60 - beda to konkretne auta jezdzace po ulicy. ale to volvoS60 jest typem samochodu.

to co piszecie to jest kompletne zaprzeczenie dziedziczenia jakiego uczono mnie na studiach / w kursach / wszędzie. Klasa - szablon. Obiekt - gotowy egzemplarz zyjący wlasnym zyciem.


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
Dipter
post 30.11.2011, 23:49:43
Post #10





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Zacznijmy od tego, że to że Daniel to świr i ma nie wiadomo jakie umiejętności - To tylko właściwości obiektu klasy Człowiek.

Cytat
Co jezeli fabryka volvo wytwarza swoje samochody najnowsza technologia, a fabryka chinaszajs rzezbi swoje auta w drewnie?


Samochód stworzony z drewna czy ze stali nierdzewnej to już inna działka, bo wtedy to byłyby klasy osobne DrewanianeAuto, MetaloweAuto, PapieroweAuto, które mogłyby dziedziczyć po AbstrakcyjneAuto, z abstrakcyjną metodą buduj.

Cytat
to co piszecie to jest kompletne zaprzeczenie dziedziczenia jakiego uczono mnie na studiach / w kursach / wszędzie. Klasa - szablon. Obiekt - gotowy egzemplarz zyjący wlasnym zyciem.


W takim razie albo źle uważałeś na kursach, albo wykładowca sam źle dziedziczył, ale umysłowo.

Ten post edytował Dipter 30.11.2011, 23:51:36
Go to the top of the page
+Quote Post
ano
post 30.11.2011, 23:51:03
Post #11





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Dalej to co mówisz jest nielogiczne. Z tego by wynikało, że każdy Daniel ma to samo IQ...
Czemu upierasz sie przy czymś takim, zamiast po prostu:
Czlowiek czlowiek = new Czlowiek();
czlowiek.setImie("Daniel");
czlowiek.setIq(120);
?
Jak dla mnie to jest po prostu naturalne.

Przykład z samochodami zachodzi niestety za daleko. Nie wiadomo jak chcesz je modelować.

Czy volvo s60 jeździ inaczej od x40? I czy dlatego powinny być osobnymi klasami?
Odpowiedź na peirwsze pytanie jest oczywista: jeździ INACZEJ. Ale zastanów się dlaczego? Ano dlatego, że ma inny silnik i zawieszenie (proszę, nie wnikajmy w większe szczegóły - nie w tym rzecz).
Dlatego na etapie produkcji auta - czyli w czasie tworzenia obiektu "wkładasz" do niego konkretny silnik (setSilnik) i zawieszenie (setZawieszenie). Ale metoda do wyliczania "osiągów" fury będzie taka sama dla x40 i s60. Wynik oczywiście będzie inny, bo metoda ta korzysta z danych silnika i zawieszenia - uwzględnia je przy obliczeniach.
I z tego wynika, że nie, s60 i x40 nie muszą być osobnymi klasami.

Ps. co to za studia? We Wrocławiu uczą inaczej wink.gif

Ten post edytował ano 30.11.2011, 23:52:50


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post
Orzeszekk
post 30.11.2011, 23:53:07
Post #12





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Cytat(Dipter @ 30.11.2011, 23:49:43 ) *
Zacznijmy od tego, że to że Daniel to świr i ma nie wiadomo jakie umiejętności - To tylko właściwości obiektu klasy Człowiek.



Samochód stworzony z drewna czy ze stali nierdzewnej to już inna działka, bo wtedy to byłyby klasy osobne DrewanianeAuto, MetaloweAuto, PapieroweAuto, które mogłyby dziedziczyć po AbstrakcyjneAuto, z abstrakcyjną metodą buduj.



W takim razie albo źle uważałeś na kursach, albo wykładowca sam źle dziedziczył, ale umysłowo.


umiejetnosc jest metodą a nie polem chyba ze uzywamy języka na prototypach

nie mozliwe zeby tyle ludzi na raz sie pomylilo wiec najprawdopodobniej zafiksowaliscie sie na jakims niefortunnym zdaniu i nie chce wam sie przeczytac calego posta np to:

Z tego by wynikało, że każdy Daniel ma to samo IQ... < jakim cudem skoro napisalem ze mnozymy przez mnoznik specyficzny dla daniela?
__construct(IQ)
{
$this->IQ = IQ*self::mnoznik;
}

ew.
{
$this->IQ = IQ*$this->getMnoznik();
}

studia lublin, ale przedmiot inzynierie oprogramowania akurat zrobilem w danii bedac na wymianie wiec pretensje do duńca mającego firmę obslugujaca dunskie systemy lotnisk ktory nam to wykladal. z pewnoscia byl chory umyslowo i niedouczony.

przyklad z zycia wziety: mam klase PhotoUploader ktora calosciowo odpowiada za upload obrazka, obciecie uzytkownikowi limitów etc.
moze rowniez ona zmniejszyc zbyt duzy obrazek.

Wprowadzam sobie zalozenie ze wszystkie avatary maja miec po 200 px.

wiec uploadujac kazdy avatar ktorych mam kilka dla roznych obiektow na stronie mam pisac new PhotoUploader(200,200) lub PhotoUploader(Avatar_Width, avatar_height) ?

Ja to wole zrobic prosciej: class AvatarUploader{ public function __construct() { parent::__construct(avatar_width, avatar_height) } }

Im mniej parametrow tym lepiej. Biore klase avatarUploader za kazdym razem gdy potrzebuje wrzucic obrazek i nie musze pamietac co wpisac w parametry by dzialalo ok.

Ten post edytował Orzeszekk 1.12.2011, 00:01:20


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
Dipter
post 30.11.2011, 23:59:29
Post #13





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dlaczego metodą? Może być równie dobrze obiektem klasy Umiejętność. Dlaczego upierasz się przy swojej racji i tłumaczysz wszystkim dookoła, że to my mamy coś nie równo, zamiast dać coś komuś wyjaśnić i pomyśleć trochę LOGICZNIE.
Go to the top of the page
+Quote Post
Orzeszekk
post 1.12.2011, 00:04:47
Post #14





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Cytat(Dipter @ 30.11.2011, 23:59:29 ) *
Dlaczego metodą? Może być równie dobrze obiektem klasy Umiejętność. Dlaczego upierasz się przy swojej racji i tłumaczysz wszystkim dookoła, że to my mamy coś nie równo, zamiast dać coś komuś wyjaśnić i pomyśleć trochę LOGICZNIE.

dlatego ze nie ma sensu strzelac do muchy z armaty? nie wiemy jaki model chce sobie zrobic autor, jak stwierdzi ze mu potrzeba takiego systemu z wymiennymi umiejetnosciami to go uzyje jak nie to walnie dwie metody i tez bedzie si. A moze dlatego ze nie jest powiedziane ze mozna to zrobic na jeden sposob a tylko wasz jest prawidlowy a wszystkich ktorzy robia to inaczej trzeba spalic na stosie?

Jak dziedziczyc taki zestaw umiejetnosci? musze miec metode ktora tworzy jeden zestaw i druga ktora go dekoruje wy powiecie ze to fajne a ja powiem ze to dzialanie naokoło. i kto ma racje?

a poza tym bez takich najpierw stwierdziles ze wjezdzam na crozina, pozniej wjechales na mnie i na mojego wykladowce a teraz oceniasz moj sposob myslenia nie doszukuj sie podtekstów agresywnych w dyskusji, zreszta z mojej strony eot po z tego co widze zaraz posypia sie wrzuty na moje miasto.

Ten post edytował Orzeszekk 1.12.2011, 00:05:32


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
Dipter
post 1.12.2011, 00:10:20
Post #15





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Na Ciebie nigdzie nie wjeżdżam więc przestań zmyślać, a ironię w stosunku do twojego wykładowcy niestety źle przyjąłeś.

Ale tutaj nie ma znaczenia jaki model przybierze sobie autor tematu, spytał o prawidłowe programowanie obiektowe, więc takie mu przedstawiamy.

Co do twojego PhotoUploader - Uploader zdjęć nie powinnien IMHO się zajmować skalowalnością zdjęć czy też ich nazwą, rozmiarem czy rozszerzeniem, bo to już należy do innej klasy.

Go to the top of the page
+Quote Post
LSM
post 1.12.2011, 09:58:24
Post #16





Grupa: Zarejestrowani
Postów: 64
Pomógł: 6
Dołączył: 20.03.2011
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


Cytat
Jak zajdzie potrzeba zmian to kolega sobie to zrefaktoryzuje i juz

Dokładnie tak się powinno trworzyć aplikację. Uelastycznianie na wyrost to poważny błąd. A co jeśli w aplikacji będzie 4 aktorów o różnych imieniach i przez kolejne 10 lat nic poza tym ? Myślenie o elastyczności w takim przypadku nie ma sensu. Macie wszyscy po trochu racji, ale jak zwykle na tym forum.. eh nie ważne.
Każdy z was mówi o nieco innych przypadkach i podejściach. Najlogiczniejsze jest dla mnie to co pisze Orzeszekk. Dziedziczenie jest użyteczne, przy komplikowaniu się kodu w którym jest ono używane - należy go refaktoryzować w celu stosownia np. Strategii, ale nigdy tych czynności nie należy robić zbyt wcześnie ponieważ elastyczność potrafi niepotrzebnie skomplikować projekt.

A poza tym nie ma wiedzy jedynie prawdziwej, biorąc pod uwagę fakt oszczędzania czasu i nie marnowania go na "kombinatorykę elastyczną" - należy pójść na początku po najmniejszej linii oporu Orzeszka, jeśli zajdzie potrzeba użyć rozwiązania Crozina lub zupełnie innego, bo można ten apsekt zaprogramować na dziesiątki sposobów. Będzie to zależeć od wymagań jakie postawi nam dalszy rozwój aplikacji. Jeśli Crozin na początku zaczniesz wszystko uelastyczniać na "wydaje mi się" - możesz się zakopać w swoich kombinacjach i gdy przyjdzie czas na wdrożenie czegoś nowego okarze się, że tak uelastyczniłeś system, że stał się nieczytelny i trudny w rozwoju. Niekoniecznie to co napisałeś musi być jedynie prawdziwe i poprawne. Znajde Ci 10 sposobów różnych na to jak sprawić aby to rozwiązanie Człowieka było elastyczne i przygotowane na ewentualnie - każdą zmiane - ale takie myślenie nie ma zupełnie sensu, jest alogiczne, bo który sposób wybierzesz ? A jeśli strategia którą wybierzesz okarze się nieużyteczna i błędna to będziesz musiał zmienić większą ilość kodu niż przed wprowadzeniem strategii. Z elastycznością czeka się do ostatniego momentu - nigdy nie robi się tego na samym początku projektowania. Tak podpowiada mi moje doświadczenie.

oneeyedsmiley02.png


--------------------
"I see" - said the blind man.
Go to the top of the page
+Quote Post
phpion
post 1.12.2011, 10:14:49
Post #17





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@Orzeszekk:
  1. class Human {}
  2.  
  3. class Dog {}
  4.  
  5. class Rottweiler extends Dog {} // to ma sens!
  6.  
  7. class Daniel extends Human {} // to nie ma sensu bo:
  8.  
  9. class Daniel extends Dog {} // cannot redeclare bla bla bla
  10.  
  11. class Daniel_Kowalski extends Daniel {} // questionmark.gif
Go to the top of the page
+Quote Post
Pilsener
post 1.12.2011, 14:28:18
Post #18





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Cytat
Z elastycznością czeka się do ostatniego momentu - nigdy nie robi się tego na samym początku projektowania. Tak podpowiada mi moje doświadczenie.
- i pewnie dlatego olbrzymia większość aplikacji webowych nadaje się tylko do przepisania od nowa a jakiekolwiek poprawki zamieniają się w dochodzenie jak w aferze FOZZ.

Cytat
Dla mnie nielogiczne jest zeby zamiast utworzyc relacje rodzic dziecko opakowywac pojedyncze metody w obiekty

Chyba niewygodne bo na pewno nie nielogiczne, zaraz dojdziemy do paranoi, że wystarczy jedna klasa na wszystko smile.gif
Jako przykład podam formularz - formularz to obiekt, który składa się z innych obiektów (typu textarea) natomiast te obiekty nie mogą dziedziczyć po formularzu, bo to bez sensu (będą miały metodę setPOST albo setGET?) - mogą co najwyżej dziedziczyć po klasie "element formularza" zbiór odpowiednich metod (np. setLabel) wspólnych dla nich wszystkich. I to ma sens - tworzę sobie obiekt "checkbox", ustawiam mu różne właściwości a potem dodaję do obiektu "mój formularz" - co w tym nielogicznego? To na czym niby ma polegać programowanie obiektowe?

Jak komuś nie pasują obiekty to niech wróci do strukturalnego kodu - pisze się go szybciej i linijek dużo mniej. Zresztą rozsądnie napisany kod strukturalny jest dużo lepszy od "obiektowej" sieki, która tylko tym się różni od strukturalnego kodu, że jest upakowana w klamrę z napisem "class" z przodu.

Ten post edytował Pilsener 1.12.2011, 14:30:05
Go to the top of the page
+Quote Post
LSM
post 2.12.2011, 10:05:29
Post #19





Grupa: Zarejestrowani
Postów: 64
Pomógł: 6
Dołączył: 20.03.2011
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


@Pilsener
Nie zrozumiałeś mnie. Zdarzyło Ci się kiedyś przepisywać zbyt elastyczny kod obiektowy ? Mi tak. Przepisywałem też wiele "kodów proceduralnych". Trzeba umieć znaleźć złoty środek i nie robić niczego na wyrost zarówno w podejściu proceduralnym jak i obiektowym. O to mi tylko chodziło. Projektowanie i implementacja powinny iść za wymaganiami, a nie na odwrót. Wielokrotnie zastosowałem jakiś wzorzec zbyt wcześnie. Fan wzorców to wada, a nie zaleta. Ortodoksja w obiektowości jest tak samo zła jak w podejściu proceduralnym.

Jeśli same imiona będą wyróżnikami zupełnie innej roli klasy to dlaczego nie możnabyłoby nazywać klas imionami ? Zakładam sytuację, że są 3 osoby w grze komputerowej. Każda z nich ma imiona. Daniel - gotuje, myje okna, daje jedzenie psom na podworku. Ania - myje okna, wyrzuca smieci, odkurza, Krzysiek - myje podlogi, wyciera kurze. Jak widzimy każda z tych osób to zupełnie inna rola (dziedzinowa) w aplikacji. Jeśli założymy, że w naszej grze w pierwszej wersji nie ma możłiwości wymiany rolami między osobami po co robić osobne interfejsy i uelastyczniać ? Na co uelastyczniać ? Oczywiście tworzenie obiektów osób w takiej sytuacji jest dziwactwem, ale nie trzeba tego robić można przecież zrobić: Krzysiek::umyjPodloge(). Odrazu widzimy w kodzie Kto i Co. Na takim etapie rozwoju programu elastyczność jest bezużyteczna. Jeśłi natomiast chcielibyśmy aby nagle Krzyś również mógł robić to co Ania - wtedy dopiero elastyczność ma sens i można zastosować to co pisał Crozin i inni.

Ten post edytował LSM 2.12.2011, 10:52:36


--------------------
"I see" - said the blind man.
Go to the top of the page
+Quote Post
bastard13
post 2.12.2011, 11:33:03
Post #20





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Zgadzam się z LSM, że myślenie 'na przyszłość' jest zgubne, ale pod warunkiem, że rozważasz rozwiązania, które przypuszczasz, że kiedyś, może zostaną zaimplementowane. Wtedy nie implementujesz setek wzorców itp. tylko po to, żeby można było zrobić z tym wszystko, co ci się żywnie podoba, tyle, że w przyszłości, implementując rzeczy, których możesz nigdy nie implementować, ponieważ twoje przewidywania były błędne.
Co do rozwiązania Crozina, to nie jest ono 'nad wyrost', robienie czegoś poprawnie, nie jest wprowadzaniem nadmiernej elastyczności.

Co do klasy Damian, to:
Z wikipedii:
Cytat
W programowaniu obiektowym klasa jest częściową lub całkowitą definicją dla obiektów. Definicja obejmuje dopuszczalny stan obiektów oraz ich zachowania.

i mamy dalej:
Cytat
Klasa nie jest samodzielnym bytem, lecz szablonem do tworzenia nowych obiektów określonego typu i posiadających określone zachowanie.[...]Poszczególne instancje klasy posiadają ten sam zbiór zachowań i atrybutów, lecz różnią się przechowywanymi w nich wartościami.[...]


Czyli klasa definiuje atrybuty i zachowanie obiektów, ale dopiero przy ich tworzeniu określamy ich stan.
Rozumiem, że klasa Damian dziedziczyłaby po klasie Człowiek tyle, że ustawiałaby jakieś domyślne wartości, tak? No to się to trochę kłóci z powyższymi.

Programowanie obiektowe zostało wymyślone w celu jak najdokładniejszego odwzorowania rzeczywistości.
Załóżmy więc, że Damian to model. W takim wypadku, czym są jego instancje? Damian1, Damian2 itp.? Nawet jeżeli każdy Damian jest rudy, sympatyczny i nieprzeciętnie inteligenty, to czy oznacza to, że mamy do czynienia z nowym człowiekiem? Wątpięsmile.gif

Jeżeli już koniecznie chcesz robić coś takiego, to możesz stworzyć jakąś fabrykę, która zwraca ci obiekt klasy Człowiek z odpowiednimi ustawieniami (czyli umiejętnościami, imieniem, IQ i wszystkim innym, co tylko chcesz).
Takie samo rozwiązanie zastosowałbym do przykładu, który przedstawił Orzeszekk (z klasą AvatarUploader). Tutaj też rozwiązaniem byłaby fabryka.
Bo tworzenie dziedziczenia tylko i wyłącznie po to, żeby klasy od razu miały ustawiony szereg odpowiednich wartości jest bez sensu i nie jest poprawne, nie ważne czy uczy tego Duńczyk, Holender, Polak, czy wiesz to z tutoriali. Bo w takim wypadku dojdziesz do skrajności, gdzie dla każdego zestawu danych będziesz miał osobny obiekt?

Dziedziczenie powinno rozszerzać funkcjonalność i wtedy ma ono sens. Jeżeli służy tylko do ustawiania wartości, 'bo taki zestaw danych jest często używany' tzn. że mamy do czynienia z błędnym rozumieniem dziedziczenia.

A co do pytania głównego, to tutaj pisałem trochę na temat tego, kiedy interfejs a kiedy klasa abstrakcyjne. W Twoim wypadku, uwzględniając tylko te informacje, które przekazałeś i nic więcej (bez przypuszczeń), to interfejs jest Ci nie potrzebny, wszystko ląduje w klasie abstrakcyjnej.


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 5.06.2024 - 16:15