[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача по ООП(упростить скрипт)
lodas
Здравствуйте уважаемые форумчане. Есть у меня задание по классу Человек(см. в приложенной картинке). Я ее как мог реализовал, правильно ли у меня получилось? Можно ли как то его упростить?


<?php header("Content-type: text/html; Charset= utf-8") ;

define('MAN', "мужик");
define('WOM', "женщина");

class Man
{
protected $name; // имя
protected $age; // возраст
protected $pol; // пол
protected $massa;// вес

public function __construct($nam, $ag, $pol, $mass)
{
$this->name=$nam;
$this->age=$ag;
$this->pol=$pol;
$this->massa=$mass;
}

public function prints($object) //вывод мужчины/женщины
{
return "Имя: ".$object->name."</br>Возраст: ".$object->age."</br>Пол: ".$object->pol."</br>Масса: ".$object->massa;
}

public function edit_name($new_name)//редактирование имени мужчины/женщины
{
$this->name=$new_name;
}
public function edit_age($new_age)//редактирование возраста мужчины/женщины
{
$this->age=$new_age;
}
public function edit_mass($new_mass)//редактирование массы мужчины/женщины
{
$this->massa=$new_mass;
}

}


class Student extends Man
{
protected $god_obych;//год обучения

public function __construct($nam, $ag, $pol, $mass, $god)
{
$this->god_obych=$god;
parent ::__construct($nam, $ag, $pol, $mass);
}

public function prints_st($object) //вывод студента
{

return parent :: prints($object)."</br>Год: ".$object->god_obych;
}

public function edit_god($new_god) //редактровать год обучения студента
{
$this->god_obych=$new_god;
}

public function yvel_na_let($let)//увеличение обучающих лет студента
{
$this->god_obych+=$let;
}
}


$man= new Man('Максим',20, MAN, 89);
$stud= new Student('Сергей',20, MAN, 89, 1990);
echo "<h2>Это мужчина/женщина:</h2>".$man->prints($man);
echo "<h2>Это студент:</h2>".$stud->prints_st($stud) ;

$man->edit_name('Сергей');
$man->edit_age(30);
$man->edit_mass(100);
echo "<h2>Это Отредактированые мужчина/женщина:</h2>".$man->prints($man);

$stud->edit_age(16);
echo "<h2>Это отредактированный студент:</h2>".$stud->prints_st($stud) ;
$stud->yvel_na_let(3);
echo "<h2>Увеличение года обучения студента</h2>".$stud->prints_st($stud) ;

?>





Спустя 4 часа, 21 минута, 55 секунд (16.08.2012 - 00:38) SlavaFr написал(а):
Цитата (lodas @ 15.08.2012 - 18:17)
Здравствуйте уважаемые форумчане. Есть у меня задание по классу Человек(см. в приложенной картинке). Я ее как мог реализовал, правильно ли у меня получилось? Можно ли как то его упростить?

<?php header("Content-type: text/html; Charset= utf-8") ;

define('MAN', "мужик");
define('WOM', "женщина");

class Man
{
protected $name; // имя
protected $age;  // возраст
protected $pol;  // пол
protected $massa;// вес

public function __construct($nam, $ag, $pol, $mass)
{
  $this->name=$nam; 
    $this->age=$ag;
    $this->pol=$pol;
      $this->massa=$mass;
}

public function prints($object) //вывод мужчины/женщины
{
  return "Имя: ".$object->name."</br>Возраст: ".$object->age."</br>Пол: ".$object->pol."</br>Масса: ".$object->massa; 
}

public function edit_name($new_name)//редактирование имени мужчины/женщины
{
  $this->name=$new_name; 
}
public function edit_age($new_age)//редактирование возраста мужчины/женщины
{
  $this->age=$new_age; 
}
public function edit_mass($new_mass)//редактирование массы мужчины/женщины
{
  $this->massa=$new_mass; 
}

}


class Student extends Man
{
protected $god_obych;//год обучения

  public function __construct($nam, $ag, $pol, $mass, $god)
  {
      $this->god_obych=$god;
      parent ::__construct($nam, $ag, $pol, $mass); 
  }
 
public function prints_st($object) //вывод студента
{
 
  return parent :: prints($object)."</br>Год: ".$object->god_obych; 
}

public function edit_god($new_god) //редактровать год обучения студента
{
  $this->god_obych=$new_god; 
} 

public function yvel_na_let($let)//увеличение обучающих лет студента
{
  $this->god_obych+=$let; 
}
}


$man= new Man('Максим',20, MAN, 89);
$stud= new Student('Сергей',20, MAN, 89, 1990);
echo "<h2>Это мужчина/женщина:</h2>".$man->prints($man);
echo "<h2>Это студент:</h2>".$stud->prints_st($stud) ;

$man->edit_name('Сергей');
$man->edit_age(30);
$man->edit_mass(100);
echo "<h2>Это Отредактированые мужчина/женщина:</h2>".$man->prints($man);

$stud->edit_age(16);
echo "<h2>Это отредактированный студент:</h2>".$stud->prints_st($stud) ;
$stud->yvel_na_let(3);
echo "<h2>Увеличение года обучения студента</h2>".$stud->prints_st($stud) ;

?>


зачем засорять глобальную тереторию константами MAN и WOM
Зделай их лучше константами твоего класса
const MAN = .....

Имена класов, методов и название переменных это единственный способ потом понять код и возможное его переменное
Или по английски или по руски. не надо делать все в перемешку.
так что $name, $age, $sex, $weight

По чему класс назван Man если он может быт также Women?
Может просто назвать его "Person"?

Функции edit_... являются обычными set методами, так что не стесняйся и дай им соотвестственно имена setName, setSex, setAge, setWeight,
создай также соответсвенно 'get' методы.

используй set-методы также и в конструкторе и не инициализируй переменные на прямую.

нет смысла употреблять в методе prints параметер, так как ты все ровно подразумеваеш работать с Person, лучше чтоб каждая персона сaма могла себя печатать. Для этого используй просто в этом методе $this вместо передачи обэкта.
переименнуй метод prints в __toString и это даст тебе возможность просто писать
echo $man;

новая функция print_st имеет плохое название и не каждому прийдет в голову что ты подразумеваеш в "_st"
Kроме того она обсалютно не нужна, не только по тому, что названия print дастаточно но и по тому, что преемущественно переписать __toString ( и так же использовать внутри parent::__toString() )

метод yvel_na_let также не мешало назвать более понятным для всех, например addAcademicYear()
про наименование функции edit_god ты уже наверное догадался сам :)

Спустя 9 часов, 21 минута, 18 секунд (16.08.2012 - 10:00) lodas написал(а):
Спасибо SlavaFr. Так как я еще совсем новичёк в ООП, у меня возникло два вопроса:
1)Как здесь можно использовать set-методы в конструкторе(ведь в конструкторе объекты только создаются и в них еще нет никаких данных) и что ты имел в виду под не "инициализируй переменные на прямую"?
2)Ели я уберу функцию print_st как ее переписать __toString и использовать внутри parent::__toString() ?

Спустя 4 часа, 30 минут, 27 секунд (16.08.2012 - 14:30) SlavaFr написал(а):
Цитата (lodas @ 16.08.2012 - 08:00)
Спасибо SlavaFr. Так как я еще совсем новичёк в ООП, у меня возникло два вопроса:
1)Как здесь можно использовать set-методы  в конструкторе(ведь в конструкторе объекты только создаются и в них еще нет никаких данных) и что ты имел в виду под не "инициализируй переменные на прямую"?
2)Ели я уберу функцию print_st как ее переписать __toString  и использовать внутри parent::__toString() ?

1) при вызове конструктора все переменные и методы класса известны
елси у тебя уже есть set методы то ты можеш их использовать в конструкторе.

public function __construct($namе, $agе, $sex, $weight)
{
$this->setName($name);
$this->setSex($sex);
$this->setAge($age);
$this->setWeight($weight);
}


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

2) да

Спустя 22 часа, 24 минуты, 50 секунд (17.08.2012 - 12:55) lodas написал(а):
По первому пункту круто-не додумался)) А второй я так и не понял как реализовать, не могли бы показать как оно будет?

Спустя 3 часа, 55 минут, 20 секунд (17.08.2012 - 16:50) johniek_comp написал(а):
обычный говнокод, наверно препод не то хотел
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.