TakéModifier, Modifikátor přístupu, Access modifierZákladní

Definice

Modifikátor je klíčové slovo nebo značka, která nemění samotnou podstatu deklarace, ale upravuje její chování, viditelnost nebo způsob vyhodnocení. V programovacích jazycích jde například o public, static nebo readonly, v CSS o pseudotřídy a varianty bloku, v regulárních výrazech o příznaky jako i pro ignorování velikosti písmen.

Kategorie: Softwarový vývojAktualizováno

Nezaměňujte: Modifikátor znamená v programovacích jazycích klíčové slovo u deklarace, v regulárních výrazech příznak režimu, v CSS metodice BEM variantu bloku a ve 3D nástrojích nedestruktivní operaci v zásobníku nad objektem.

Než se na to spolehnete: Heslo je záměrně mezioborové, protože „modifikátor“ nemá jednu kanonickou definici; pokud slovník cílí jen na OOP, doporučuji sekce o BEM a Blenderu zkrátit. Podpora vnitřních příznaků (?i:) v JavaScriptu je novější doplněk specifikace, dostupnost v konkrétních runtime prosím ověřit.

Co modifikátor mění a co ne

Modifikátor sám o sobě nic nedeklaruje. Připojuje se k něčemu, co už existuje: k třídě, metodě, proměnné, selektoru nebo vzoru. Bez svého nositele nemá význam. Právě proto se v jazykových gramatikách popisuje jako nepovinná předpona deklarace, kterou lze vynechat, aniž by kód přestal být syntakticky platný. Vynechání ale obvykle znamená, že se uplatní výchozí chování, a to bývá zdrojem nedorozumění: v Javě má člen bez modifikátoru přístup v rámci balíčku, v C# je výchozí private.

Kde se s modifikátory potkáte

Objektově orientované jazyky

Modifikátory přístupu (public, protected, private, internal) určují, odkud je člen viditelný. Vedle nich stojí modifikátory chování: static váže člen na typ místo na instanci, final nebo sealed zakazuje další dědění, abstract vynucuje implementaci v potomkovi, readonly a const omezují zápis. Kombinace se řídí pravidly jazyka, takže například abstract a final se navzájem vylučují.

Regulární výrazy

Modifikátory (v dokumentaci často příznaky, anglicky flags) se zapisují za vzor nebo do konstruktoru a mění režim porovnávání celého výrazu. Nejběžnější jsou i pro ignorování velikosti písmen, g pro globální hledání, m pro víceřádkový režim a s, po němž tečka odpovídá i konci řádku.

CSS a metodiky pojmenování

V metodice BEM je modifikátor třetí stavební prvek vedle bloku a elementu a zapisuje se dvěma podtržítky nebo dvěma pomlčkami, například button--primary. Vyjadřuje variantu, nikoli nový komponent, takže třída modifikátoru se přidává k základní třídě, ne místo ní.

3D nástroje

V Blenderu je modifikátor nedestruktivní operace v zásobníku nad objektem: Subdivision Surface, Mirror nebo Array mění výsledný tvar při vykreslení, ale původní síť zůstává nedotčená, dokud modifikátor nepotvrdíte.

Proč na pořadí a kombinaci záleží

Tam, kde se modifikátory řetězí, není jejich pořadí jen kosmetika. V zásobníku modifikátorů 3D softwaru dá zrcadlení před dělením ploch jiný výsledek než opačné pořadí. V CSS rozhoduje o vítězi specificita a pořadí v souboru, takže modifikátor zapsaný před základní třídou se nemusí prosadit. Naopak u modifikátorů v deklaraci třídy je pořadí klíčových slov obvykle volné a řeší se jen konvencí a nástroji pro formátování kódu.

Jak modifikátory číst při revizi kódu

Modifikátory jsou nejrychlejší způsob, jak z hlavičky odhadnout záměr autora. Veřejná statická metoda signalizuje pomocnou funkci bez stavu, privátní readonly pole naznačuje závislost vloženou v konstruktoru, chybějící modifikátor u členu v Javě bývá spíš opomenutí než rozhodnutí. Při revizi se proto vyplatí ptát se, zda je viditelnost co nejužší možná: rozšířit ji lze kdykoli, zúžit už jen za cenu rozbití cizího kódu.

Příklady z praxe

  1. Modifikátory u členů třídy v C#

    Hlavička metody nese hned tři modifikátory a každý řeší jinou věc: viditelnost, vazbu na typ a zákaz přepsání. Pole označené readonly lze nastavit jen v konstruktoru, takže překladač odhalí pozdější zápis už při kompilaci.

    public sealed class Kosik
    {
        private readonly List<Polozka> polozky = new();
    
        public static Kosik Prazdny() => new Kosik();
    
        internal decimal Celkem() => polozky.Sum(p => p.Cena);
    }
  2. Příznaky regulárního výrazu v JavaScriptu

    Stejný vzor se chová jinak podle připojených modifikátorů. Bez i najde jen přesnou velikost písmen, s g prochází celý řetězec a vrací všechny shody. Přidání modifikátoru je tedy změna režimu vyhodnocení, ne změna vzoru.

    const text = "Faktura FA-2024, faktura FA-2025";
    
    text.match(/faktura/);      // jedna shoda
    text.match(/faktura/gi);    // dvě shody, velikost písmen se ignoruje

Časté omyly

MýtusPrivate znamená, že se k tomu nikdo nedostane.
Ve skutečnostiModifikátory přístupu jsou pravidlo pro překladač, ne bezpečnostní hranice. Přes reflexi, ladicí nástroje nebo přímý přístup do paměti lze soukromý člen obvykle přečíst i změnit. Bezpečnost se řeší jinde než viditelností členu.
MýtusKdyž člen nemá žádný modifikátor, je veřejný.
Ve skutečnostiChybějící modifikátor znamená výchozí pravidlo daného jazyka, a to bývá restriktivní. V Javě jde o přístup v rámci balíčku, v C# o private u členů třídy. Spoléhat na výchozí hodnotu místo explicitního zápisu je častý zdroj chyb při refaktoringu.
MýtusModifikátor v BEM je samostatná třída, takže základní třídu už nepotřebuji.
Ve skutečnostiModifikátor v BEM popisuje variantu bloku a předpokládá, že prvek nese i základní třídu. Zápis pouze s modifikátorem přijde o všechny sdílené vlastnosti a vede k duplikaci stylů.

Časté dotazy

Jaký je rozdíl mezi modifikátorem a anotací?
Modifikátor je součást gramatiky jazyka: překladač zná jeho význam předem a vynucuje ho, například odmítne zápis do readonly pole. Anotace nebo atribut je naopak metadata, která jazyk pouze přenáší a interpretuje je až knihovna, framework nebo nástroj za běhu či při sestavení. Modifikátorů je v jazyce pevný, uzavřený počet, vlastní anotaci si může kdokoli nadefinovat. Praktický dopad: chybu v modifikátoru odhalíte při překladu, chybu v anotaci často až v testech nebo v produkci.
Jak zvolit správný modifikátor přístupu u nové metody?
Vhodné pravidlo je začít nejužší možnou viditelností, tedy private, a rozšiřovat ji teprve tehdy, když to skutečný volající vyžaduje. Rozšíření viditelnosti je zpětně kompatibilní změna, zúžení naopak rozbije každý kód, který se na členu spoléhal. U knihoven určených pro cizí projekty se veřejný modifikátor rovná závazku podpory do další hlavní verze, takže veřejné API má být co nejmenší a záměrně navržené.
Ovlivňují modifikátory výkon aplikace?
Modifikátory přístupu na výkon prakticky nemají vliv, protože se vyhodnocují při překladu. Jiné modifikátory dopad mít mohou: static odstraňuje práci s instancí, sealed nebo final umožňuje běhovému prostředí nahradit virtuální volání přímým a devirtualizovat je, const dovoluje dosadit hodnotu už při kompilaci. Rozdíly jsou ale obvykle malé a měřitelné až v horkých smyčkách, takže volba modifikátoru má vycházet ze zamýšleného návrhu, ne z odhadu výkonu.
Jde modifikátor regulárního výrazu zapnout jen pro část vzoru?
Modifikátor regulárního výrazu lze v mnoha implementacích omezit na část vzoru pomocí vnitřní skupiny se zápisem typu (?i:...), případně (?-i:...) pro vypnutí. Podpora se ale liší podle enginu: PCRE a .NET tuto konstrukci znají dlouhodobě, v JavaScriptu byla přidána později a starší prostředí ji neumí. Před nasazením se proto vyplatí ověřit chování v konkrétním běhovém prostředí, jinak výraz na jedné platformě funguje a na druhé skončí syntaktickou chybou.

Zdroje

  1. Regular expressions(otevře se v novém okně)MDN Web Docs
  2. Access Modifiers (C# Programming Guide)(otevře se v novém okně)Microsoft Learn
  3. Controlling Access to Members of a Class(otevře se v novém okně)Oracle
  4. Modifiers(otevře se v novém okně)Blender Foundation

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.