За последние 24 часа нас посетили 15896 программистов и 1544 робота. Сейчас ищут 1055 программистов ...

Интерфейсы объектов для блондинок

Тема в разделе "Вопросы от блондинок", создана пользователем artuska, 24 дек 2009.

  1. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Вообщем, мне надо как-то очень просто, лаконично, четко и так, чтобы стало очевидно, объяснить, зачем нужны интерфейсы объектов и с чем их едят.

    Вот пример с пхп.нет:
    Код (Text):
    1. interface iTemplate {
    2.  public function setVariable($name, $var);
    3.  public function getHtml($template);
    4. }
    5.  
    6. class Template implements iTemplate {
    7.  private $vars = array();
    8.  
    9.  public function setVariable($name, $var){
    10.   $this->vars[$name] = $var;
    11.  }
    12.  
    13.  public function getHtml($template){
    14.   foreach($this->vars as $name => $value){
    15.    $template = str_replace('{' . $name . '}', $value, $template);
    16.   }
    17.  
    18.   return $template;
    19.  }
    20. }
    Ну и что? Я нихера не понял! Ну в интерфейсе две функции, которые ничего не делают (мы их просто описали) и в классе эти же функции. И что дальше? Возьму удалю интерфейс, но всё будет работать без проблем! В чём прикол?
    Не, ну или опишите мне реальную ситуацию, где без интерфейса объекта ну никак.
     
  2. Интерфейсы позволяют тебе гарантировать, что какой либо используемый объект реализует минимально необходимый набор функций.
    Суть в том, что пока ты пишешь программы сам, ты можешь договорится сам с собой о интерфейсе к чему либо, если же разрабочиков несколько, и тебе нужно контролировать код, который еще не написан, и будет написан не тобой.

    Хороший пример, реализация плагинов: ты описываешь интерфейс, в нашем случае, это будет IPlugin, например:

    PHP:
    1.  
    2. <?php
    3. interface IPlugin {
    4.     function register(array $config);
    5.     function unregister();
    6.     function process($data);
    7. }
    8.  
    И ты получаешь интерфейс плагина, и знаешь, что плагин будет реализовать эти три обязательные функции для работы.
    И можешь больше не думать о том, как обработать корректно ошибки, написанные автором очередного плагина.
    И можешь в исходном коде проверить, правильный ли это плагин, и от твоей ли он системы:

    PHP:
    1.  
    2. <?php
    3. class UserPlugin() {}
    4.  
    5. if (!in_array('IPlugin', class_implements('UserPlugin'))) { echo 'Неправильный формат плагина!'; }
    6.  
    На самом деле, интерфейсы становятся очень нужны при использовании многих паттернов категории Inverse of Control, того же Dependency Injection, но это уже совсем другая история, не для изучающих основы PHP =)
     
  3. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    флоппик, спасибо за простое объяснение. Просто, никогда не приходилось участвовать в проектах, где нужно разделять задачи с несколькими программистами :(

    Вообщем, мне этого объяснения достаточно, тему можно считать закрытой.
     
  4. Просто я знаю, что вменяемого описания "зачем нужны интерфейсы" я за все время ни разу не встретил ни в одном учебнике или нормальной статье.
     
  5. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Вот поэтому я и задал этот вопрос, да еще и в разделе «для блондинок» — я тоже абсолютно нигде не встречал нормального объяснения. Все в статьях приводят каие-то примеры и т.д, но абсолютно нигде не было строчки подобной этой — «Суть в том, что пока ты пишешь программы сам, ты можешь договорится сам с собой о интерфейсе к чему либо, если же разрабочиков несколько, и тебе нужно контролировать код, который еще не написан, и будет написан не тобой.» Вот если бы таким нормальным языком было написано, на том же пхп.нет, я бы никогда не задавал таких вопросов :)
     
  6. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    флоппик
    опа пропажа объявилась.. ))
     
  7. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Немного отвлекаясь от PHP.

    Если взять Java, то там еще как минимум один мощный способ использовать интерфейсы.
    В Java нельзя создать объект типа интерфейс, однако можно преобразовать объект, класс которого реализует интерфейс, к этому интерфейсу.
    Зачем? Для увеличения гибкости метода.
    Так например есть метод "поджечь". Входным параметром метода является объект, который зажигает. Например "Зажигалка". Таким образом мы можем создать метод -
    Код (Text):
    1. поджечь(Зажигалка мояЗажигалка)
    По сути нам нужно от объекта реализации всего лишь одного действия - "зажигать". И нам абсолютно все равно какие у него свойства. Однако таким объявлением мы запрещаем передавать любые другие объекты, которые не являются "Зажигалками" или потомками "Зажигалки".
    Вот здесь может пригодится интерфейс. Мы создаем интерфейс "Зажигатель" с единственным методом "зажги". А далее говорим что "Зажигалка" реализует этот интерфейс. А еще мы говорим что "Танк" тоже реализует метод "зажги".
    Изменяем объявление метода
    Код (Text):
    1. поджечь(Зажигатель мойЗажигатель)
    и теперь мы можем передавать этому методу хоть "Зажигалку", хоть "Танк", хоть "ГазовуюПлиту" причем реализация метода "зажги" будет зависеть от того, какой объект мы передали. Правда и сделать с этим объектом мы сможем только то что объявлено в интерфейсе "Зажигатель"
     
  8. Вот хороший пример, как люди, которые умеют программировать, не умеют обьяснять.

    Ты в который раз, как во всех учебниках, обьяснил "как это сделать", но не обьяснил "почему и зачем" это приходится делать на реальном примере, который показал бы востребованность интефейсов.
     
  9. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    флоппик
    я тоже всегда вхожу в ступор когда думаю как же объяснить необходимость интерфейсов реально. Это надо объяснять на примере двух разных модулей скорее всего.
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Костян
    ты какой день подряд отмечаешь новый год? :) написали же :)
    Для меня интерфейс - это тип. Такой же как int, string, array etc.
    Т.е. это декларация того, что данный код будет себя вести прогнозируемым образом :)
     
  11. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Simpliest
    ну или суть в том, что без раницы пишешь ты программы сам или нет, с помощью интерфейса ты можешь декларирорвать способности полиморфизма.
     
  12. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    может поможет (простой пример):
    PHP:
    1.  
    2. <?php
    3. // то, что давно написано и мы можем использовать
    4. interface IOperation {
    5.   public function operation($a, $b);
    6. }
    7.  
    8. // то, что мы написали сами
    9. class MySum implements IOperation {
    10.   public function operation($a, $b) {
    11.     return (int)$a + (int)$b;
    12.   }
    13. }
    14. // то, что мы написали сами
    15. class MyMult implements IOperation {
    16.   public function operation($a, $b) {
    17.     return (int)$a * (int)$b;
    18.   }
    19. }
    20.  
    21. // где-то в другом давно написанном коде и хорошо работающем
    22. function doOperation($isum, $a, $b) {
    23.   if (!($isum instanceof IOperation)) return;
    24.   echo "<p>" . $isum->operation($a, $b) . "</p>\r\n";
    25. }
    26.  
    27. // наши вызовы
    28. doOperation(new MySum(), 3, 4);
    29. doOperation(new MyMult(), 3, 4);
    30. ?>
    31.  
    Ща попробую по-простому (на самом простом примере).
    Предположим: doOpearion выводит результаты нашей могучей мозговой деятельности на вэб (проверяет результат, смотрит в кэш, формирует страницу из темплейтов и тд и тп).
    Наша задача только менять значения. А на все остальную работу не влиять никак.
    поэтому нам достаточно передать свой класс в качестве параметра, который гарантировано реализует те функции, которые нужны будут давно написанному коду (который хорошо работает).
    некое API.

    чОрт, я старалсО.
     
  13. obsrv
    Люди приходят к пониманию, "как это сделать" с учебником, или без, если понимают, зачем это делать вообще. )

    Поэтому говорю еще раз: для объяснения - абстрактные примеры - не работают.
     
  14. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    м, интерфейсы - тема ацки удобная.. так как даже своя с нуля писанная система через 3-4-6 месяцев - как чужая... и черт его знает, что там у модулей обязательным должно быть...

    а так, даешь ему интерфейс, если не соответствует хоть в малом - с ходу дает fatal error, а не так, что в самый ответственный момент вдруг не понятно откуда сыпется ошибка..

    жаль, что в интерфейсах нельзя описывать атрибуты для класса..
     
  15. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    можете использовать абстрактные классы.
     
  16. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    iliavlad
    Множественное наследование в php отсутствует, так что абстрактные классы не всегда подходят
     
  17. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    topas
    И это печально - они удобнее интерфейсов :) поскольку могут нести уже реализацию кода.
     
  18. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    я не знаю просто как это объяснить человеку который впервые слышит слова "интерфейсы" в обсуждаемом контексте...
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Чтобы человек легко понял, как кусок по-сути бесполезного кода может быть интерфейсом, ему сначало надо привыкнуть к тому, что кусок полезного кода может быть объектом.
    Если попробовать ручку от холодильника (интерфес) приделать к неподходящей модели холодильника (объект), то возникнет ошибка (нет нужных креплений). Если ручка подошла, значит холодильник правильный.
     
  20. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Спам что ли?

    ingra, каким образом данный вопрос относится к теме топика?
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    эм
    PHP:
    1. if(!($this instanceof IPlugin)) {}
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вот этим:
     
  23. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Simpliest

    может, моя особенность, я с помощью интерфейсов стандартизирую классы.. так, например, есть системка, построенная на паттерне MVC. в итоге контроллеры должны соответствовать интерфейсу контроллеров, модели - моделей и т.п.

    не все можно в классы-родители вынести.

    так, для примера. контроллер обязательно должен реализовывать несколько функций. у каждого они разные по содержанию, но должны быть у всех. а месяцев через несколько это имеет свойство забываться. и всплывать в самый неподходящий момент в виде плавающей критической ошибки...


    а атрибуты да, их можно в классе-родителе задавать..
     
  24. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    жесть
     
  25. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    DarkElf
    Эм. А я тут причем? :)