01/09/2017 - PHP
Bir class sadece bir işten sorumludur, gereğinden fazla bilgi sahibi olmamalıdır ve gereğinden fazla iş yapmamalıdır. Gereğinden fazla bilgi sahibi olan ve gereğinden fazla iş yapan class "God object" olarak bilinir.
# VIOLATION
class User
{
private $firstname;
private $lastname;
public function setFirstname(string $firstname)
{
$this->firstname = $firstname;
}
public function setLastname(string $lastname)
{
$this->lastname = $lastname;
}
public function output(): string
{
return sprintf('Hello:%s %s', $this->firstname, $this->lastname);
}
}
$user = new User();
$user->setFirstname('Robert');
$user->setLastname('DeNiro');
echo $user->output();
Yukarıda gördüğümüz gibi, User
class çıktı verme işlemi ile birlikte, hem veri girişi, hem de veri çıkışı yapmaktadır, ki bu da prensip ihlaline yol açıyor.
# REFACTORED
interface UserInterface
{
public function setFirstname(string $firstname);
public function getFirstname(): string;
public function setLastname(string $lastname);
public function getLastname(): string;
}
class User implements UserInterface
{
private $firstname;
private $lastname;
public function setFirstname(string $firstname)
{
$this->firstname = $firstname;
}
public function getFirstname(): string
{
return $this->firstname;
}
public function setLastname(string $lastname)
{
$this->lastname = $lastname;
}
public function getLastname(): string
{
return $this->lastname;
}
}
class UserOutputer
{
private $user;
public function __construct(UserInterface $user)
{
$this->user = $user;
}
public function plain(): string
{
return sprintf('Hello:%s %s', $this->user->getFirstname(), $this->user->getLastname());
}
}
$user = new User();
$user->setFirstname('Robert');
$user->setLastname('DeNiro');
$userOutputter = new UserOutputer($user);
echo $userOutputter->plain();
Yukarıda gördüğümüz gibi, çıktı verme sorumluluğunu User
classtan alıp, yeni yarattığımız UserOutputer
ismindeki classs verdik. Böylece elimizde:
User
classı veUserOutputer
classı var.Bununla birlikte eğer istersek, User
classa hiç dokunmadan, JSON ve XML veri çıkışı seçeneklerini UserOutputer
classına ekleyebiliriz.