Sdílet prostřednictvím


Návrh parametru

Poznámka:

Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.

Tato část obsahuje obecné pokyny k návrhu parametrů, včetně oddílů s pokyny pro kontrolu argumentů. Kromě toho byste měli odkazovat na pokyny popsané v parametrech pojmenování.

✔️ Použijte nejméně odvozený typ parametru, který poskytuje funkce vyžadované členem.

Předpokládejme například, že chcete navrhnout metodu, která vytvoří výčet kolekce a vytiskne každou položku do konzoly. Taková metoda by měla být jako IEnumerable parametr, ne ArrayList nebo IList, například.

❌ NEPOUŽÍVEJTE rezervované parametry.

Pokud je v některé budoucí verzi potřeba další vstup člena, můžete přidat nové přetížení.

❌ NEMAJÍ veřejně vystavené metody, které jako parametry přijímají ukazatele, pole ukazatelů nebo multidimenzionální pole.

Ukazatele a multidimenzionální pole jsou poměrně obtížné správně používat. V téměř všech případech je možné přepracovat rozhraní API, aby se zabránilo tomu, že tyto typy použijete jako parametry.

✔️ Všechny parametry umístěte out za všechny parametry podle hodnoty a ref parametry (s výjimkou polí parametrů), i když vede k nekonzistence v pořadí parametrů mezi přetíženími (viz Přetížení člena).

Parametry out lze považovat za dodatečné návratové hodnoty a jejich seskupení usnadňuje pochopení podpisu metody.

✔️ Při přepsání členů nebo implementaci členů rozhraní musí být konzistentní v parametrech pojmenování.

To lépe komunikuje vztah mezi metodami.

Volba mezi výčtem a logickými parametry

✔️ Pokud by člen jinak měl dva nebo více logických parametrů, použijte výčty.

❌ Nepoužívejte logické hodnoty, pokud si nejste jistí, že nikdy nebude potřeba více než dvě hodnoty.

Výčty poskytují prostor pro budoucí sčítání hodnot, ale měli byste vědět o všech dopadech přidávání hodnot do výčtů, které jsou popsány v návrhu výčtu.

✔️ ZVAŽTE použití logických hodnot pro parametry konstruktoru, které jsou skutečně dvoustavové hodnoty a jsou jednoduše použity k inicializaci logických vlastností.

Ověřování argumentů

✔️ Ověřte argumenty předávané veřejným, chráněným nebo explicitně implementovaným členům. Vyvolání System.ArgumentExceptionnebo jedné z jejích podtříd, pokud se ověření nezdaří.

Všimněte si, že skutečné ověření nemusí nutně probíhat ve veřejném nebo chráněném členu samotné. Může k tomu dojít na nižší úrovni v některé privátní nebo interní rutině. Hlavním bodem je, že celý povrch, který je vystaven koncovým uživatelům, kontroluje argumenty.

✔️ Vyvolání, ArgumentNullException pokud je předán argument null a člen nepodporuje argumenty null.

✔️ DO ověřte parametry výčtu.

Nepředpokládáte, že argumenty výčtu budou v oblasti definované výčtem. CLR umožňuje přetypování libovolné celočíselné hodnoty na hodnotu výčtu, i když tato hodnota není definována v výčtu.

❌ NEPOUŽÍVEJTE Enum.IsDefined pro kontroly rozsahu výčtů.

✔️ Mějte na paměti, že po ověření mohly být změněny proměnlivé argumenty.

Pokud je člen citlivý na zabezpečení, doporučujeme vytvořit kopii a pak ověřit a zpracovat argument.

Předávání parametrů

Z pohledu návrháře architektury existují tři hlavní skupiny parametrů: parametry podle hodnoty, ref parametry a out parametry.

Pokud je argument předán parametrem podle hodnoty, člen obdrží kopii skutečného argumentu předaného. Pokud je argumentem typ hodnoty, vloží se do zásobníku kopie argumentu. Pokud je argumentem typ odkazu, vloží se do zásobníku kopie odkazu. Nejoblíbenější jazyky CLR, jako je C#, VB.NET a C++, mají výchozí hodnotu předávání parametrů podle hodnoty.

Když je argument předán prostřednictvím parametru ref , člen obdrží odkaz na skutečný argument předaný. Pokud je argumentem typ hodnoty, odkaz na tento argument se vloží do zásobníku. Pokud je argument typu odkazu, odkaz na odkaz se umístí do zásobníku. Ref Parametry lze použít k tomu, aby člen mohl upravovat argumenty předané volajícím.

Out parametry jsou podobné ref parametrům, s některými malými rozdíly. Parametr je původně považován za nepřiřazený a nelze jej přečíst v těle člena před přiřazením určité hodnoty. Parametr musí mít také přiřazenou hodnotu před vrácením člena.

❌ Vyhněte se používání out nebo ref parametrů.

Použití out nebo ref parametry vyžaduje zkušenosti s ukazateli, pochopení, jak se typy hodnot a odkazové typy liší, a zpracování metod s více návratovými hodnotami. Také rozdíl mezi out parametry ref a parametry není široce srozumitelný. Architekti architektury, kteří navrhují pro širokou cílovou skupinu, by neměli očekávat, že uživatelé budou mít zkušenosti při práci s out parametry nebo ref parametry.

❌ NEPŘEDÁVEJTE odkazové typy odkazem.

Existuje několik omezených výjimek pravidla, jako je například metoda, která se dá použít k prohození odkazů.

Členy s proměnným počtem parametrů

Členové, kteří mohou přijmout proměnný počet argumentů jsou vyjádřeny zadáním parametru pole. Například String poskytuje následující metodu:

public class String {
    public static string Format(string format, object[] parameters);
}

Uživatel pak může metodu String.Format volat následujícím způsobem:

String.Format("File {0} not found in {1}",new object[]{filename,directory});

Přidání klíčového slova params jazyka C# do parametru pole změní parametr na takzvaný parametr pole parametrů a poskytne zástupce pro vytvoření dočasného pole.

public class String {
    public static string Format(string format, params object[] parameters);
}

Tím umožníte uživateli volat metodu předáním prvků pole přímo v seznamu argumentů.

String.Format("File {0} not found in {1}",filename,directory);

Všimněte si, že klíčové slovo parametru lze přidat pouze k poslednímu parametru v seznamu parametrů.

✔️ Zvažte přidání klíčového slova parametru do parametrů pole, pokud očekáváte, že koncoví uživatelé předávají pole s malým počtem prvků. Pokud se očekává, že v běžných scénářích bude předáno velké množství prvků, uživatelé pravděpodobně nepřejdou tyto prvky vložené, a proto klíčové slovo params není nutné.

❌ Nepoužívejte pole parametrů, pokud by volající téměř vždy měl vstup již v poli.

Členové s parametry pole bajtů by například téměř nikdy nebyli volány předáním jednotlivých bajtů. Z tohoto důvodu nepoužívají parametry bajtového pole v rozhraní .NET Framework klíčové slovo params.

❌ NEPOUŽÍVEJTE pole parametrů, pokud je pole změněno členem, který přebírá parametr pole parametrů.

Vzhledem k tomu, že mnoho kompilátorů změní argumenty na člena na dočasné pole v lokalitě volání, může být pole dočasným objektem, a proto všechny změny pole budou ztraceny.

✔️ ZVAŽTE použití klíčového slova params v jednoduché přetížení, i když složitější přetížení nemohlo použít.

Zeptejte se sami sebe, jestli by uživatelé měli hodnotu pole parametrů v jednom přetížení, i když to nebylo ve všech přetíženích.

✔️ Zkuste uspořádat parametry, aby bylo možné použít klíčové slovo params.

✔️ ZVAŽTE poskytnutí speciálních přetížení a cest kódu pro volání s malým počtem argumentů v extrémně citlivých rozhraních API pro výkon.

Díky tomu se můžete vyhnout vytváření maticových objektů při volání rozhraní API s malým počtem argumentů. Názvy parametrů vytvořte tak, že vezmete jednotný tvar parametru pole a přidáte číselnou příponu.

Měli byste to provést pouze v případě, že budete provádět speciální případ celé cesty kódu, ne jen vytvořit pole a volat obecnější metodu.

✔️ Mějte na paměti, že hodnotu null lze předat jako argument pole parametrů.

Před zpracováním byste měli ověřit, že pole nemá hodnotu null.

❌ NEPOUŽÍVEJTE varargs metody, jinak označované jako tři tečky.

Některé jazyky CLR, například C++, podporují alternativní konvenci pro předávání seznamů parametrů proměnných označovaných jako varargs metody. Konvence by se neměla používat v architekturách, protože není kompatibilní se specifikací CLS.

Parametry ukazatele

Obecně platí, že ukazatele by se neměly zobrazovat ve veřejné ploše dobře navržené spravované architektury kódu. Ve většině případů by se ukazatele měly zapouzdřovat. V některých případech jsou však ukazatele vyžadovány z důvodů interoperability a použití ukazatelů v takových případech je vhodné.

✔️ Poskytněte alternativu pro jakýkoli člen, který přebírá argument ukazatele, protože ukazatele nejsou kompatibilní se specifikací CLS.

❌ Vyhněte se provádění nákladné kontroly argumentů ukazatele.

✔️ Při návrhu členů pomocí ukazatelů postupujte podle běžných konvencí souvisejících s ukazateli.

Například není nutné předat počáteční index, protože jednoduchý aritmetický ukazatel lze použít k dosažení stejného výsledku.

© Části 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional v rámci Microsoft Windows Development Series.

Viz také