ООП обясните

Тема в разделе "PHP", создана пользователем rasandrey, 27 июн 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    Прочитал немало литературы, но так и не смог понят смысла ООП. Только не нужно бросаться ссылками, а просто объясните, если можно, на примере. Буду благодарен
     
  2. soot

    soot

    Регистр.:
    22 дек 2008
    Сообщения:
    164
    Симпатии:
    28
    Я не эксперт в программировании, но тоже интересуюсь.
    Вот тут мне нравиться как разжевано.
    На словах выглядит легко и просто, но только до ходит до дела, начинают сложности восприятия.
    Это короче, примерно так :D :
    Есть короче функция - она чето делает.
    Но одно функцией дело не обходиться и они как бы их используется много.
    Часто функции повторяются - куча логически связанных функций - это класс.
    Его можно вызывать в процессе дела и этот комплекс логических функций будет выполняться.
    Т.е. не надо будет сто раз повторять одно и тоже. А просто создать класс и вызывать его.

    Но возможно я не прав :D.
     
  3. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    общий смысл - объединить в одном месте объекты и методы работы с ними. ты вопросы конкретные задавай, если что то непонятно. а то библию в двух словах тяжело передавать.
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Распространенная на самом деле проблема, среди новичков которые не кидаются делать сразу по книжке и не ходят потом с гордым видом "У меня все на ООП", а изначально пытаются думать. А реальная польза от ООП как-то сразу обычно и не придумывается, зато недостатки видны - куча лишнего кода, куча методов "на всякий случай", запутанная последовательность выполнения.. Короче твой вопрос очень уместен.

    Для того, чтобы понять прелесть ООП (именно самому понять, прочувствовать) - надо сделать какой-либо большой проект используя функциональный подход. А потом внести в него какие-либо значительные исправления. Или поработать с кем-то вдвоем, втроем. Попытаться распределить обязанности.

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

    В книжках все примеры по ООП очень кратенькие, их легко держать в голове ЦЕЛИКОМ, поэтому не очень понятно, зачем их разбивают на куски и этим только усложняют. А запихнуть реальный сложный проект в книжку - тоже бредово, никто из читателей в него вникать, разбираться не будет. Поэтому ответа на вопрос "какая польза от ООП" ты из книжек скорее всего не почерпнешь. Просто знай, что оно такое есть, а когда ты столкнешься с по-настоящему большим проектом, который кодить "сплошным потоком" будет сложно - ты сам захочешь его разбить на куски, чтобы упростить себе жизнь. И вот тогда-то ты об ООП и вспомнишь. А до тех пор это просто куча лишних бессмысленных телодвижений, которые ни хрена не упрощают жизнь, что бы там в книге не писали.
     
    rasandrey и soot нравится это.
  5. saifu

    saifu

    Регистр.:
    13 фев 2008
    Сообщения:
    337
    Симпатии:
    38
    venetu
    Все отлично расписал, не добавить, не прибавить. От себя еще добавлю, если проект не очень сложный, то в большинстве случаев ООП как раз таки мешает чем помогает.
     
  6. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    хороше расписано, но все равно не понял :)
    У меня есть функция и у меня есть класс с методами, в чем разница? Ну в классе несколько методов... но я же могу создать и столько же функций отдельно от класса. Или я не прав?
     
  7. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    Класс, как система функций и переменных, позволяет максимально эффективно вести работу с функциями
    Конечно, можно создать отдельный файл с нужными функциями и его инклюдить в скрипты, но с ООП это намного проще

    также при использовании ООП появляются дополнительные возможности работы с функциями, ф-я может иметь параметр 'private' т.е. быть видимой только внутри класса, функции можно наследовать(extends) из другого класса в текущий класс, а также при параметре 'static' вызывать в скрипте без назначения объекта - my_class::my_function();

    достаточно подробно теория ООП объясняется в уроках 1,2 этого видео курса
     
    rasandrey нравится это.
  8. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Давай на примере. Возьмем простой пример - физический адрес юзера, который состоит из Страны, Города, Почтового Индекса, Улицы и т.д. Ничто не мешает тебе создать несколько переменных:
    PHP:
    $Country 'Беларусь';
    $City 'Гомель';
    .....
    Но для удобства имеет смысл запихнуть эти переменные в одну:
    PHP:
    $address = Array();
    $address['Country'] = 'Беларусь';
    $address['City'] = 'Гомель';
    $address['Index'] = 02154;
     ..
    Чем это круче? Тем, что если ты сделаешь, допустим, функцию checkAddress, то в первом случае тебе пришлось бы вызывать ее так:
    PHP:
    checkAddress($Country$City$Index$Street$House$Flat);
    а во втором -
    PHP:
    checkAddress($address);
    Помимо очевидного плюса в том, что не надо помнить порядок следования параметров (сначала Индекс? Или сначала Страну, потом Индекс? Или Индекс в самом конце, после Квартиры?) - есть еще другой, менее очевидный плюс. У тебя "Остальная программа" учится работать с типом данных "адрес юзера" - и не вникает в его внутреннее устройство (опять-таки, не знает что там за чем идет и сколько его всего). И потом, когда ты выяснишь, что юзеры, бывает, живут в разных городах с одним и тем же названием, и захочешь ввести еще и параметр Область, чтобы их как-то отличать, тебе не придется лазить по всей программе и везде дописывать
    PHP:
    checkAddress($Country$Region$City$Index$Street$House$Flat);
    - вместо этого ты подправишь только сам объект $address, добавив в него поле $Region и все. Остальная программа останется нетронутой.


    То есть, отвечая тебе на твой вопрос: Да, ничто не мешает тебе создать несколько функций и несколько глобальных переменных, и во многих случаях (большинстве, с которыми ты столкнешься) так будет и проще и удобней. Объект - это просто "обертка" над этими функциями, которая позволяет тебе их выделить в более-менее обособленную часть. Вынести за основной проект, "вычеркнуть из своей памяти". Типа вот, есть логически законченный кусок, мы его сделали и отложили, больше не трогаем.

    Ты можешь бить на куски и другими способами, а можешь и вообще не бить. Если с головой все в порядке, то вполне реально держать в ней даже сравнительно большой проект типа там форума, и в каждый момент времени в каждой строчке кода вполне отчехлять, что тут происходит и в каком состоянии сейчас находится программа и все переменные в ней. Но в большом проекте ты рано или поздно начнешь даже не путаться, а просто тратить больше времени на то, чтоб вспомнить/разобраться/выяснить, что куда уходит. Я собственно поэтому и говорю, что пока "функциями" не сделаешь большой проект - ты не поймешь, чем они неудобны. Потому что на самом деле они ппц как удобны. Просто виндовс ими не напишешь - утонешь.
     
    rasandrey нравится это.
  9. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    venetu хороший пример.
    данный метод служит для упрощения что бы не бегать как уже сказано выше по всему коду и править везде 1 функцию,
    когда я перешел на ООП )
    именно так я и делал как описановыше, массивы, классы, удобно до ужаса)
    чем а тем что если баг полез то зале в 1 фаил переписал 1 функцию и все прекрасно... и везде все рак же работает...
    так можно строить совместимоть версия скажем на собственном движке
    так же чем хорош еще ооп
    как пример вы используете MySQL, но вдруг меняете СУБД и что дальше ?
    переписывать тонны кода ?
    а нет тут то и поможет нам обертка
    пример я использую 1 СУБД но с разными драйверами MySQL и MySQLi
    и влюбой момент меняю их местами и ничего не страдает, так же у меня есть и MSSQL
    PHP:
      /**
       * Возвращение результата в виде массива
       * @param  MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
       * @return  mixed результат
       */
      
    function result($type=MYSQL_ASSOC) {
        return @
    mysql_fetch_array($this->id,$type);
      }
      
    /**
       * Возвращает количество рядов результата запроса
       * @return  mixed результат
       */
      
    function rows() {
        return @
    mysql_num_rows($this->id);
      }
    PHP:
      /**
       * Возвращение результата в виде массива
       * @param  MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
       * @return  mixed результат
       */
      
    function result($type=MYSQL_ASSOC) {
        return @
    mysqli_fetch_array($this->id,$type);
      }
      
    /**
       * Возвращает количество рядов результата запроса
       * @return  mixed результат
       */
      
    function rows() {
        return @
    mysqli_num_rows($this->id);
      }
    заметим что функции разные а иногда и отличаются в корне плодь до того что и вызов и результат возвращается иначе
     
  10. dzaraev

    dzaraev Писатель

    Регистр.:
    28 июн 2010
    Сообщения:
    5
    Симпатии:
    1
    rasandrey, если бы ты был компьютером, тебе было бы все равно - как писать. Человек изобрел ООП в силу своей короткой памяти и тяги все вокруг классифицировать ;)
    В ООП ты оперируешь объектами, а не функциями - это позволяет тебе быстрее "управлять" своим кодом.
    Представь, если бы ты двигал не руками\ногами, а каждой клеткой отдельно - тогда если бы ты был какой-нибудь инфузорией, то особо бы не парился, но вот управлять своим человеческим телом скорее всего вообще бы не смог :)
    При повышении сложности системы, увеличении объема информации, человеку необходимо переходить на более высокие уровни абстракции и классифицировать, классифицировать, классифицировать. Мы так устроены, поэтому и изобрели ООП. :)
    Короче, преимущества ООП появляются при определенных условиях. Априори их нет. Так что твой вопрос даже не совсем корректен :)
     
Статус темы:
Закрыта.