Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> OOP & Interfejsy
KirkoR
post
Post #1





Grupa: Zarejestrowani
Postów: 118
Pomógł: 0
Dołączył: 14.02.2004
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Witam. Czy ktoś może mi przedstawić szerzej idee interfejsów, do czego służą, kiedy i po co ich uzywać? Bo nigdzie nie mogę znaleźć konkretnych informacji.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
krzysztof f.
post
Post #2





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 22.11.2005

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


Drugi link od mike_mech powinien wszystko wyjaśnić.

Na wszelki wypadek ;)

Interfejsy pozwalają pisać lepiej zorganizowany, czytelniejszy kod oraz oddzielać implementację od właśnie interfejsu. Założenia programowania obiektowego mówią o tym, że powinno się pisać kod bardziej ukierunkowany na interfejs, niż samą implementację. Ułatwia to późniejsze ponowne wykorzystywanie kodu i współpracę między projektantami/programistami. Programowanie (w szczególności programowanie komponentowe http://c2.com/cgi/wiki?ComponentOrientedProgramming) to nie tylko pisanie aplikacji dla końcowego użytkownika. Obecnie programiści piszą kod, który jest wykorzystywany/kupowany później przez innych programistów. Aby praca z obcymi komponentami czy bibliotekami była jak najłatwiejsza, czy też w ogóle możliwa, muszą one dostarczać czytelne API http://en.wikipedia.org/wiki/API. Programistę wykorzystującego taki komponent nie interesuję implementacja (czyli w jaki sposób działają poszczególne zadania), a jedynie interfejs (czyli jakie zadania ma możliwość wykonać).

Mówiąc prościej… interfejs w odniesieniu do obiektu to po prostu lista metod jakie obiekt posiada wraz z typami niezbędnych parametrów i informacją o zwracanej wartości. php umożliwia wymuszanie jedynie typów obiektowych jako parametrów funkcji. Gorzej jest z wartościami zwracanymi, ale ma się to zmienić http://www.php.net/~derick/meeting-notes.h...d-return-values. Póki co jedyny sposób to dobra dokumentacja kodu http://phpdoc.org/.
W taki sposób znając interfejs obiektu wiemy jak go używać. Bo zgodnie z ideą interfejsu wszystkie jego metody muszą być publiczne.

Jak sprawa ma się w praktyce?

Załóżmy, że mamy napisaną aplikację opartą o Front Controller http://www.phppatterns.com/docs/design/the...troller_and_php, który stanowi punkt wejścia do naszej aplikacji. Możemy w nim rejestrować filtry http://java.sun.com/blueprints/corej2eepat...tingFilter.html, które będą wykonywały jakieś operacje na danych wejściowych i wyjściowych. Idea polega na tym, że wykorzystując nasz kontroler w różnych przypadkach, możemy dowolnie komponować zestawy filtrów, lub też tworzyć nowe w miarę potrzeb. W tym celu tworzymy interfejs filtru, z którym będzie współpracował obiekt kontrolera.

  1. <?php
  2. interface IInterceptingFilter
  3. {
  4.  /**
  5. * Operacje wykonywane przed wywołaniem kontrolera
  6. *
  7. * @param Request Obiekt żądania
  8. * @return Request
  9. * @access public
  10. **/
  11.  public function preProcess( Request $oRequest );
  12.  
  13.  /**
  14. * Operacje wykonywane po obsłudze żądania
  15. *
  16. * @param Response Obiekt odpowiedzi
  17. * @return Response
  18. * @access public
  19. **/
  20.  public function postProcess( Response $oResponse );
  21. }
  22. ?>


Stwórzmy teraz przykładowy filtr:

  1. <?php
  2. class TimeExecutionFilter implements InterceptingFilter
  3. {
  4.  
  5.  /**#@+
  6. * @var string 
  7. * @access private 
  8. */
  9.  /**
  10. * Data rozpoczęcia skryptu (format microtime) 
  11. */
  12.  private $_sStart;
  13.  /**
  14. * Data zakończenia wykonywania skryptu (format microtime) 
  15. */
  16.  private $_sEnd;
  17.  /**#@-*/
  18.  
  19.  
  20.  public function preProcess( Request $oRequest )
  21.  {
  22. $this->_sStart = microtime();
  23. return $oRequest;
  24.  }
  25.  
  26.  public function postProcess( Response $oResponse )
  27.  {
  28. $this->_sEnd = microtime();
  29. return $oResponse->set( 'time', $this->_calculateTime( $this->_sStart, $this->_sEnd ) );
  30.  }
  31.  
  32.  /**
  33. * Przeliczenie czasu wykonania strony
  34. * @param string Czas rozpoczęcia (format microtime)
  35. * @param string Czas zakończenia (format microtime)
  36. * @return double Czas wykonania w sekundach
  37. * @access private
  38. **/
  39.  private function _calculateTime( $sStart, $sEnd )
  40.  {
  41. $aEnd = explode( ' ', $sEnd );
  42. $aStart = explode( ' ', $sStart );
  43.  
  44. $dEnd = (float) $aEnd[1] + (float) $aEnd[0];
  45. $dStart = (float) $aStart[1] + (float) $aStart[0];
  46.  
  47. return number_format( $dEnd - $dStart, 4);
  48.  }
  49. }
  50.  
  51. ?>


Z czasem rozwoju aplikacji może się okazać, że przydałby nam się jeszcze inne filtry. Nie ma problemu wystarczy, że zaimplementujemy na nowo nasz interfejs lub zlecimy to komuś innemu. Tak długo jak będziemy trzymać się interfejsu kontroler będzie potrafił sobie z nim poradzić, a my będzimy mogli go spokojnie używać. Chociażby w taki sposób:

  1. <?php
  2.  $oController = new FrontController();
  3.  $oController->addFilter( new AuthenticationFilter( 'login.php' ) );
  4.  $oController->addFilter( new OutputBufferFilter() );
  5.  $oController->addFilter( new TimeExecutionFilter() );
  6.  $oController->run();
  7.  
  8. ?>
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: 3.10.2025 - 20:09