Slovník pojmů
Třída a objekt
Třída popisuje pravidla a schopnosti. Objekt je jejich konkrétní použití v běžící aplikaci — například jedna objednávka, peněžní částka nebo služba pro vytvoření zásilky.
Stručná definice
Třída je předpis, objekt jeho konkrétní instance.
Třída sdružuje vlastnosti, metody, konstanty a pravidla viditelnosti. Konstruktor nastaví objekt do platného počátečního stavu a metody popisují, co s ním lze dělat. Při použití klíčového slova new vzniká objekt neboli instance třídy.
Objekt nemusí být databázový řádek ani ORM entita. Může reprezentovat hodnotu, aplikační službu, požadavek na externí API nebo stav objednávky. Smysl má tehdy, když společně drží data a chování, které k nim skutečně patří.
Použití
Kde třídy a objekty dávají kódu strukturu
Objektový model pomáhá pojmenovat odpovědnosti a udržet důležitá pravidla blízko dat, kterých se týkají.
- objednávka, která hlídá povolené změny svého stavu
- hodnotový objekt pro peníze, měnu nebo interval dat
- aplikační služba pro import objednávek či rezervaci skladu
- datový objekt pro bezpečně typovaný vstup do API
- infrastrukturní adaptér, například klient dopravce nebo repozitář
Praktický příklad
Objednávka chrání své vlastní pravidlo
Zrušení zásilky není jen změna veřejné vlastnosti na true. Metoda může nejdřív ověřit stav objednávky a odmítnout operaci, která už nedává obchodní smysl. Koordinace skladu, platby nebo e-mailu by naproti tomu často patřila do jiné aplikační služby.
PHP
final class Order
{
private bool $cancelled = false;
public function __construct(
private readonly string $number,
private readonly bool $shipped,
) {
}
public function cancel(): void
{
if ($this->shipped) {
throw new DomainException('Expedovanou objednávku nelze zrušit.');
}
$this->cancelled = true;
}
}
Jak to funguje
Od definice k použití objektu
Zjednodušený průběh ukazuje, kde leží odpovědnost za stav a kde už začíná okolní aplikace.
- Definice třídy Třída pojmenuje svůj stav, chování a veřejné rozhraní.
- Vytvoření instance Konstruktor dostane potřebná data a ověří výchozí podmínky.
- Volání metody Konzument požádá objekt o činnost s konkrétním významem.
- Ochrana invariantů Objekt odmítne změnu, která by jej dostala do neplatného stavu.
- Spolupráce okolí Uložení, HTTP odpověď nebo volání služby řeší vhodná okolní vrstva.
Důležité pojmy
Stav, chování a viditelnost mají rozdílné role.
Pojmy třída, objekt a instance se často zaměňují, ale každý označuje jinou část objektového modelu.
Třída, objekt a instance
Instance je jiné označení pro konkrétní objekt vytvořený podle třídy. Třída sama není běžící objednávka ani služba.
Vlastnosti a metody
Vlastnosti drží stav. Metody poskytují chování a mohou změnu stavu ověřit nebo odmítnout.
Konstruktor a typy
Konstruktor nastavuje povinné hodnoty. Deklarované typy parametrů, vlastností a návratů zpřesňují, s čím objekt pracuje.
Zapouzdření
Soukromý stav a úzké veřejné metody brání tomu, aby jej libovolná část aplikace změnila bez kontroly.
Dědičnost a kompozice
Dědičnost vyjadřuje vztah předek–potomek. Pro spolupráci samostatných schopností bývá čitelnější kompozice objektů.
Vztah k dalším nástrojům
Objekt není automaticky entita, DTO ani služba.
Stejný jazykový mechanismus slouží různým architektonickým účelům; jejich odpovědnost určuje kontext.
- Doménový objekt
- Drží pravidla konkrétní obchodní oblasti, například povolené přechody stavu objednávky.
- DTO
- Přenáší data mezi částmi systému; nemusí v sobě mít složitou obchodní logiku.
- Aplikační služba
- Koordinuje use case a více objektů, například import z marketplace.
- ORM entita
- Je technické mapování perzistence; její vztah k doménovému objektu se rozhoduje podle návrhu aplikace.
Výhody a omezení
Třída má pomáhat konkrétní změně, ne zvětšovat počet souborů.
Přínosy
- pravidla jsou blízko stavu, kterého se týkají
- typy a veřejné metody zpřesňují kontrakt
- objekt lze testovat bez celého běhu aplikace
- odpovědnosti lze skládat a pojmenovat
Časté chyby
- veřejné vlastnosti, které může změnit kdokoli
- jedna „god class“ s nesouvisejícími úlohami
- zaměnění databázové tabulky za celý doménový model
- třída, interface a factory pro každou drobnou hodnotu bez důvodu
Kdy dává smysl
Objekt je vhodný pro chování, stav a jasnou odpovědnost.
Třída se vyplatí, když data mají pravidla, životní cyklus nebo související operace. Peněžní částka, objednávka a klient dopravce mají odlišné odpovědnosti, ale všechny mohou být samostatnými objekty.
Pro jednoduchý jednorázový převod dat nemusí být několik vrstev objektů přínosem. Míra objektového návrhu má odpovídat složitosti problému a očekávaným změnám, ne představě, že vše musí být třídou.
Na co myslet
Dobrá třída má srozumitelný důvod ke své existenci.
Při návrhu i code review pomáhá ověřit, zda objekt skutečně chrání a pojmenovává jednu související odpovědnost.
- držet povinný stav a závislosti v konstruktoru
- pojmenovat metody podle významu, ne podle technického detailu
- nepouštět neověřené změny stavu přes veřejné vlastnosti
- oddělit koordinaci více systémů od lokálních pravidel objektu
- testovat pozorovatelný výsledek a nepovolené přechody stavu
Časté otázky
Třídy a objekty v PHP
Jaký je rozdíl mezi třídou a objektem?
Třída je definice vlastností a metod. Objekt neboli instance je konkrétní hodnota vytvořená podle této definice a žije v běžící aplikaci.
Je třída totéž co databázová tabulka?
Ne. ORM může třídu mapovat na tabulku, ale třída může být také služba, hodnotový objekt, DTO nebo adaptér externího API.
Má být každá třída final?
Ne automaticky. Final je užitečné, pokud třída nemá být bezpečně rozšiřována dědičností. Důležitější je vědomě volit kompozici, dědičnost a veřejný kontrakt.
Mají být vlastnosti veřejné?
U jednoduchých neměnných datových objektů to může být čitelné. U měnitelného obchodního stavu je obvykle bezpečnější změny vést přes metody, které ověří pravidla.
Jak PHP používám v praxi
Třídy a odpovědnosti skládám podle složitosti aplikace.
V dlouhodobě udržovaných PHP aplikacích kombinuji přímočaré objekty s jasnými hranicemi tam, kde chrání obchodní pravidla nebo infrastrukturu.