Paramétertervezés

Megjegyzés:

Ezt a tartalmat a Pearson Education, Inc. engedélyével nyomtatjuk újra a Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition című műből. Ezt a kiadást 2008-ban adták ki, és a könyvet azóta teljesen átdolgozták a harmadik kiadásban. Előfordulhat, hogy az oldalon található információk némelyike elavult.

Ez a szakasz a paraméterek tervezésére vonatkozó általános irányelveket tartalmaz, beleértve az argumentumok ellenőrzésére vonatkozó irányelveket tartalmazó szakaszokat is. Emellett tekintse meg az elnevezési paraméterekben leírt irányelveket.

✔️ A DO a legkevésbé származtatott paramétertípust használja, amely biztosítja a tag által igényelt funkciókat.

Tegyük fel például, hogy olyan metódust szeretne megtervezni, amely számba ad egy gyűjteményt, és minden elemet kinyomtat a konzolon. Egy ilyen módszernek a paramétert kell figyelembe vennie IEnumerable , például nem ArrayListIList.

❌ NE használjon fenntartott paramétereket.

Ha egy tagnak több bemenetre van szükség egy jövőbeli verzióban, új túlterhelés adható hozzá.

❌ NE használjon nyilvánosan közzétett metódusokat, amelyek paraméterekként mutatókat, mutatótömböket vagy többdimenziós tömböket használnak.

A mutatókat és a többdimenziós tömböket viszonylag nehéz megfelelően használni. Az API-k szinte minden esetben újratervezhetők, hogy ne használják ezeket a típusokat paraméterekként.

✔️ Az összes out paramétert az összes érték szerinti és ref paraméter után helyezze el (kivéve a paraméter tömböket), még akkor is, ha ez inkonzisztenciát okoz a túlterhelések közötti paraméterrendezésben (lásd A tag-túlterhelést).

A out paraméterek extra visszatérési értékeknek tekinthetők, és a csoportosításuk megkönnyíti a metódus aláírásának megértését.

✔️ Legyél következetes a paraméterek elnevezésében, amikor tagokat írsz felül vagy interfész tagjait implementálod.

Ez jobban kommunikálja a metódusok közötti kapcsolatot.

Választás az enumerálás és a logikai paraméterek között

✔️ NE használjon számokat, ha egy tagnak egyébként két vagy több logikai paramétere lenne.

❌ NE használjon Boole-eket, hacsak nem biztos abban, hogy soha nem lesz szükség kettőnél több értékre.

Az enumerálások némi teret adnak az értékek későbbi hozzáadásának, de tisztában kell lennie az Enum Designban ismertetett értékek számbavételének minden következményével.

✔️ VEGYE FIGYELEMBE, hogy logikai értékeket használ olyan konstruktorparaméterekhez, amelyek valóban kétállapotú értékek, és egyszerűen a logikai tulajdonságok inicializálására szolgálnak.

Argumentumok érvényesítése

✔️ A DO érvényesíti a nyilvános, védett vagy explicit módon implementált tagoknak átadott argumentumokat. Ha az ellenőrzés nem sikerül, dobja ki a System.ArgumentException vagy annak valamelyik alosztályát.

Vegye figyelembe, hogy a tényleges ellenőrzésnek nem feltétlenül kell a nyilvános vagy védett tagban történnie. Előfordulhat, hogy ez egy alacsonyabb szinten, egy privát vagy belső rutinnál történik. A lényeg az, hogy a végfelhasználók számára elérhető teljes felület ellenőrzi az argumentumokat.

✔️ DOBJA ArgumentNullException ha egy null paramétert adnak át, és a tag nem támogatja a null paramétereket.

✔️ Érvényesítse az enumerációs paramétereket.

Ne feltételezze, hogy az enum argumentumok az enum által meghatározott tartományban lesznek. A CLR lehetővé teszi bármely egész számérték átkonvertálását enum értékre, még akkor is, ha az érték nincs definiálva az enumban.

❌ NE használja Enum.IsDefined számtartomány-ellenőrzésekhez.

✔️ NE feledje, hogy a nem módosítható argumentumok az érvényesítés után módosulhattak.

Ha a tag biztonsági szempontból érzékeny, javasoljuk, hogy készítsen másolatot, majd ellenőrizze és dolgozza fel az argumentumot.

Paraméter átadása

A keretrendszertervező szempontjából három fő paramétercsoport létezik: az értékenkénti paraméterek, ref a paraméterek és out a paraméterek.

Ha egy argumentumot egy érték szerinti paraméteren keresztül adsz át, a tag megkapja az aktuálisan átadott argumentum másolatát. Ha az argumentum értéktípus, az argumentum egy példánya kerül a verembe. Ha az argumentum hivatkozástípus, a hivatkozás egy példánya kerül a verembe. A legnépszerűbb CLR-nyelvek, például a C#, a VB.NET és a C++ alapértelmezés szerint érték szerint adják át a paramétereket.

Amikor egy argumentumot egy paraméteren keresztül ref ad át, a tag a ténylegesen átadott argumentumra mutató hivatkozást kap. Ha az argumentum értéktípus, az argumentumra mutató hivatkozás kerül a verembe. Ha az argumentum referencia típusú, akkor egy hivatkozás a referenciára kerül a verembe. Ref paraméterek használatával a tag módosíthatja a hívó által átadott argumentumokat.

Out a paraméterek hasonlóak a paraméterekhez ref , néhány kisebb különbséggel. A paraméter eredetileg hozzárendeletlennek minősül, és nem olvasható a tag törzsében, mielőtt hozzá lett rendelve valamilyen értékhez. Emellett a paraméternek hozzá kell rendelnie egy értéket, mielőtt a tag visszatér.

❌ KERÜLJE a out vagy ref paraméterek használatát.

A out vagy ref paraméterek használatához tapasztalat szükséges a mutatókkal, az értéktípusok és a referenciatípusok különbségeinek megértése, valamint a több visszatérési értékkel rendelkező metódusok kezelése terén. Emellett nem széles körben értik a out és ref paraméterek közötti különbséget. Az általános közönség számára tervező keretrendszer-építészek nem várhatják el, hogy a felhasználók jártasak legyenek out vagy ref paraméterek használatában.

❌ NE adjon át referenciatípusokat hivatkozással.

A szabály néhány korlátozott kivételt tartalmaz, például a hivatkozások felcserélésére használható metódust.

Változó számú paraméterrel rendelkező tagok

Azok a tagok, amelyek változó számú argumentumot fogadhatnak, egy tömbparaméter megadásával vannak kifejezve. Például String a következő metódust adja meg:

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

A felhasználó ezután az alábbiak szerint hívhatja meg a String.Format metódust:

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

A C# params kulcsszó tömbparaméterhez való hozzáadása egy úgynevezett params tömbparaméterre módosítja a paramétert, és parancsikont biztosít egy ideiglenes tömb létrehozásához.

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

Ezzel lehetővé teszi, hogy a felhasználó meghívja a metódust úgy, hogy közvetlenül az argumentumlistában adja át a tömbelemeket.

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

Vegye figyelembe, hogy a params kulcsszó csak a paraméterlistában szereplő utolsó paraméterhez adható hozzá.

✔️ FONTOLJA meg a params kulcsszó hozzáadását a tömbparaméterekhez, ha azt várja, hogy a végfelhasználók kis számú elemet tartalmazó tömböket adjanak át. Ha várhatóan sok elem lesz átadva a gyakori forgatókönyvekben, a felhasználók valószínűleg nem adják át ezeket az elemeket a szövegbe, ezért a params kulcsszó nem szükséges.

❌ NE használjon params tömböket, ha a hívó szinte mindig rendelkezik a bemenettel egy tömbben.

A bájttömbparaméterekkel rendelkező tagok például szinte soha nem hívhatók meg egyéni bájtok átadásával. Emiatt a .NET-keretrendszer bájttömbparaméterei nem használják a params kulcsszót.

❌ NE használjon params tömböket, ha a tömböt a params tömbparamétert használó tag módosítja.

Mivel sok fordító az argumentumokat ideiglenes tömbté alakítja a hívóhelyen, a tömb ideiglenes objektum lehet, ezért a tömb módosításai elvesznek.

✔️ FONTOLJA meg a params kulcsszó használatát egy egyszerű paraméter-átvitel esetén, még akkor is, ha egy összetettebb paraméter-átvitel nem használhatná.

Kérdezd meg magadtól, hogy érdemes lenne-e a felhasználók számára a params tömböt egy túlterhelésben megtartani, még akkor is, ha nem lenne benne minden túlterhelésben.

✔️ A DO megpróbál paramétereket rendelni, hogy lehetővé tegye a params kulcsszó használatát.

✔️ FONTOLJA meg, hogy a rendkívül teljesítményérzékeny API-kban kis számú argumentummal rendelkező hívásokhoz speciális túlterheléseket és kódútvonalakat biztosítson.

Így elkerülhető, hogy tömbobjektumokat hozzon létre, amikor az API-t kis számú argumentummal hívják meg. A paraméterek nevét a tömbparaméter egyedi formájának megadásával és egy numerikus utótag hozzáadásával alakítsa ki.

Ezt csak akkor érdemes megtennie, ha a teljes kódútvonalat speciálisan meg szeretné jeleníteni, és nem csak tömböt hoz létre, hanem az általánosabb metódust is meghívja.

✔️ NE feledje, hogy a null paramétert params tömbargumentumként lehet átadni.

A feldolgozás előtt ellenőriznie kell, hogy a tömb nem null értékű-e.

❌ NE használja a varargs módszereket, más néven az ellipszist.

Egyes CLR-nyelvek, például a C++, támogatnak egy alternatív konvenciót a változóparaméter-listák, úgynevezett varargs metódusok átadására. A konvenciót nem szabad keretrendszerekben használni, mert nem felel meg a CLS-nek.

Mutatóparaméterek

Általánosságban elmondható, hogy a mutatók nem jelennek meg egy jól megtervezett felügyelt kód keretrendszer nyilvános felületén. A legtöbb esetben a mutatókat beágyazni kell. Bizonyos esetekben azonban szükség van mutatóra az együttműködési okokból, és ilyen esetekben a mutatók használata megfelelő.

✔️ A DO alternatívát kínál minden olyan tag számára, aki mutatóargumentumot használ, mivel a mutatók nem CLS-kompatibilisek.

❌ KERÜLJE a mutatóargumentumok költséges argumentumellenőrzését.

Kövesse a mutatókkal kapcsolatos gyakori konvenciókat a tagtervezés során.

Nincs szükség például a kezdőindex átadására, mert az egyszerű mutató aritmetikai használatával ugyanezt az eredményt érheti el.

© Részletek 2005, 2009 Microsoft Corporation. Minden jog fenntartva.

Újranyomva a Pearson Education, Inc. engedélyével, Krzysztof Cwalina és Brad Abrams Framework Design Guidelines: Konvenciók, Idiomák és Minták az Újrafelhasználható .NET Könyvtárak Számára, 2. kiadás című könyvéből, közzétéve 2008. október 22-én, a Addison-Wesley Professional által, a Microsoft Windows Fejlesztési Sorozat részeként.

Lásd még