Зависимости объектов, переменные-члены (пример домашней работы) - PullRequest
1 голос
/ 16 июля 2011

Я нахожусь в процессе создания шерстяной фермы, где овцы стригут в машине, если они старые.Шерсть подсчитывается по цвету, есть черный и белый.

Каждый упомянутый атрибут случайный:

  • Возраст: Молодой = 0, Старый = 1
  • Цвет (черный, белый).

Я понимаю логику, но я не знаю, как отправить группы овец к машине, и я не могу заставить счетчик увеличиваться, если я делаюбольше овец.(Во время задания меня попросили сделать это).

Я прокомментировал код для дальнейшего понимания: http://gabrielmeono.com/theFarm.zip

<?php 
class Sheep{
    //Atributes
    const COLOR_WHITE = 'white';
    const COLOR_BLACK = 'black';
    const AGE_YOUNG = 0;
    const AGE_OLD = 1;

    private $_color;
    private $_age;

    //Random age and color
    public static function makeRandom(){
    if(rand(0, 1)){
        $color = self::COLOR_WHITE;
    }else{
        $color = self::COLOR_BLACK;
    }
        $age = rand(0, 1);
        return new self($color, $age);
    }

    public function __construct($color, $age){
        $this->_color = $color;
        $this->_age = $age;
    }
    //To check if the sheep was created and had all the atributes.
    public function report(){
        echo '<br>This sheep is '.$this->_color.' and '.$this->_age.'<br/>';//Old age is 1. 

        }

}


class machine {
    //The machine should shear wool only if the sheep is old. Old equals 1.
    public function Shear($collector){
        switch($collector)
        {
            case $sheep->_age = 1;
                echo 'Sheep sheared <br/>';
            break;
            default:
                echo 'This sheep is not ready to be sheared <br/>';
            break;

        }
    }
    //Here I should be able to count and separate wool by color.
    public function Counter($whiteWool, $blackWool, $count){ //This is my notion how it should start...Correct me if I'm wrong.


        }
    }

$sheep = Sheep::makeRandom();
$sheep -> report();
$machine = new machine ();
$machine -> Shear(0);
//I don't know how to connect the machine class with the sheep class.
//Batch creation and processing of sheep is beyond my understanding.
?>

Ответы [ 4 ]

2 голосов
/ 16 июля 2011

Как уже говорили другие, вы можете добавить овец в машину путем инъекции. Метод shear на самом деле имеет для меня наибольшее значение.

public function Shear(Sheep $sheep) {
   switch ($sheep->age) {} // etc.
}

На самом деле, я бы сделал еще один шаг, если бы овцы отреагировали на стрижку.

public static function makeRandom() {
   // ...
   return new $age ? OldSheep($color) : YoungSheep($color);
}

Или еще лучше:

private static $ages = array(0 => 'Old', 1 => 'Young')
public static function makeRandom() {
   // ...
   $sheepclass = $ages[$age] . 'Sheep';
   return new $sheepclass($color);
}

Тогда, когда пришло время стрижки:

interface Sheepable {
   function prepareToShear(machine $mach);
}

class OldSheep implements Sheepable {
   public function prepareToShear(machine $mach) {
      echo "Sheep is ready to be shorn";
      $mach->shear($this);
   }
}

class YoungSheep implements Sheepable {
   public function prepareToShear(machine $mach) {
      echo "Sheep is not ready to be shorn";
   }
}

class machine {
   //... etc.
   public function Shear(Sheepable $sheep) {
      $sheep->prepareToShear($this);
   }
}

Кстати, просьба о помощи с домашним заданием имеет тенденцию получить здесь отрицательный ответ.

2 голосов
/ 16 июля 2011

Вы можете внедрить объект Sheep в Machine, используя внедрение зависимостей ( todo: Google для него ).

например

$machine->addSheep($sheep);

Метод addSheep должен сохранить объект $sheep в переменной члена класса.Другие методы могут использовать эту переменную позже.

1 голос
/ 16 июля 2011

Я ненавижу фермерство.
Не просто копипаста. Прочтите его, задайте вопросы (, но не дублируйте ), и мы сможем помочь.

interface Animal{
    const AGE_YOUNG = 0;
    const AGE_OLD = 1;
    const COLOR_WHITE = 'white';
    const COLOR_BLACK = 'black';
    public function getAge();
    public function getColor();
}

interface Shearable extends Animal{
    public function shear();
    public function isSheared();
}

class Gorilla implements Shearable{
    // ♫ seeeeeee my vest, see my vest, made of real gorilla chest ♫
}

class Sheep implements Shearable{

    private $_isSheared = false;
    private $_age = null;
    private $_color = null;

    public static function create(){
        $age = rand(0, 1);
        $color = rand(0, 1)
            ? self::COLOR_WHITE
            : self::COLOR_BLACK;
        return new self($age, $color);
    }

    public function __construct($age, $color){
        $this->_age = $age;
        $this->_color = $color;
    }

    public function shear(){
        $this->_isSheared = true;
        return $this;
    }

    public function isSheared(){
        return $this->_isSheared;
    }

    public function getAge(){
        return $this->_age;
    }

    public function getColor(){
        return $this->_color;
    }

}

class Machine{

    private $_wool = array();

    public function shearLine(Array $line){
        $unshearable = array();
        foreach($line as $animal){
            if($this->shear($animal) !== true){
                $unshearable[] = $animal;
            }
        }
        return $unshearable;
    }

    public function shear(Shearable $animal){
        if(!$animal->isSheared() && $animal->getAge() == Shearable::AGE_OLD){
            $this->_wool[] = $animal->shear()->getColor();
            return true;
        }
        return $animal;
    }

    public function getWool(){
        return count($this->_wool);
    }

    public function getWoolByColor($color){
        return count(array_keys($this->_wool, $color));
    }

}

// build a machine
$machine = new Machine();

// brew up some sheep
$lineOfSheep = array();
for($i = 0; $i < 200; $i++){
    $lineOfSheep[] = Sheep::create();
}

//make some underwear
$unshearable = $machine->shearLine($lineOfSheep);

// see how many sheep still need water and sunlight
var_dump(count($unshearable));

// see how much and of what color your underwear will be
var_dump($machine->getWool(), $machine->getWoolByColor(Shearable::COLOR_WHITE));
1 голос
/ 16 июля 2011

Вы можете просто отправить $ sheep (созданный вами объект) в качестве аргумента функции в классе машины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...