anton_reut
@anton_reut
Начинающий веб-разработчик

ООП-упражнение (объектный анализ) на свободную тему «Приготовление борща», что скажете?

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

Ну и собственно сам код (местами страшен, знаю, но кто начинал сразу идеально?):

<?php

// ---------------- Класс Повар: покупает продукты, нарезает продукты, собирает ингредиенты ------

class Cook {

    public $money = 100;
    public $rawFood;
    public $ingredients = array();

    public function buyFood(Shop $shop) // Покупка продуктов.
    {
        $rawFood = $shop->sellFood($this->money);
        if($rawFood){
            $this->rawFood = $rawFood;
            return $this;
        }
        return $this;
    }

    public function prepareFood() // Подготовка продуктов.
    {
        foreach($this->rawFood->stock as $food)
        {
            $ingredient = $this->cut($food);
            $this->ingredients[] = $ingredient;
        }
        return $this;
    }

    public function cut($food) // Нарезка продуктов.
    {
       $cutted = $food; // Здесь некий процесс "нарезки", не придумал как отобразить.
		return $cutted;
    }

    public function combineFood(Pot $pot) // Складываем нарезанное в кастрюлю.
    {
        $pot->containingIngredients($this->ingredients);
        return $this;
    }


}

// ---------------- Класс Магазин: содержит продукты, продает продукты --------------------------

class Shop {

    public $foodStorage;
    public $productsTotalPrice = null;

    public function __construct(){
        $this->foodStorage = new FoodStock(); // Заполняем магазинные полки продуктами.
    }

    public function sellFood($money) // Продажа продуктов
    {
        $totalPrice = null;
        for($i = 0; $i < count($this->foodStorage->stock); $i++) {
            $totalPrice += $this->foodStorage->stock[$i]->price;
        }
        $this->productsTotalPrice = $totalPrice;

        if($this->productsTotalPrice < $money){ // Проверка хватит ли денег на всё.
            return $this->foodStorage;
        }
        else {
            return false;
        }
    }
}

// ---------------- Класс Плита: нагревает кастрюлю ---------------------------------------------

class Stove {

    public $temperature;

    public function turnOn() // Включаем плиту.
    {
        $this->temperature = 100;
        return $this->temperature;
    }
}

// ---------------- Класс Кастрюля: содержит воду и ингредиенты, варит борщ ---------------------

class Pot {

    public $water = null;
    public $containedIngredients = null;
    public $temperature = null;
    public $timer = null;

    public function addWater() // Добавляем воду.
    {
        $this->water = '2000 ml';
        return $this;
    }

    public function boil(Stove $stove) // Варка.
    {
        $temperature = $stove->turnOn();
        $this->temperature = $temperature;
        $this->timer = 60;
        if($temperature = 100 && $this->timer >= 60)
        {
            echo "Приготовлено!";
        }
    }

    public function containingIngredients($ingredients) // Заполнение кастрюли ингредиентами.
    {
        $this->containedIngredients = $ingredients;
        return;
    }
}

// ---------------- Класс Склад: содержит разные продукты --------------------------------

class FoodStock {
    public $stock = [];

    public function __construct(){
        $potato = new RawFood('25', 'potato');
        $carrot = new RawFood('15', 'carrot');
        $onion = new RawFood('20', 'onion');
        $meat = new RawFood('35', 'meat');

        // Вот тут хрень конечно но что-то не додумался как заполнить массив  циклом.
        $this->stock[] = $potato;
        $this->stock[] = $carrot;
        $this->stock[] = $onion;
        $this->stock[] = $meat;
    }
}

// ---------------- Класс Продукт: содержит цену и имя продукта ---------------------------

class RawFood {
    public $price;
    public $name;

    public function __construct($price, $name){
        $this->price = $price;
        $this->name = $name;
    }
}

// ---------------- ПРОЦЕСС ПРИГОТОВЛЕНИЯ ------------------------------------------------

$cook = new Cook();
$shop = new Shop(); // Заполняется автоматически.
$pot = new Pot();
$stove = new Stove();

$cook
    ->buyFood($shop)
    ->prepareFood()
    ->combineFood($pot);

$pot
    ->addWater()
    ->boil($stove);

И вроде даже работает (по крайней мере Notice, Warning и FatalError не выдает):
5dd062cc63480278751989.png
  • Вопрос задан
  • 225 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kova1ev
В код особо не всматривался, пардон, ориентировался на комментарии в коде.

Главное, имхо, в ООП это объединение некоторых данных и методов, которые изменяют эти данные, в единую логическую сущность под названием "класс". У вас как-то классов слишком дофига, и как-то непонятно они собраны в логические сущности. Например, класс "Повар" - там из данных вижу количество денег и массив с продуктами. Не особо вяжется это с сущностью "Повар". Или класс "Магазин" - в задаче приготовления борща нафига плодить такие сущности как склад магазина, например, или общая стоимость имеющихся в магазине продуктов. Понимаю, что задача надуманная, но все же.

Все вышенаписанное сугубое имхо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы