O objektově orientovaném programování (OOP) v jednoduchém jazyce. Vysvětluji, co je objektově orientované programování, na příkladu koňského povozu a lisu / Offtopic / iXBT Live
Příspěvek se bude zabývat jedním z programovacích paradigmat – objektově orientovaným programováním (OOP). OOP je založeno na popisu entit dané oblasti v kódu a jejich vzájemné interakci.
Jak přišli s nápadem OOP?
Myšlenka OOP vzešla z hluboké touhy tehdejších vývojářů usnadnit si život, zrychlit vývoj, zjednodušit kód a snáze ho udržovat. Psaní kódu ve strojových kódech není moc zábavné, a tak přišli s jazykem Assembler. I když je v Assembleru snazší psát kód než ve strojových kódech, stále je to velmi neproduktivní. Ale v Assembleru se psaly i účetní programy, počítaly se mzdy. Program napsaný v Assembleru pracuje co nejrychleji, zabírá minimum paměti. Jeho údržba je však extrémně pracná.
Programátoři té doby neustále hledali způsoby, jak zjednodušit vývoj. Objevovaly se nové nápady, nové koncepty v různých programovacích jazycích. Všechno se vyvíjelo postupně. Některé věci se povedly, zakořenily a rozvíjely, některé ne. Projekty se stávaly čím dál těžkopádnějšími. Ukázalo se, že je potřeba radikálně odlišná myšlenka, jiný přístup ke zjednodušení vývoje a údržby kódu. Procedurální přístup není vhodný pro velké projekty.
Tato myšlenka byla pokusem abstrahovat od detailů vývoje procedur a funkcí a prezentovat vývoj kódu, který odráží podstatu dané oblasti. To bylo implementováno v jazyce Simula – jazyce pro simulaci objektů reálného světa.
Nápad se ukázal jako úspěšný a OOP se používá dodnes. Začaly se objevovat nové programovací jazyky s podporou OOP. Implementace OOP v nich se však trochu lišila. Vývojáři programovacích jazyků jsou skoro jako umělci – vidí to tak.
Jaké byly hlavní principy OOP a co to vlastně je?
OOP bylo nyní zredukováno na následující základní principy:
- dědictví
- zapouzdření
- polymorfismus
- abstrakce
Hlavními entitami OOP jsou třídy, objekty a rozhraní. Třída je šablona, podle které se vytváří objekt. Je zhruba jako forma – je to forma, ale umožňuje vyrazit mnoho identických dílů. Objekty jsou zhruba jako vyrazené díly. Objekty spolu interagují prostřednictvím rozhraní. Nebo jak může operátor pracovat s formou, jaká tlačítka mačkat na stroji.
Níže uvedené diagramy ukazují nejjednodušší příklady dědičnosti a kompozice. Dědičnost a kompozice jsou vztahy mezi třídami. V novém příspěvku se pokusím vysvětlit vztahy mezi třídami jednoduchými slovy samostatně.


Stručně a jednoduše o vztazích mezi třídami, které jsou viditelné v diagramech
Dědičnost je mechanismus v objektově orientovaném programování, pomocí kterého si jedna třída (podřízená třída) může vypůjčovat vlastnosti a metody z jiné třídy (rodičovské). Tím se zabrání duplicitě kódu extrakcí společných prvků do základní třídy. Rozšiřte nebo upravte funkčnost nadřazené třídy v podřízených třídách. Kompozice je princip návrhu, kdy jedna třída obsahuje objekty jiné třídy jako své atributy. To znamená, že objekt jedné třídy „sestává z“ nebo „používá“ objekty jiných tříd k vykonávání své práce. Příklad s třídami „Cart“ a „DraftPower“ je dobrou ilustrací kompozice: Třída „Cart“ obsahuje atribut „draftPower“, což je objekt třídy „DraftPower“. Vozík používá k provádění svých úkolů metody objektu „draftPower“ (například harness() a unharness()). Třídy „Horse“ a „Ox“ implementují rozhraní „DraftPower“ a poskytují konkrétní implementace metod. V následujících příspěvcích vám povím o rozhraní, jeho implementaci a abstraktních třídách. Pokusím se to udělat jednoduchým a srozumitelným jazykem. V tomto případě, ve zkratce, díky rozhraní „DraftPower“ kompilátor ví, že existují metody pro harness() a unharness(), ale ve třídách, které toto rozhraní implementují, existuje specifická implementace těchto metod. A ta se může v každé z tříd lišit. Můžete tedy snadno nahradit vola koněm nebo opravit metodu například na harness(), aniž byste museli přepisovat lavinu kódu. Proč je v tomto případě kompozice lepší než dědičnost? Flexibilita: pokud by se Horse a Ox dědily z CartWagon, vytvořilo by to rigidní spojení mezi třídami, což by komplikovalo přidávání nových typů tažné síly. Kompozice umožňuje dynamicky měnit chování objektu pouhou změnou jeho součástí. Oddělení odpovědností: Třída HorseCart je zodpovědná pouze za manipulaci s vozíkem, zatímco třídy Horse a Ox jsou zodpovědné za manipulaci s tažnou silou. Díky tomu je kód modulárnější a srozumitelnější. Dodržování principů OOP: Princip jediné odpovědnosti: Každá třída má jednu dobře definovanou odpovědnost. Princip otevřené/uzavřené: Nové typy tažné síly lze přidávat beze změny stávajících tříd. Analogie z reálného života: Auto obsahuje motor, kola, volant a další komponenty. Auto však není podtřídou motoru nebo kola. Místo toho tyto komponenty používá ke své práci. Podobně HorseCart používá ke své práci objekty typu DraftPower.
Entity třídy, bez zacházení s podrobnostmi, jsou pole, data a metody. Pole jsou vlastnosti třídy, které popisují její stav. Metody třídy jsou funkce, které definují chování třídy a pracují s jejími daty a poli. Třída má konstruktor a destruktor – jedná se o speciální metody třídy, které vytvářejí a ničí objekt.
Na základě třídy se pomocí šablony vytvoří objekt.
Některé technické detaily vytvoření objektu
Konstruktor třídy vytvoří objekt – vyžádá si od operačního systému blok paměti dostatečně velký pro umístění objektu a inicializuje tento blok paměti počátečními hodnotami a vrátí vytvořený objekt programu. V kontextu jazyka C++ konstruktor vrací odkaz na objekt – na adresu, od které blok paměti s objektem začíná. V důsledku vytvoření objektu se v paměti vytvoří pole bajtů. A co přesně jsou entity v tomto poli – je zřejmé díky třídě, kterou tento objekt popisuje.
Destruktor zničí objekt a uvolní paměť, kterou objekt zabírá. Operační systém označí tuto oblast paměti jako volnou.
Vytvoření a zničení objektu
Vytvořený objekt musí být zničen, jinak dojde k úniku paměti. V mnoha moderních programovacích jazycích není destruktor potřeba. Vytvořený objekt bude zničen garbage collectorem, jakmile již nebude potřeba. V některých programovacích jazycích však garbage collector neexistuje a pak je smazání objektu odpovědností vývojáře. Můžete například popsat třídu, která vyžaduje k uložení objektu velké množství paměti. A v nekonečné smyčce zavolat konstruktor pro vytvoření objektů této třídy. Správce úloh pak jasně ukáže, jak běžící aplikace zabírá stále více paměti.
Dědičnost umožňuje vytvářet nové třídy na základě stávajících, znovu používat kód, přidávat nebo měnit chování, přidávat nová pole. Zděděné třídy jsou jako talentované děti, které dokážou víc než jejich rodiče.
Některé programovací jazyky umožňují dědění z více tříd a jiné pouze z jedné. Určitého zdání vícenásobné dědičnosti lze dosáhnout implementací rozhraní.
V kontextu příkladu s formou si můžeme představit základní třídu: formu pro ražení hrnce a následnou třídu – upravenou formu, která razí hrnce se silným dnem.
Zapouzdření chrání data třídy, neumožňuje jejich změnu zvenčí, skrývá je a umožňuje s nimi pracovat přes určité rozhraní. Tím se zachovává stav třídy a obecně stabilita aplikace. Skrytá data lze měnit pouze ve třídě, do které patří, takže při hledání chyby v kódu, která vznikla v důsledku změny stavu, se hledání redukuje na hledání chyby v metodách této třídy, které pracují s poli třídy. Bez zapouzdření nelze data třídy ochránit před změnami a chyba může nastat kdekoli. A její nalezení může trvat dlouho. Zvenčí lze se skrytými daty pracovat přes rozhraní, které třída poskytuje. Obvykle se jedná o metody, které vracejí hodnotu pole (gettery) a nastavují hodnotu pole (settery).
V kontextu formy je zapouzdření stav, kdy se nikdo nestará o to, jak je forma vyrobena. Co je uvnitř, je irelevantní. Hlavní je, aby obsluha mohla s formou snadno interagovat a vyrážet díly.
Polymorfismus umožňuje univerzální práci s objekty různých typů. Zjednodušeně řečeno, například v základní třídě je metoda, která pracuje s polem celých čísel, a ve třídě dědiče je metoda se stejným názvem, ale pracuje s polem zlomkových čísel. V jiné třídě dědiče metoda se stejným názvem pracuje s polem řetězců. Polymorfismus jde ruku v ruce s dědičností.
V kontextu formy je to, jako by jedna forma byla vyrobena z velmi tvrdého materiálu a mohla lisovat díly ze stejných materiálů. A existuje úplně stejná forma, ale je jednodušší a umožňuje lisovat díly z méně tvrdých materiálů. A tyto formy nelze zaměňovat!
Abstrakce je zvýraznění hlavní věci, důležité pro řešení problému, a skrytí zbytečných implementačních detailů. Abstrakce v kontextu tiskové formy je zvýraznění hlavního funkčního účelu tiskové formy a odvedení pozornosti od složitých technických detailů jejího designu.
Například potřebujete formu, která dokáže nabrat roztavený plast a z něj vytvarovat uzávěr lahve za 10 sekund s přesností 0.01 mm, a nezáleží na tom, jak přesně jsou uvnitř vyrobeny chladicí kanály, jak jsou uspořádány vložky, jak je forma připevněna ke stroji – to jsou implementační detaily, které na této úrovni abstrakce nejsou potřeba.
V budoucích článcích se pokusím vysvětlit jednoduchým jazykem základy programování v objektově orientovaném programu (OOP).
Zůstaňte v obraze s nejnovějšími zprávami ze světa gadgetů a technologií
iGuides pro chytré telefony Apple

Co je LDAC a proč byste ho měli hledat na obalech sluchátek?

Oleg Voronin – 17. července 2025, 17:18

Pokračujeme v sérii textů o přenosu hudby přes Bluetooth. Již jsme zmínili dva kodeky: základní, všemi podceňovaný SBC a oblíbený u Applu — AAC. Všechny jejich výhody a slabiny jsou popsány v příslušných článcích.
Přihlaste se k odběru iGuides na Telegramu, abyste se o všem dozvěděli jako první – t.me/iguides
V mediální sféře stále zbývají dva názvy, které jsou považovány za víceméně populární „bezztrátové“ kodeky. Dnes si povíme o LDAC: odkud se vzal, jakou kvalitu zvuku poskytuje a proč se vyplatí věnovat mu pozornost při nákupu sluchátek.
- Co je kodek
- Co je LDAC
- Jaký je LDAC?
- Kde je LDAC podporován
- Jak funguje LDAC
- Proč se vyplatí LDAC.
Co je kodek
Pro ty, kteří sem přišli poprvé, připomeňme základy. Jednoduše řečeno, Bluetooth je místo drátů a kodek je místo kovových jader uvnitř těchto drátů a konektorů na jejich koncích. Kodek je jak „jazykem komunikace“ mezi vysílačem zvuku a sluchátky, tak určitým standardem kvality této komunikace.
Díky Bluetooth lze zvuk přenášet ze smartphonu do sluchátek. A kodek je zodpovědný za to, jak je přenášen. Díky kodeku sluchátka chápou, co přesně jim smartphone vysílá a jak to mají přehrát. Samozřejmě je tato metafora velmi zjednodušená, ale umožňuje pochopit princip bezdrátového zvuku.
Kodek je také potřeba k přizpůsobení hlasitosti přenášených zvukových dat možnostem zařízení. Moderní Bluetooth zatím není schopen přenášet „čistě“ dekódovanou hudbu – v tzv. CD kvalitě, proto jsou kodeky zodpovědné za snížení objemu dat s co nejmenším snížením kvality.
Co je LDAC

Foto: Unsplash
Jedná se o technologii kódování zvuku, kterou vytvořila společnost Sony. Je jí patentována, ale LDAC mohou používat i výrobci třetích stran, protože tento kodér má otevřený zdrojový kód pod licencí Apache 2.0. To znamená, že to, zda si LDAC do zařízení přidat, či nikoli, není otázkou licenčních poplatků pro dodavatele, ale jeho vlastního přání a účelnosti.
LDAC je ztrátový zvukový kodek, a to navzdory marketingovým tvrzením společnosti Sony o opaku. Proč byste to tvrdili?
V hudebním světě je za standard považována tzv. „CD kvalita“. Při přenosu „standardní“ zvukové stopy přes Bluetooth se nejprve komprimuje na běžném přehrávači a poté se dešifruje na audio zařízení. Pokud dešifrování dává stejné množství dat jako v původní podobě, lze metodu komprese (kódování) nazvat „bezeztrátovou“. LDAC není schopen přenést požadovaný objem čistě technicky, a to kvůli omezením Bluetooth profilu – o tom více níže.
Jak může být komprese bezeztrátová? Nejedná se o antonymy. Jednoduchý příklad: pokud potřebujete společnosti Apple sdělit tisíc slov, máte dvě možnosti – buď řekněte tisíckrát za sebou Apple, nebo řekněte „tisíckrát Apple“. Přenesli jste identickou informaci, ale její objem během přenosu se dramaticky liší.
Jaký je LDAC?
Tento kodek umožňuje přenos dat na třech úrovních:
Kde je LDAC podporován

Pro povolení tohoto kodeku jsou nutné dvě podmínky:
- Zdroj dat (chytrý telefon, tablet, počítač, přehrávač) může kódovat v LDAC
- Datový přijímač (sluchátka, reproduktory) dokáže dekódovat LDAC.
LDAC se nachází v mnoha chytrých telefonech s Androidem 8 a novějším a nemusí to být nijak zřejmé. Ve výchozím nastavení je kodek v systému, ale výrobce smartphonu jej může programově deaktivovat z vlastních důvodů. LDAC v systému Android můžete násilně aktivovat v sekci „Pro vývojáře“, za předpokladu, že je připojeno zvukové zařízení s podporou tohoto kodeku. V případě sluchátek a reproduktorů informuje dodavatel o podpoře LDAC na obalu zařízení.
LDAC – bezztrátový zvuk?
Sony tvrdí, že kodek přenáší hudbu beze ztrát, ale ve skutečnosti ke ztrátám dochází. Podívejme se, jak se projevují v číslech.
Referenční „kvalita CD“ je vyjádřena datovým tokem 1411 kbps. V současné době průmysl nedokáže komprimovat zvuk bez ztráty více než dvojnásobně, tj. kodek musí poskytovat bitovou rychlost alespoň 706 kbps. Ukazuje se, že první a druhý stupeň LDAC (330 a 660 kbps) již nezapadají do konceptu „bezztrátového“ – vynásobeno dvěma je to 660 a 1320 kbps, což je méně než 1411 kbps.
Teoreticky může třetí úroveň LDAC s průtokem 990 kbps poskytnout pověstnou „CD kvalitu“. Ne každé zařízení kompatibilní s kodekem však dokáže s takovou bitovou rychlostí pracovat. A je třeba vzít v úvahu také bitovou hloubku a vzorkování, jejichž vysoké hodnoty jsou nezbytné pro přenos zvuku ve vysokém rozlišení. A pokud vezmeme tok 24 bitů při 96 kHz, pak by rychlost přenosu dat měla být asi 4,5 Mbps, což se nevejde do fyzického stropu 1 Mbps Bluetooth profilu L2DP.

Společnost Sone později svá prohlášení odvolala a vydala objasněné vysvětlení:
„Informace o LDAC uvedené dříve nejsou platné. Správná odpověď zní: LDAC je Bluetooth kodek, který využívá efektivnější kompresi dat než běžné Bluetooth kodeky, jako je SBC nebo aptX. Zisk z komprese může být až trojnásobný. Přestože je LDAC lepší než ostatní Bluetooth kodeky, stále komprimuje obsah. Je třeba také poznamenat, že přenos zvuku ve vysokém rozlišení je možný prostřednictvím Wi-Fi. Náš systém MultiRoon podporuje dvoupásmové řešení a v tomto případě plně poskytuje skutečně vysoce kvalitní bezdrátový zvuk.“
Společnost později také vysvětlila, že LDAC nazývá „bezztrátovým kodekem“, protože při dekódování obnovuje všechna data do stavu před kompresí, na rozdíl od jiných kodeků, kde jsou data zredukovaná během komprese navždy ztracena. V roce 2016, když se novináři veřejně ptali, Sony nakonec ustoupila a uvedla, že zvuk LDAC považuje za „blízký vysokému rozlišení“, ale nyní se zmínce o Hi-Res vyhýbá.
Je však také obtížné nazvat zvuk LDAC „blízkým vysokému rozlišení“, protože i v nejlepším případě je rychlost přenosu dat přibližně 50 % rychlosti potřebné pro „CD kvalitu“.
Stručně řečeno, LDAC by teoreticky mohl být kodekem pro přenos zvuku s vysokým rozlišením „bezeztrátově“, ale v praxi to tak nefunguje.
Proč se vyplatí absolvovat LDAC

Navzdory rozporu mezi marketingem a realitou je LDAC stále velmi efektivním kodekem pro přenos vysoce kvalitního zvuku. V předchozích textech jsme uvedli, že horní hranice SBC je 384 kbps (a často se používá mnohem méně), a pro AAC je to 576 kbps (ve skutečnosti je běžnější 256 nebo 320 kbps).
LDAC s 330, 660 a 990 kb/s tak vypadá mnohem komplementárněji. Ačkoli tento kodek nelze nazvat „audiofilským“, s jeho podporou uslyšíte mnohem bohatší a detailnější stopu. Mezi nevýhody patří, že je méně flexibilní než ostatní a může pracovat striktně ve třech režimech datového průchodu. To znamená, že při prudkém zhoršení signálu bude rozdíl ve zvuku znatelný.
Naštěstí dnes lze LDAC najít ve velmi levných sluchátkách od čínských prodejců za 2-4 tisíce rublů. A majitelé kompatibilních chytrých telefonů s Androidem toho mohou využít.