ООП обясните

Статус
В этой теме нельзя размещать новые ответы.

rasandrey

Участник
Регистрация
2 Апр 2009
Сообщения
214
Реакции
6
Прочитал немало литературы, но так и не смог понят смысла ООП. Только не нужно бросаться ссылками, а просто объясните, если можно, на примере. Буду благодарен
 
Только не нужно бросаться ссылками, а просто объясните, если можно, на примере.
Я не эксперт в программировании, но тоже интересуюсь.

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

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

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

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

В книжках все примеры по ООП очень кратенькие, их легко держать в голове ЦЕЛИКОМ, поэтому не очень понятно, зачем их разбивают на куски и этим только усложняют. А запихнуть реальный сложный проект в книжку - тоже бредово, никто из читателей в него вникать, разбираться не будет. Поэтому ответа на вопрос "какая польза от ООП" ты из книжек скорее всего не почерпнешь. Просто знай, что оно такое есть, а когда ты столкнешься с по-настоящему большим проектом, который кодить "сплошным потоком" будет сложно - ты сам захочешь его разбить на куски, чтобы упростить себе жизнь. И вот тогда-то ты об ООП и вспомнишь. А до тех пор это просто куча лишних бессмысленных телодвижений, которые ни хрена не упрощают жизнь, что бы там в книге не писали.
 
venetu
Все отлично расписал, не добавить, не прибавить. От себя еще добавлю, если проект не очень сложный, то в большинстве случаев ООП как раз таки мешает чем помогает.
 
хороше расписано, но все равно не понял :)
У меня есть функция и у меня есть класс с методами, в чем разница? Ну в классе несколько методов... но я же могу создать и столько же функций отдельно от класса. Или я не прав?
 
Класс, как система функций и переменных, позволяет максимально эффективно вести работу с функциями
Конечно, можно создать отдельный файл с нужными функциями и его инклюдить в скрипты, но с ООП это намного проще

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

 
хороше расписано, но все равно не понял :)
У меня есть функция и у меня есть класс с методами, в чем разница? Ну в классе несколько методов... но я же могу создать и столько же функций отдельно от класса. Или я не прав?

Давай на примере. Возьмем простой пример - физический адрес юзера, который состоит из Страны, Города, Почтового Индекса, Улицы и т.д. Ничто не мешает тебе создать несколько переменных:
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 и все. Остальная программа останется нетронутой.


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

Ты можешь бить на куски и другими способами, а можешь и вообще не бить. Если с головой все в порядке, то вполне реально держать в ней даже сравнительно большой проект типа там форума, и в каждый момент времени в каждой строчке кода вполне отчехлять, что тут происходит и в каком состоянии сейчас находится программа и все переменные в ней. Но в большом проекте ты рано или поздно начнешь даже не путаться, а просто тратить больше времени на то, чтоб вспомнить/разобраться/выяснить, что куда уходит. Я собственно поэтому и говорю, что пока "функциями" не сделаешь большой проект - ты не поймешь, чем они неудобны. Потому что на самом деле они ппц как удобны. Просто виндовс ими не напишешь - утонешь.
 
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);
  }
заметим что функции разные а иногда и отличаются в корне плодь до того что и вызов и результат возвращается иначе
 
rasandrey, если бы ты был компьютером, тебе было бы все равно - как писать. Человек изобрел ООП в силу своей короткой памяти и тяги все вокруг классифицировать ;)
В ООП ты оперируешь объектами, а не функциями - это позволяет тебе быстрее "управлять" своим кодом.
Представь, если бы ты двигал не руками\ногами, а каждой клеткой отдельно - тогда если бы ты был какой-нибудь инфузорией, то особо бы не парился, но вот управлять своим человеческим телом скорее всего вообще бы не смог :)
При повышении сложности системы, увеличении объема информации, человеку необходимо переходить на более высокие уровни абстракции и классифицировать, классифицировать, классифицировать. Мы так устроены, поэтому и изобрели ООП. :)
Короче, преимущества ООП появляются при определенных условиях. Априори их нет. Так что твой вопрос даже не совсем корректен :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху