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:



Bununla birlikte eğer istersek, User classa hiç dokunmadan, JSON ve XML veri çıkışı seçeneklerini UserOutputer classına ekleyebiliriz.