Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> OOP. Interfejsy oraz klasy abstrakcyjne, Zabezpieczenie przed programistą?
Jabol
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


Witam,

Nawiązując do http://forum.php.pl/index.php?showtopic=64555&st=80 chciałem troszkę rozjaśnić swoje zdanie na temat obiektowości w programach. Rozumiem koncept OOP i dzielenia aplikacji na obiekty - logiczne, wszystko dzieli się według zastosowania. Ale OOP to nie tylko taki podział. Potem dochodzą do tego interfejsy oraz klasy abstrakcyjne. Rozumiem interfejs, ale czemu interfejs nie może być normalną klasą, przecież i tak nie ma być wykorzystywany w programie? To tak jakby sucha kromka chleba miała być niejadalna, bo jest tylko interfejsem do kromki z serem. A jest jadalna - tylko większość osób kładzie na nią dodatkowo ser czy cośtam. I teraz klasy abstrakcyjne. Rozumiem, że obiekty mają hierarchię, ale po co klasy abstrakcyjne? Jeżeli są to klasy, których nie nalaży używać, to wystarczy ich nie używać - na pewno są przecież bezużyteczne, inaczej nie byłyby abstrakcyjne.

Dlatego mam czasami wrażenie, że OOP to nie tylko standart projektowania, ale również inny troszkę tok myślenia. Rozumiem, że programista musi założyć, że użytkownicy to idioci. Bo oni mogą się nie znać. Ale jeżeli ktoś pisze jakąś obiektową bibliotekę, albo jeszcze gorzej strukturę programu dla siebie, to nie musi wychodzić z założenia, że jest idiotą. Jeżeli programista jest idiotą to jego sprawa, bo jego program i tak nie będzie działał - nie potrzeba do tego warningów/errorów kompilatora/interpretera. Tak samo metody prywatne. Jeżeli w dokumentacji będzie wspomniane nie używać, to mądry programista ich i tak nie użyje, a sprytny użyje i też będzie ok.

Dlatego nie rozumiem, po co w OOP ten cały mechanizm zabezpieczania programów przed... programistami, którzy je piszą?

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
vegelus
post
Post #2





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 31.05.2005

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


Przepraszam, że odgrzewam temat. Chciałbym poruszyć problem związany z interfejsami i myślę, że kontynuacja w tym wątku będzie odpowiednia.
Postanowiłem wykorzystać wzorzec kompozycji do zebrania kilku podobnych elementów, lecz z niewielkimi różnicami. Poniższy kod uprościłem do dwóch różnic. Do plecaka mogę włożyć element będący dzieckiem klasy abstrakcyjnej Item. Ale w zależności od materiału z jakiego jest wykonany dany element implementuje odpowiedni interfejs(szkło i drewno). Poniżej przedstawiam kod oraz proszę o podanie w jaki sposób w klasie Bag rozróżniać z jakiego materiału jest dany element aby wydać odpowiedni dźwięk.

  1. <?php
  2. class ItemExeption extends Exception {}
  3.  
  4. interface szklo{
  5. function brzdek();
  6. }
  7. interface drewno{
  8. function pukpuk();
  9. }
  10.  
  11. abstract class Item {
  12. abstract function weigth();
  13.  
  14. function addItem(Item $item){
  15. throw new ItemExeption(get_class($this)." to liść");
  16. }
  17.  
  18. function removeItem(Item $item){
  19. throw new ItemExeption(get_class($this)." to liść");
  20. }
  21.  
  22. }
  23.  
  24. class butelka extends Item implements szklo {
  25. function weigth(){
  26. return 2;
  27. }
  28.  
  29. function brzdek(){
  30. return 'Brzdek! Brzdek! ';
  31. }
  32. }
  33.  
  34. class patyk extends Item implements drewno {
  35. function weigth(){
  36. return 4;
  37. }
  38.  
  39. function pukpuk(){
  40. return 'Puk! Puk! ';
  41. }
  42. }
  43.  
  44. class drewniane_luterko extends Item implements drewno, szklo {
  45. function weigth(){
  46. return 3;
  47. }
  48. function pukpuk(){
  49. return 'Puk! Puk! ';
  50. }
  51. function brzdek(){
  52. return 'Brzdek! Brzdek! ';
  53. }
  54. }
  55.  
  56. class Bag extends Item {
  57. private $items = array();
  58.  
  59. function addItem(Item $item) {
  60. foreach($this->items as $thisItem){
  61. if($item === $thisItem){
  62. return;
  63. }
  64. }
  65. $this->items[] = $item;
  66. //gdzieś tutaj chciałbym móc użyć czegoś takiego 
  67. if($item == 'szklo'){
  68.  $item->brzdek();
  69. }
  70. function removeItem(Item $item){
  71. $items = array();
  72. foreach($this->items as $thisItem){
  73. if($item !== $thisItem){
  74. $items[] = $thisItem; 
  75. }
  76. }
  77. $this->items = $items;
  78. }
  79. function weigth(){
  80. $ret = 0;
  81. foreach($this->items as $item){
  82. $ret += $item->weigth();
  83. }
  84. return $ret;
  85. }
  86. }
  87.  
  88. $plecak = new Bag();
  89. //wkladamy do plecaka butelke i sluszymy brzdek
  90. $plecak->addItem(new butelka());
  91. //wkladamy patyk i slyszymy pukpuk
  92. $plecak->addItem(new patyk());
  93. //sprawdzamy ciezar wlorzonych przedmiotow
  94. print 'Plecak waży: '. $plecak->weigth() . ' kg.<br>';//wynik: Plecak waży: 6 kg.
  95.  
  96. ?>


Ten post edytował vegelus 7.01.2008, 02:31:09
Go to the top of the page
+Quote Post

Posty w temacie
- Jabol   OOP. Interfejsy oraz klasy abstrakcyjne   3.04.2007, 18:03:01
- - Athlan   Moim zdaniem źle podszedłeś do sprawy. Zły przykła...   3.04.2007, 18:26:15
|- - enigma   Cytat(Athlan @ 3.04.2007, 19:26:15 ) ...   1.05.2007, 16:46:49
- - LBO   Cytat(Jabol @ 3.04.2007, 19:03:01 ) R...   3.04.2007, 18:28:04
- - Jabol   Dzieki za wyjaśnienie, rozumiem w czym rzecz. Czy...   3.04.2007, 18:53:14
- - Sedziwoj   Tylko w opisie pojawił się pewien bug, bo bułki/ch...   3.04.2007, 19:06:32
- - Athlan   CytatTylko w opisie pojawił się pewien bug, bo buł...   3.04.2007, 19:12:29
- - Sedziwoj   To w sumie pokazuje jeszcze jedno, gdyż pieczywo j...   3.04.2007, 19:31:55
- - Zeman   Ja się jeszcze dorzucę. Interfejsy w językach skr...   3.04.2007, 19:58:25
|- - Sedziwoj   Cytat(Zeman @ 3.04.2007, 20:58:25 ) ....   3.04.2007, 20:06:40
- - Zeman   Cytat(Sedziwoj @ 3.04.2007, 21:06:40 ...   3.04.2007, 20:11:34
|- - Sedziwoj   Ale przy protected w klasie dziedziczącej jest wid...   3.04.2007, 20:25:43
- - Zeman   Cytat(Sedziwoj @ 3.04.2007, 21:25:43 ...   3.04.2007, 20:33:24
|- - mike_mech   Cytat(Zeman @ 3.04.2007, 21:33:24 ) p...   3.04.2007, 21:19:19
- - Turgon   W mojej skromnej opinii, klasy abstrakcyjne, final...   4.04.2007, 12:50:56
- - dr_bonzo   Cytatkurde czegoś tu nie rozumiem, no po co tak ro...   1.05.2007, 19:03:22
- - Sedziwoj   Tu po prostu Rodzic powinien implementować Obrabia...   2.05.2007, 11:30:45
- - enigma   Cytat(dr_bonzo @ 1.05.2007, 20:03:22 ...   13.05.2007, 09:54:49
- - menic   Ale interfejsy sa bardzo proste do zrozumienia. St...   13.05.2007, 10:12:54
- - Cysiaczek   Interfejsy to dla mnie głównie nowe typy, któ...   13.05.2007, 10:27:07
- - Sedziwoj   menic stosowane są takie przykłady, aby każdy czyt...   13.05.2007, 11:42:17
- - Turgon   Cysiaczek, a jakże dobry i prosty przykład. Tutaj ...   15.05.2007, 18:12:19
- - splatch   Troszkę inny przykład ... [PHP] pobierz,...   22.05.2007, 14:13:41
- - LBO   JA bym się przyczepił do jacka, bo: [PHP] pobierz,...   22.05.2007, 15:23:35
- - DeyV   Korzystanie z interfejsów pokazuje swoje zalety w ...   24.05.2007, 09:34:11
- - vegelus   Przepraszam, że odgrzewam temat. Chciałbym poruszy...   7.01.2008, 02:29:15
- - mike   Jest do tego gotowy operator: instanceof   7.01.2008, 08:33:07
- - Virti   A ja, jeśli można, chciałbym prosić o wytłumaczeni...   7.01.2008, 19:11:07
- - Whisller   @Virti Aby ułatwić sobie implementację Mały przyk...   8.01.2008, 08:04:55
- - Virti   Ok, czyli rozumiem, że abstrakcja dostarcza funkcj...   8.01.2008, 18:35:14
- - domis86   @virti: żeby wymusic dziedziczenie po tej klase. K...   8.01.2008, 19:38:08
- - Sedziwoj   @vegelus Wyjaśnij mi czym się różni "brzdek...   9.01.2008, 11:58:07
- - Cysiaczek   Ja się zawsze staram robić klasy abstrakcyjne. Naz...   9.01.2008, 12:41:11
- - -=Peter=-   Witam, może powinienem założyć nowy temat, ale wol...   1.02.2008, 21:28:08
- - Sajrox   Wracająć do tematu to jak dobrze zrozumi...   2.02.2008, 19:36:10
- - -=Peter=-   Interfejsy nie tylko wymuszają istnienie danych me...   2.02.2008, 19:55:00


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

 



RSS Aktualny czas: 2.10.2025 - 16:13