Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Často několik algoritmů nebo implementací dokáže správně vyřešit stejný úkol. Vámi zvolený kód vyjadřuje návrh. Vývojáři a kódovací agenti, kteří čtou váš kód, používají jeho strukturu k odvození vašeho záměru: co každá operace potřebuje, kde patří a kdy se spouští.
Tip
Tento článek je součástí části Základy pro vývojáře, kteří znají základní výrazy, příkazy a metody jazyka C#. Pokud s programováním teprve začínáte, začněte nejprve kurzy Začínáme .
Tato část porovnává platné přístupy k algoritmům a vysvětluje jemné rozdíly v jejich chování a způsob, jakým je čtenáři interpretují. Zkombinujete známé jazykové prvky, jako jsou typy, výrazy, příkazy a metody, a zvolíte formy, které vyjadřují zamýšlený návrh.
Porovnat chování a záměr návrhu
Než zvolíte implementaci, zvažte, jak ji bude používat jiný kód. Tento kód je volající: poskytuje vstupy, vyvolá vaši operaci a používá výsledky. Potřebuje dokončený výsledek okamžitě nebo může zpracovat hodnoty po jednom? Je pomocná součást pouze součástí této operace, nebo ji budou používat i jiné operace? Tyto otázky vám pomůžou porovnat chování, které potřebujete, i způsob, jakým je váš kód navržen.
Krátká vložená akce v řádku ukazuje čtenářům kroky v okamžiku použití. Například Where(task => task.Priority > 3) pravidlo filtrování okamžitě zviditelní. Pojmenovaná pomocná rutina, například v Where(IsUrgent), zdůrazňuje účel pravidla a umožňuje čtenářům samostatně kontrolovat jeho podrobnosti. Zvolte na základě toho, jestli kroky nebo jejich účel nejlépe vysvětlují okolní kód.
To, kde deklarujete pomocnou rutinu, vyjadřuje její zamýšlený rozsah. Místní funkce uvnitř ShowDashboard označuje, že pomocná rutina patří k této operaci a brání ostatním členům v jejím volání. Soukromá metoda obsahujícího typu zpřístupňuje pomocnou rutinu ostatním členům a naznačuje, že se očekává opakované použití jinde v daném typu. Oba můžou vyjadřovat stejný výpočet, ale vedou čtenáře k různým očekáváním ohledně jeho role.
Způsob zadávání vstupů pomocné rutiny odhaluje její závislosti. Předání limitu jako parametru, například IsUrgent(task, minimumPriority), zpřístupní tento vstup při každém volání. Místní funkce nebo lambda může místo toho zachytitminimumPriority proměnnou z okolního oboru, aniž by ji přijímala jako argument. Capture připojí pomocnou rutinu ke kontextu nadřazené operace; explicitní parametry usnadňují identifikaci zadaných dat.
static Místní funkci nebo lambda použijte, když chcete vynutit, aby nezachycovala okolní stav.
Způsob vracení výsledků určuje, kdy práce probíhá. Metoda, která sestaví a vrátí kolekci, se dokončí, než volající obdrží kolekci. Iterátor poskytuje prvky na vyžádání, takže volající může zastavit předtím, než jsou vytvořeny všechny prvky. Oba můžou produkovat stejné hodnoty, ale volající musí pochopit, jestli dostávají dokončené výsledky, nebo sekvenci, jejíž výpočet teprve proběhne.
Pro každou volbu nejprve určete, jaké chování volající kód potřebuje. Pak zvažte, co jiný vývojář nebo programovací agent odvodí z názvu, rozsahu, vstupů a výsledku. Zvolte formu, která odpovídá těmto očekáváním a vašemu návrhu, a vysvětlete důležité chování, které samotný tvar kódu neodhalí. Cílem je provést úmyslnou volbu mezi platnými alternativami, nikoli použít jednu formu všude.
Přečtěte si o volbách návrhu na příkladu
Následující příklad ukazuje, jak několik možností vyjadřuje různé části návrhu. Zobrazí úkoly, které jsou naléhavé a připravené k zahájení. A ProjectTask obsahuje název, prioritu a blokovaný stav úkolu.
var tasks = new[]
{
new ProjectTask("Confirm venue", Priority: 3, IsBlocked: false),
new ProjectTask("Print badges", Priority: 2, IsBlocked: true),
new ProjectTask("Test microphones", Priority: 2, IsBlocked: false),
};
ShowDashboard("Community meetup", tasks, minimumPriority: 2);
static void ShowDashboard(
string projectName,
IEnumerable<ProjectTask> tasks,
int minimumPriority)
{
var urgentTasks = tasks.Where(
task => task.Priority >= minimumPriority);
foreach (ProjectTask task in ReadyTasks(urgentTasks))
{
Console.WriteLine(FormatTask(task));
}
string FormatTask(ProjectTask task) =>
$"{projectName}: {task.Title}";
}
static IEnumerable<ProjectTask> ReadyTasks(
IEnumerable<ProjectTask> tasks)
{
foreach (ProjectTask task in tasks)
{
if (!task.IsBlocked)
{
yield return task;
}
}
}
record ProjectTask(string Title, int Priority, bool IsBlocked);
Každá volba zachová jinou část práce jasnou:
- Lambda předaná do
Whereumístí krátké pravidlo priority vedle operace, která ji používá. - Místní funkce
FormatTaskoznačuje krok formátování, který patří pouze doShowDashboard. - Iterátor
ReadyTasksumožňuje volajícím zpracovávat připravené úlohy bez vytvoření zprostředkující kolekce. - Smyčka
foreachprovede konečnou akci, která zapíše každý výsledek, explicitně.
Pro porovnání může ReadyTasks nahradit Where(static task => !task.IsBlocked), protože tento test připravenosti je jednoduchý filtr. Oba formuláře filtr odloží až do enumerace. Lambda umístí pravidlo na místo volání; ReadyTasks dává pravidlu název. Vyberte si mezi nimi podle toho, které informace pomáhají čtenářům porozumět volajícímu.
Články, které následují, používají porovnání, která vysvětlují, kdy je každý přístup vhodný a co čtenáři můžou odvodit z vašeho výběru.