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.

  1. Definice třídy Třída pojmenuje svůj stav, chování a veřejné rozhraní.
  2. Vytvoření instance Konstruktor dostane potřebná data a ověří výchozí podmínky.
  3. Volání metody Konzument požádá objekt o činnost s konkrétním významem.
  4. Ochrana invariantů Objekt odmítne změnu, která by jej dostala do neplatného stavu.
  5. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.