Помогите разобраться с основами ООП

Обсуждаем, как правильно строить приложения
Ответить
Аватара пользователя
VLD-UKRAINE
Сообщения: 20
Зарегистрирован: 2017.04.29, 18:56
Контактная информация:

Помогите разобраться с основами ООП

Сообщение VLD-UKRAINE » 2017.05.01, 21:34

Привет!
Есть кусок код из работающей программы, он немного откоментирован, названия функций и всего остального понять не сложно. Мы не останавливаемся на том, что это решето с точки зрения безопасности, не правильно с точки зрения программирования (повторения, дублирующиеся данные и т.д.) мне так было понятнее и легче писать и искать ошибки, на все эти проблемы просьба не обращать внимание! Вопрос следующий - как бы это выглядело с использованием подходов ООП (классы, объекты, функции). Перечитал довольно много статей, читаю сейчас Разработка веб-приложений в Yii2 Марка Сафронова, тяжело въехать в эти понятия, а без их четкого понимания не возможно (во всяком случае для меня) правильно изменить существующий код. Копи-паст не интересен - хочу четко понимать что делается в программе! Понимаю вопрос может показаться странным, но сравнивая два варианта процедурный (я знаю что делает любая запятая) и ООП(как бы это должно было выглядеть) я четко пойму смысл! Спасибо!

Код: Выделить всё

<?php
$x=$_GET['del'];

switch ($x) {

case ($x==1): //Удаление заказа целиком приходит переменная del=1
                
             $res=mysql_query("select id_from_sklad, kolichestvo_zakaz from zakaz where id_old_zakaz=$_GET[id_old_zakaz]");
             while($row=mysql_fetch_assoc($res)) 
             {
                      $id_from_sklad=$row['id_from_sklad'];
                      $kolichestvo=$row['kolichestvo_zakaz'];
                      $return_sklad=return_sklad ($id_from_sklad, $kolichestvo);
                
             }
                               
            $del=mysql_query("delete from zakaz where id_old_zakaz=$_GET[id_old_zakaz]");
        
     if ($del=='TRUE')
            {
                
            echo "Заказа удален";
                        if(isset($_SESSION['id_clients'])){
                        $_SESSION['id_clients']=cancel();}
                        
            exit("<html><head><meta http-equiv='Refresh' content='1;  URL=index.php?view=zakaz'></head></html>");
            
            }          
           else {
           echo "Ошибка! Что то пошло не так удаление заказа!";
             } 

      break;
      
case ($x==2):    //Удаление позиции из заказа при оформлении заказа приходит переменная del=2
                
            $del=mysql_query("delete from zakaz where id_zakaz=$_GET[id_zakaz]");
            
             if ($del=='TRUE')
                    {
                       $id_from_sklad=$_GET['id_from_sklad'];
                      $kolichestvo=$_GET['kolichestvo'];
                      $return_sklad=return_sklad ($id_from_sklad, $kolichestvo);
                        if ($return_sklad==true){ 
                        
                        echo "Товар удален из заказа";
                    exit("<html><head><meta http-equiv='Refresh' content='1;  URL=index.php?view=new_zakaz&id_clients=$_SESSION[id_clients]'></head></html>");
                    
                    }  
                    }        
                    else {
                    echo "Ошибка! Что то пошло не так при оформлении заказа!";
                         }     
      
      break;
      
case ($x==3):   //Удаление позиции из заказа при редактировании заказа приходит переменная del=3
        
           $del=mysql_query("delete from zakaz where id_zakaz=$_GET[id_zakaz]");
           
            
             if ($del=='TRUE')
                    {
                      $id_from_sklad=$_GET['id_from_sklad'];
                      $kolichestvo=$_GET['kolichestvo'];
                      $return_sklad=return_sklad ($id_from_sklad, $kolichestvo);
                        if ($return_sklad==true){
                                                                    
                    echo "Товар удален из заказа";
                    exit("<html><head><meta http-equiv='Refresh' content='1;  URL=index.php?view=edit_zakaz&id_clients=$_GET[id_clients]&id_old_zakaz=$_GET[id_old_zakaz]'></head></html>");
                    }
                    }          
                    else {
                    echo "Ошибка! Что то пошло не так при редактировании заказа!";
                         }     
       break;   
       
       
case ($x==4):    //возврат на склад после оплаченного заказа приходит переменная del=4
                
            $del=mysql_query("update zakaz set vozvrat=1, sum_position_sklad=0 where id_zakaz=$_GET[id_zakaz]");
            
             if ($del=='TRUE')
                    {
                       $id_from_sklad=$_GET['id_from_sklad'];
                      $kolichestvo=$_GET['kolichestvo'];
                      $return_sklad=return_sklad ($id_from_sklad, $kolichestvo);
                        if ($return_sklad==true){ 
                        
                        echo "Товар возвращен на склад";
                    exit("<html><head><meta http-equiv='Refresh' content='1;  URL=index.php?view=edit_zakaz&id_clients=$_GET[id_clients]&id_old_zakaz=$_GET[id_old_zakaz]'></head></html>");
                    
                    }  
                    }        
                    else {
                    echo "Ошибка! Что то пошло не так при оформлении возврата!";
                         }     
      
      break;                      
     
 }       
?>


Аватара пользователя
ElisDN
Сообщения: 5406
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение ElisDN » 2017.05.01, 23:17

Процедурный подход удобен и быстр, пока процедур и переменных меньше сотни и всё вмещается в голове. На бОльших масштабах уже начинается путаница. Там плоский код уже желательно компоновать в процедуры, процедуры в объекты, объекты в модули, модули в подсистемы и т.п. по нарастающей.

По вашему примеру в ООП это будет контроллер с разными экшенами для каждого case:

Код: Выделить всё

class OrderController extends Controller
{
    ...
    public function actionRemove($id)
    {
        $order = $this->orderRepository->get($id);
        $this->transaction->wrap(function () use ($order) {
            foreach ($order->getItems() as $item) {
                $this->warehouse->rollback($item->getId(), $item->getAmount();
            }
            $this->orderRepository->remove($order);
        });
        $this->session->setFlash('success', 'Заказ удалён');
        return $this->redirect(['index']);
    }
    ...
}
В ООП мы оперируем объектами реального или придуманного мира. Вместо переменных и SQL-запросов мы думаем именно объектами заказа $order со строками $order->getItems(), хранилищем в БД $orderRepository, объектом склада $warehouse, заказчиками $customer и прочими вещами. И все ошибки будут вылетать в виде Exception-ов.

А чтобы сделать тонкий контроллер можно и весь этот код перенести в отдельный сервис:

Код: Выделить всё

class OrderController
{
    public function actionRemove($id)
    {
        $this->orderService->remove($id);
        $this->session->setFlash('success', 'Заказ удалён');
        return $this->redirect(['index']);
    }
}
Это и поможет отдельно тестировать код сервиса, и избавит от копипасты кода из предыдущего контроллера в ещё один такой же контроллер для API.

ООП - это именно парадигма. Особый образ мышления, где мы больше думаем о смысле, а не о коде.

По теме можно почитать:

http://www.elisdn.ru/blog/95/functional-vs-oop
http://www.elisdn.ru/blog/104/domain-entities-modelling

А если хотите подробного живого объяснения ООП на тридцати реальных примерах, то посоветую интенсив по ООП.

И лучше эту тему здесь перенести в раздел архитектуры.

Аватара пользователя
VLD-UKRAINE
Сообщения: 20
Зарегистрирован: 2017.04.29, 18:56
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение VLD-UKRAINE » 2017.05.02, 09:47

Мда, вопросов сразу стало до неприличного много: правильно ли я понимаю - в моем случае рассматриваемый кусок кода необходимо переосмыслить - подход такой: есть заказ - это отдельный класс, с этим заказом происходят определенные действия - удаление, редактирование, добавление позиций, удаление позиций, оплата и отправка - это все действия (акшины) в этом классе описываемые уже отдельными функциями, в глобальном масштабе - товар это класс, его категории это new-классы от товара, склад - это класс, действия на складе - это акшины с классом товар, и так всю логику надо уложить в стройную картину? А есть какой то конструктор для ООП что бы можно было визуализировать логику или листок и карандаш?

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение za4me » 2017.05.02, 10:13

Книгу Зандстры прочтите.

Аватара пользователя
VLD-UKRAINE
Сообщения: 20
Зарегистрирован: 2017.04.29, 18:56
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение VLD-UKRAINE » 2017.05.02, 10:54

PHP. Объекты, шаблоны и методики программирования?

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение za4me » 2017.05.02, 11:53

VLD-UKRAINE писал(а):
2017.05.02, 10:54
PHP. Объекты, шаблоны и методики программирования?
Да.

Аватара пользователя
VLD-UKRAINE
Сообщения: 20
Зарегистрирован: 2017.04.29, 18:56
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение VLD-UKRAINE » 2017.05.02, 12:04

Спасибо за совет! Уже читаю!

Аватара пользователя
VLD-UKRAINE
Сообщения: 20
Зарегистрирован: 2017.04.29, 18:56
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение VLD-UKRAINE » 2017.05.02, 12:49

По поводу интенсивна по ОПП - согласен, очень полезно - но я люблю не спеша разобраться в общих вопросах, а за деталями уже на обучение! Так что интенсив, для меня, рановато! За приглашение спасибо!

Аватара пользователя
ElisDN
Сообщения: 5406
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение ElisDN » 2017.05.02, 13:01

VLD-UKRAINE писал(а):
2017.05.02, 12:49
По поводу интенсивна по ОПП - согласен, очень полезно - но я люблю не спеша разобраться в общих вопросах, а за деталями уже на обучение! Так что интенсив, для меня, рановато! За приглашение спасибо!
Так он и начинается как раз с самых общих вопросов и с того, зачем это вообще нужно. А дальше по нарастающей.

Аватара пользователя
VLD-UKRAINE
Сообщения: 20
Зарегистрирован: 2017.04.29, 18:56
Контактная информация:

Re: Помогите разобраться с основами ООП

Сообщение VLD-UKRAINE » 2017.05.02, 16:21

Да. Я читал описание. Обязательно послушаю! Спасибо!

Ответить