Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Implementować czy rozszerzać?, implements vs. extends
starach
post 26.09.2008, 23:18:34
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Czy są jakieś utarte reguły dotyczące wyboru jednej z tych dwóch metod ?
Mam klasę ( w sumie nie jedną ) która wymaga Iterator'a. Pytanie tylko czy mam zaimplementować interfejs iteratora czy rozszerzyć i nadpisać kilka metod. Nie wiem którą z opcji wybrać. Szukam jakiejś reguły którą mógłbym się kierować przy wyborze.
Go to the top of the page
+Quote Post
NuLL
post 27.09.2008, 01:00:14
Post #2





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Implmentacja bo szybsza - dziedziczenie jest strasznie powolne :]


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
mike
post 27.09.2008, 09:56:13
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Dziedziczenie stosuj tam gdzie masz zamiar skorzystać z polimorfizmu.
Go to the top of the page
+Quote Post
starach
post 27.09.2008, 13:25:54
Post #4





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


To lubię w tym forum. Konkretne i szybkie odpowiedzi smile.gif

To jeszcze prosiłbym o sprawdzenie moich wypocin.
  1. <?php
  2. class Class_Method_Collection implements Iterator
  3. {
  4.    /**
  5.      * For:
  6.      * $this->_items[0]['name'] = '<method name>'; | myMethod
  7.      * $this->_items[0]['return'] = '<variable type>'; | integer / string / etc.
  8.      * $this->_items[0]['params'][0]['name'] = '<param name>'; | my_variable
  9.      * $this->_items[0]['params'][0]['type'] = '<param type>'; | integer / string / etc.
  10.      * or
  11.      * $this->_items[0] = Class_Methods_Method
  12.      * @var array
  13.      */
  14.    protected $_items = array();
  15.    /**
  16.      * Iterator index
  17.      * @var integer
  18.      */
  19.    protected $_key = 0;
  20.    /**
  21.      * Identifiers stored in array
  22.      * @var array
  23.      */
  24.    protected $_keys;
  25.    /**
  26.      * Converts data from array to Class_Methods_Method object
  27.      * For:
  28.      * $method['name'] = '<method name>'; | myMethod
  29.      * $method['return'] = '<variable type>'; | integer / string / etc.
  30.      * $method['params'][0]['name'] = '<param name>'; | my_variable
  31.      * $method['params'][0]['type'] = '<param type>'; | integer / string / etc.
  32.      * @param array $method
  33.      */
  34.    public function array2method($method)
  35.    {
  36.        $method['return'] = isset($method['return']) ? $method['return'] 'void';
  37.        
  38.        $ob = InstanceGet('library.class.method', '', InstanceRETURN_INSTANCE);
  39.        $ob->setName($method['name']);
  40.        $ob->setReturn($method['return']);
  41.        foreach($method['params'] as $param)
  42.        {
  43.            $ob->setParam($param['name'], $param['type']);
  44.        }
  45.        return $ob;
  46.    }
  47.    /**
  48.      * Loads methods collection in array format as class items for further operations
  49.      * $this->_items[0]['name'] = '<method name>'; | myMethod
  50.      * $this->_items[0]['return'] = '<variable type>'; | integer / string / etc.
  51.      * $this->_items[0]['params'][0]['name'] = '<param name>'; | my_variable
  52.      * $this->_items[0]['params'][0]['type'] = '<param type>'; | integer / string / etc.
  53.      * or
  54.      * $this->_items[0] = Class_Methods_Method
  55.      * @param array $methods
  56.      */
  57.    public function load($methods)
  58.    {
  59.        if($this->validate($methods)) throw new Exception('Incorrect $methods format.');
  60.        $this->_keys = array_keys($methods);
  61.        $this->_items = $methods;
  62.    }
  63.    /**
  64.      * Compares format of $methods array with required by load() method
  65.      * @param array $methods
  66.      */
  67.    public function validate($methods)
  68.    {
  69.        $out = true;
  70.        foreach($methods as $method)
  71.        {
  72.            if(!isset($method['name']))
  73.            {
  74.                $out = false;    break;
  75.            } else
  76.            if(isset($method['params']))
  77.            {
  78.                foreach($method['params'] as $param)
  79.                {
  80.                    if(!isset($param['name']) || !isset($param['type']))
  81.                    {
  82.                        $out = false;    break;
  83.                    }
  84.                }
  85.            }
  86.            if(!$out) break;
  87.        }
  88.        return $out;
  89.    }
  90.    // ----------------- //
  91.    // SETTERS & GETTERS //
  92.    // ----------------- //
  93.    /**
  94.      * Returns item
  95.      * @param integer $key
  96.      * @return misc
  97.      */
  98.    public function getItem($key)
  99.    {
  100.        return isset($this->_keys[$key]) && isset($this->_items[$this->_keys[$key]]) ? $this->_items[$this->_keys[$key]] false;
  101.    }
  102.    /**
  103.      * Sets item
  104.      * @param integer $key
  105.      * @param misc $item
  106.      */
  107.    public function setItem($key, $item)
  108.    {
  109.        if(isset($this->_items[$key]))
  110.        {
  111.            $this->_items[$key] = $item;
  112.        }
  113.        else
  114.        {
  115.            $this->_keys[] = $key;
  116.            $this->_items[$key] = $item;
  117.        }
  118.    }
  119.    // ---------------- //
  120.    // ITERATOR METHODS //
  121.    // ---------------- //
  122.    /**
  123.      * Returns current item
  124.      * @return misc
  125.      */
  126.    public function current()
  127.    {
  128.        return $this->valid() ? $this->array2method($this->_items[$this->_keys[$this->_key]]) false;
  129.    }
  130.    /**
  131.      * Return key of current item or boolean false if item does not exists
  132.      */
  133.    public function key()
  134.    {
  135.        return $this->valid() ? $this->_keys[$this->_key] false;
  136.    }
  137.    /**
  138.      * Moves forward to next item
  139.      */
  140.    public function next()
  141.    {
  142.        $this->_key += 1;
  143.    }
  144.    /**
  145.      * Checks does current item exists
  146.      * @return boolean
  147.      */
  148.    public function valid()
  149.    {
  150.        return (isset($this->_keys[$this->_key]) && isset($this->_items[$this->_keys[$this->_key]]));
  151.    }
  152.    /**
  153.      * Rewinds Iterator to the first element
  154.      */
  155.    public function rewind()
  156.    {
  157.        $this->_key = 0;
  158.    }
  159. }
  160. ?>
Zastanawiam się czy nie lepiej wydzielić część iteracyjną do klasy abstrakcyjnej z abstrakcyjną metodą current(), bo będę chciał ten mechanizm zastosować w około 20 klasach.

Ten post edytował orglee 27.09.2008, 14:23:47
Go to the top of the page
+Quote Post
Sedziwoj
post 27.09.2008, 19:51:52
Post #5





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Dlaczego masz:
  1. <?php
  2. /*
  3.     * $this->_items[0]['name'] = '<method name>'; | myMethod
  4.     * $this->_items[0]['return'] = '<variable type>'; | integer / string / etc.
  5.     * $this->_items[0]['params'][0]['name'] = '<param name>'; | my_variable
  6.     * $this->_items[0]['params'][0]['type'] = '<param type>'; | integer / string / etc.
  7.     */
  8. ?>

Przecież wygodniej mieć obiekt. Do tego iterator powinien przechowywać tylko jeden typ elementów. Bo inaczej nie wiadomo co się dzieje, że PHP umożliwia różne dziwne rzeczy, nie znaczy że trzeba z tego korzystać.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
starach
post 27.09.2008, 21:17:01
Post #6





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Bo to jest kolekcja a pojedynczy element zwracam już jako obiekt.

Jak w takim razie powinno to wyglądać poprawnie ?

Ten post edytował orglee 27.09.2008, 21:17:30
Go to the top of the page
+Quote Post
jarek_bolo
post 28.09.2008, 07:26:21
Post #7





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

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


OT: Czy Ty celowo pomijasz dwukropek w Ternary Operatorze ? Czy może robisz tak ze względu na kolorowanie składni na forum, albo bez tego dwukropka też działa?
Np. tutaj:
  1. <?php
  2. /**
  3.     * Return key of current item or boolean false if item does not exists
  4.     */
  5.   public function key()
  6.   {
  7.       return $this->valid() ? $this->_keys[$this->_key] false;
  8.   }
  9. ?>


Ten post edytował kwiateusz 28.09.2008, 07:38:12
Powód edycji: kwiateusz: podejrzewam ze to wina forum, problem rozwiazalismy, ale sprawdzamy czy nie zepsuje wiecej niz naprawi :)


--------------------
"Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! |
Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!!
Go to the top of the page
+Quote Post
Crozin
post 28.09.2008, 07:46:04
Post #8





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

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


@jarek_bolo: BBCode forum coś się posypało i usuwa dwukropki.
Go to the top of the page
+Quote Post
mike
post 28.09.2008, 08:51:40
Post #9





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


~jarek_bolo. ~Crozin a nie wiem czy wiecie ale w PHP5.3 będzie skrócona wersja tego operatora:
  1. <?php
  2.  
  3. (warunek logiczny) ? instrukcje_na_true;
  4.  
  5. ?>
Go to the top of the page
+Quote Post
Crozin
post 28.09.2008, 08:58:43
Post #10





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

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


@mike: przyznam się, że myślałem, że już 5.2.3 to wprowadzili smile.gif
Go to the top of the page
+Quote Post
eai
post 4.10.2008, 08:36:04
Post #11





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


@mike: a jeżeli warunek logiczny nie będzie spełniony to jaką wartość nam zwróci? NULL?
Go to the top of the page
+Quote Post
dr_bonzo
post 22.10.2008, 12:20:05
Post #12





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


@NuLL:
Cytat
Implmentacja bo szybsza - dziedziczenie jest strasznie powolne :]

Eeee? Mozesz to wyjasnic?

@mike
Cytat
Dziedziczenie stosuj tam gdzie masz zamiar skorzystać z polimorfizmu.

Eh? a z interfejsem to nie da sie wykonac polimorfizmu?

java:
Kod
interface ICostam {}
class CostamImpl_1 implements ICostam{}
class CostamImpl_2 implements ICostam{}
...
ICostam cos = new CostamImpl_1();
cos = CostamImpl_2();



smile.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
mike
post 22.10.2008, 12:36:17
Post #13





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(dr_bonzo @ 22.10.2008, 13:20:05 ) *
Eh? a z interfejsem to nie da sie wykonac polimorfizmu?
Zabiłeś mnie.
Nie sądziłem, że Ci to napisze ale ... poczytaj sobie o polimorfiźmie to pogadamy tongue.gif
To co pokazałeś to nie do końca jest polimorfizm.
Go to the top of the page
+Quote Post
dr_bonzo
post 22.10.2008, 13:18:03
Post #14





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


@mike: dalej nie czaje czemu niby polimorfizm [w programowaniu obiektowym] da sie zrobic tylko z uzyciem dziedziczenia.

moj kod powinien raczej wygladac:

Kod
interface ICostam { public function do(); }
class CostamImpl_1 implements ICostam{ ...do()}
class CostamImpl_2 implements ICostam{..do()}
...
ICostam cos = new CostamImpl_1();
cos.do();

cos = CostamImpl_2();
cos.do();


Bo interfejsy to wlasciwie puste klasy abstrakcyjne i pozwalajace na wykonanie wielodziedziczenia (extends + implements) == mamy dziedziczenie, wiec w czym problem?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
markac
post 9.11.2008, 20:28:36
Post #15





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 23.02.2005

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


Polimorfizm możemy osiągnąć poprzez dziedzicznie, a także przez implementację interfejsu.
Go to the top of the page
+Quote Post
chlebik
post 10.11.2008, 10:48:24
Post #16





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


Ja tylko umieszcze cytat. Reszte flame'a z checia poczytam smile.gif

Cytat
Polimorfizm jest trzecim podstawowym skladnikiem jezyka programowania zorientowanego obiektowo - zaraz po abstakcji danych i dziedziczeniu.

Dostarcza on kolejną metodę separacji interfejsu od implementacji, oddzielania co od jak.


Bruce Eckel, Thinking in Java ed. 4, s. 241.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post

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: 19.04.2024 - 22:57