Задать вопрос

Зачем нужен ООП?

Собственно сабж. Не понимаю зачем нужен ООП, пишу на php/python, часто сталкиваюсь с всяческими классами при работе с CMS/Фреймворками, но сам никогда не пишу никаких классов, т.к. совершенно не понимаю пользы. Разве что разграничивание пространства имен, в остальном получается только увеличение количества строк и ухудшение читабельности кода.
  • Вопрос задан
  • 23975 просмотров
Подписаться 14 Оценить 1 комментарий
Ответ пользователя m-haritonov К ответам на вопрос (11)
@m-haritonov
В PHP ООП нужен, когда нескольким функциям требуется обращаться к общим переменным.

Без ООП пришлось бы писать код вида:
<?php
namespace something1 {
    function set($value) {
        $GLOBALS['something1']['someVariable'] = $value;
    }

    function get() {
        return $GLOBALS['something1']['someVariable'];
    }
}

namespace something2 {
    function set($value) {
        $GLOBALS['something2']['someVariable'] = $value;
    }

    function get() {
        return $GLOBALS['something2']['someVariable'];
    }
}

namespace {
    \something1\set(1);
    \something2\set(2);

    print \something1\get();
    print \something2\get();
}

и:
<?php
namespace something {
    function set($instanceName, $value) {
        $GLOBALS[$instanceName]['someVariable'] = $value;
    }

    function get($instanceName) {
        return $GLOBALS[$instanceName]['someVariable'];
    }
}

namespace {
    \something\set('instance1', 1);
    \something\set('instance2', 2);

    print \something\get('instance1');
    print \something\get('instance2');
}


С ООП можно написать:
<?php
class Something1 {
    private $someVariable;

    function set($value) {
        $this->someVariable = $value;
    }

    function get() {
        return $this->someVariable;
    }
}

class Something2 {
    private $someVariable;

    function set($value) {
        $this->someVariable = $value;
    }

    function get() {
        return $this->someVariable;
    }
}

$something1 = new Something1();
$something1->set(1);

$something2 = new Something2();
$something2->set(2);

print $something1->get();
print $something2->get();

и:
<?php
class Something {
    private $someVariable;

    function set($value) {
        $this->someVariable = $value;
    }

    function get() {
        return $this->someVariable;
    }
}

$something1 = new Something();
$something1->set(1);

$something2 = new Something();
$something2->set(2);

print $something1->get();
print $something2->get();


Если брать web приложение на php, задача которого состоит в том, чтобы сгенерировать html код (который будет отправлен браузеру) и предоставить возможность разделения приложения на модули, то ООП в качестве основы такого приложения может быть излишен, т.к. все модули будут выполнять лишь одно действие (возвращать html код) и им не потребуется сохнанять состояние между вызовами, т.к. результат работы модуля не будет больше изменяться во время вызова web приложения (модуль сгенерирует html и отправит его браузеру, а в браузере, где в javascript применяется ООП, этот html код уже будет изменяться во время работы).

Без ООП серверная часть web приложения может выглядеть так:
<?php
namespace modules {
    function layout($title, $contentHtml, $footerHtml) {
        return '<!doctype html>
            <html>
            <head>
                <meta charset="utf-8">
                <title>' . htmlspecialchars($title) .'</title>
            </head>
            <body>
                <div class="content">
                    ' . $contentHtml . '
                </div>

                <div class="footer">
                    ' . $footerHtml . '
                </div>
            </body>
            </html>
        ';
    }

    function contacts() {
        return 'Адрес: ..., телефон: ...';
    }

    function copyright() {
        return '© Моя фирма';
    }
}

namespace {
    if (strtok($_SERVER['REQUEST_URI'], '?') === '/contacts') {
        print \modules\layout('Контакты', \modules\contacts(), \modules\copyright());
    }
}

А с ООП так (как можно заметить, модули реализовалы в виде классов, которые содержат только 1 метод, т.е. класс здесь излишен):
<?php
namespace modules {
    class Layout {
        public $title;
        public $contentHtml;
        public $footerHtml;

        public function execute() {
            return '<!doctype html>
                <html>
                <head>
                    <meta charset="utf-8">
                    <title>' . htmlspecialchars($this->title) .'</title>
                </head>
                <body>
                    <div class="content">
                        ' . $this->contentHtml . '
                    </div>

                    <div class="footer">
                        ' . $this->footerHtml . '
                    </div>
                </body>
                </html>
            ';
        }
    }

    class Contacts {
        public function execute() {
            return 'Адрес: ..., телефон: ...';
        }
    }

    class Copyright {
        public function execute() {
            return '© Моя фирма';
        }
    }
}

namespace {
    if (strtok($_SERVER['REQUEST_URI'], '?') === '/contacts') {
        $layout = new \modules\Layout();
        $layout->title = 'Контакты';
        $layout->contentHtml = (new \modules\Contacts())->execute();
        $layout->footerHtml = (new \modules\Copyright())->execute();

        print $layout->execute();
    }
}


Но если бы PHP использовался для разработки не серверного, а клиентского приложения, где сгенерированная визуальная часть сохранялась бы в оперативной памяти долгое время и пользовательские действия изменяли бы её, то использование ООП может быть удобным. Но опять же, ООП - это просто способ организации кода, в основе которого лежат всё те же подпрограммы (методы) и этот способ организации не всем может понравиться.
Ответ написан
Комментировать