Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> O abstrakcji klas i interfejsów
daniel1302
post
Post #1





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

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


Witam
dziś szukając informacji o abstrakcji obiektów natchnołem się na ten artykuł
http://blog.dywicki.pl/2007/04/04/o-abstra...-i-interfejsow/


Zrozumiałem tyle:
Abstrakcja
-Wymusza tworzenie obiektów w klasach pochodnych
-Przekazuje informacje o działającym skrypcie


Interfejs
-Wymusza użycie metod w klasach impletujących go
-Przekazuje nadzędzia działającego systemu


Używamy
Klasę abstrakcyjną gdy:
-Mamy mniejszy system
-Musimy zawrzeć w funkcji która będzie wymuszona jakiś kod
-Chcemy używać niektórych z jej metod


Interfejs gdy:
-Mamy wielki system
-Wymuszamy użycie metod w których nie musimy zawierać kodu
-Definiujemy medtody które zainicjujemy w klasach impletujących interfejs



Nie zrozumiałem:
-Co to jest Elastyczność obiektu
-"Budowa złożonej aplikacji bez użycia interfejsów jest posunięciem wysoce nierozsądnym, ponieważ to właśnie dzięki nim, nawet w językach kompilowanych ze statycznym typowaniem jesteśmy w stanie zyskać nadzwyczajnie elastyczny kod"
-"Nawet jeśli koncepcja implementacji obróci się o 180 stopni to nasz interfejs, będący swoistą fasadą, ukryje te zmiany przed osobami, których one nie dotyczą bądź nie interesują."


Dziękuje z góry oraz proszę o wyrozumiałośc ale jeśli mi ktoś nie wytłumaczy nie pojmę niczego tego do końca.

Ten post edytował daniel1302 17.08.2008, 09:26:03
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Chodzi o to, aby zmiana implementacji jakiejś metody nie pociągała za sobą konieczności zmian w wielu miejscach, albo co gorsza, zmian w kodzie użytkującym tą metodę. np. Dwie klasy News (ahh, nieśmiertelny przykład) - ten sam interfejs, ale działanie kodu wewnątrz klas jest inne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
  1. <?php
  2. //print date('Y-m-d', 1218467120);
  3. class Comment
  4. {
  5. protected $content;
  6. protected $id;
  7.  
  8. public function __construct($content='')
  9. {
  10. $this->content=$content;
  11. }
  12.  
  13. public function getId()
  14. {
  15. if(!$this->id)
  16. {
  17. $this->id=rand(1, 300); // ot, symulacja
  18. }
  19. return $this->id;
  20. }
  21.  
  22. public function getContent()
  23. {
  24. return $this->content;
  25. }
  26. }
  27.  
  28. interface Commentable
  29. {
  30. public function getComments();
  31. public function getComment($id);
  32. public function addComment(Comment $comment);
  33.  
  34. }
  35.  
  36. class News implements Commentable
  37. {
  38. protected $comments=array();
  39.  
  40. public function getComment($id)
  41. {
  42. return $this->comments[$id];
  43. }
  44.  
  45. public function getComments()
  46. {
  47. return $this->comments;
  48. }
  49.  
  50. public function addComment(Comment $comment)
  51. {
  52. $this->comments[$comment->getId()]=$comment;
  53. }
  54. }
  55.  
  56.  
  57. class News implements Commentable
  58. {
  59. protected $comments=array();
  60.  
  61. public function getComment($id)
  62. {
  63. if(isset($this->comments[$id]))
  64. {
  65. return $this->comments[$id];
  66. }
  67. else
  68. {
  69. throw new Exception("Cannot find comment (id: $id)");
  70. }
  71. }
  72.  
  73. public function getComments()
  74. {
  75. return $this->getFiltered($this->comments);
  76. }
  77.  
  78. public function getFiltered($comments)
  79. {
  80. $data=array();
  81. foreach($comments as $key=>$comment)
  82. {
  83. if((integer)$key%2==0)
  84. {
  85. print $key;
  86. $data[$key]=$comment;
  87. }
  88. }
  89. return $data; // tylko parzyste identyfikatory
  90. }
  91.  
  92. public function addComment(Comment $comment)
  93. {
  94. $this->comments[$comment->getId()]=$comment;
  95. }
  96. }
  97.  
  98. $news=new News();
  99.  
  100. try
  101. {
  102. $news->addComment(new Comment());
  103. $news->addComment(new Comment());
  104. $news->addComment(new Comment());
  105. print_r($news->getComments());
  106. }
  107. catch(Exception $e)
  108. {
  109. print $e->getMessage();
  110. }
  111.  
  112. ?>


Metoda News::getComment(), pobiera identyfikator jako parametr i wyszukuje odpowiadający mu obiekt w lokalnej kolekcji. Możemy też rozbudować funkcję tak, aby w przypadku nieznalezienia obiektu, szukała w bazie danych, a dopiero potem zwracała błąd. Zauważ, że zawsze przekazujemy tylko identyfikator - nie musimy nic zmieniać w wywołaniu tej metody.
Teraz mając system, który ma np. 10 klas News (np dla Swiat, Polska, Warszawa), metoda wyszukiwania i pobierania Komentarzy może być różna dla każdej z nich. Jeszcze mały przykład (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
  1. <?php
  2. class ChinaNews extends News
  3. {
  4. public function addComment(Comment $comment)
  5. {
  6. $this->comments[$comment->getId()]=$this->censorship($comment);
  7. }
  8.  
  9. public function censorship(Comment $comment)
  10. {
  11. if(eregi("Tibet", $comment->getContent()))
  12. {
  13. throw new Exception('We apologize, but our servers are overloaded. Please try again later'); // (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
  14. }
  15. return $comment;
  16. }
  17. }
  18.  
  19. // i jeszcze kod użytkujący
  20. $news=new ChinaNews();
  21.  
  22. try
  23. {
  24. $news->addComment(new Comment('Free Tibet!!!'));
  25. }
  26. catch(Exception $e)
  27. {
  28. print $e->getMessage();
  29. }
  30. ?>

To jest właśnie elastyczność - ukrycie implementacji za interfejsem.

Pozdrawiam.

Przenoszę na OOP
Go to the top of the page
+Quote Post

Posty w temacie


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: 28.12.2025 - 17:53