Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Gyakran több algoritmus vagy implementáció is helyesen oldja meg ugyanazt a feladatot. A választott kód egy kialakítást sugall. A kódot olvasó fejlesztők és kódolási ügynökök a kód szerkezete alapján következtetnek a szándékodra: mire van szüksége az egyes műveleteknek, hol a helyük, és mikor futnak.
Tip
Ez a cikk az alapvető C# kifejezéseket, utasításokat és metódusokat ismerő fejlesztők számára készült Alapismeretek szakasz része. Ha még csak most ismerkedik a programozással, először az Első lépések oktatóanyagokkal kezdje.
Ez a szakasz összehasonlítja az algoritmusokhoz kapcsolódó érvényes megközelítéseket, és elmagyarázza a viselkedésük és az olvasók értelmezésének apró különbségeit. Az ismerős nyelvi elemeket, például típusokat, kifejezéseket, utasításokat és metódusokat kombinálhatja, és kiválaszthatja az Ön által tervezett kialakítást kommunikáló formákat.
Viselkedés és tervezési szándék összehasonlítása
Mielőtt kiválaszt egy implementációt, gondolja át, hogy más kód hogyan fogja használni. Ez a kód a hívó: bemeneteket szolgáltat, meghívja a műveletet, és az eredményeket használja. Szükség van azonnal befejezett eredményre, vagy fel tudja dolgozni egyenként az értékeket? A segéd csak ehhez a művelethez tartozik, vagy más műveletek is használják? Ezek a kérdések segítenek összehasonlítani a szükséges viselkedést és a kód által közvetített tervezési szándékot.
Egy rövid beágyazott művelet a használat helyén mutatja be az olvasóknak a lépéseket. Például a Where(task => task.Priority > 3) azonnal láthatóvá teszi a szűrési szabályt. A nevesített segítő, mint a(z) Where(IsUrgent) esetében, hangsúlyozza a szabály célját, és lehetővé teszi az olvasók számára, hogy külön megvizsgálhassák a részleteket. Válasszon az alapján, hogy a lépések vagy azok célja magyarázza-e a legjobban a környező kódot.
Az, hogy hol deklarál egy segítőt, jelzi annak kívánt hatókörét. Egy ShowDashboard belsejében lévő helyi függvény azt jelzi, hogy a segítő az adott művelethez tartozik, és megakadályozza, hogy más tagok meghívják. A tartalmazó típuson lévő privát metódus elérhetővé teszi a segítőt a többi tag számára, ami arra utal, hogy várhatóan a típus más részein is újra fel lesz használva. Mindkettő ugyanazt a számítást strukturálhatja, de különböző elvárásokat támaszt az olvasók számára a szerepével kapcsolatban.
A segítő bemeneteinek megadása a függőségeket közli. Egy korlát paraméterként való átadása, például IsUrgent(task, minimumPriority), az adott bemenetet minden hívásnál láthatóvá teszi. Egy helyi függvény vagy lambda ehelyett bezárhatjaminimumPriority a változót a környező hatókörből anélkül, hogy argumentumként kapná meg. A Capture összekapcsolja a segítőt az azt tartalmazó művelet környezetével; az explicit paraméterek megkönnyítik a megadott adatok azonosítását. Használjon static helyi függvényt vagy lambdát, ha azt szeretné kikényszeríteni, hogy az ne rögzítse a környező állapotot.
Az, ahogyan az eredményeket visszaadja, jelzi, mikor történik a munka. A gyűjteményt összeállító és visszaadó metódus még azelőtt befejezi ezt a munkát, hogy a hívó megkapja a gyűjteményt. Az iterátor elemeket szolgáltat, amikor a hívó kéri őket, így a hívó leállíthatja az összes elem szolgáltatása előtt. Mindkettő ugyanazokat az értékeket eredményezheti, de a hívóknak meg kell érteniük, hogy befejezett eredményeket kapnak-e, vagy olyan sorozatot, amelynek a számítása még hátra van.
Minden választásnál először azonosítsa a hívó kód által igényelt viselkedést. Ezután gondolja át, hogy egy másik fejlesztő vagy kódoló ágens mit fog következtetni a névből, hatókörből, bemenetekből és eredményből. Válasszon olyan formát, amely összhangba hozza ezeket az elvárásokat a tervével, és magyarázza el azt a fontos viselkedést, amelyet a kód formája önmagában nem fed fel. A cél az, hogy megfontolt döntést hozzunk az érvényes alternatívák között, és ne alkalmazzunk mindenhol egy formát.
Tervezési döntések megtekintése egy példában
Az alábbi példa bemutatja, hogy több választás hogyan közvetíti a terv különböző részeit. Megjeleníti azokat a feladatokat, amelyek sürgősek és készen állnak az indításra. A ProjectTask tartalmazza a tevékenység címét, prioritását és blokkolt állapotát.
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);
Minden választás a munka egy másik részét teszi egyértelművé:
- Az átadott
Wherelambda egy rövid prioritási szabályt helyez az azt használó művelet mellé. - A helyi függvény
FormatTaskegy olyan formázási lépést nevez el, amely csak a fájlhozShowDashboardtartozik. - Az iterátor
ReadyTaskslehetővé teszi, hogy a hívók köztes gyűjtemény létrehozása nélkül feldolgozhassák a kész feladatokat. - A
foreachciklus explicitté teszi a végső műveletet, azaz az egyes eredmények kiírását.
Összehasonlításképpen ReadyTasks lecserélheti a(z) Where(static task => !task.IsBlocked)-t, mert ez a készültségi teszt egy egyszerű szűrő. Mindkét űrlap a felsorolás megkezdéséig elhalasztja a szűrőt. A lambda a szabályt a hívás helyszínén helyezi el; ReadyTasks nevet ad a szabálynak. Válasszon közülük aszerint, hogy melyik információ segít az olvasóknak megérteni a hívót.
Az alábbi cikkek hasonló összehasonlításokat használnak annak magyarázatára, hogy mikor megfelelő az egyes megközelítések használata, és mire következtethetnek az olvasók az Ön választása alapján.