2010. június 3., csütörtök

Az [Obsolete] attribútum esete a #pragmával (és sok más érdekes)

Adott a szituáció, hogy van egy metódus a kódunkban, ami elavult, régi, legacy, azóta van jobb, azt kéne használni, a régit pedig nem kéne hívni. A legegyszerűbb lenne egyszerűen kidobni, de sajnos nem lehet, mert van néhány szintén elavult, régi, legacy kód, ami hívja, és azokhoz nem akarunk / tudunk hozzányúlni.
Mindenképp szeretnénk viszont biztosítani, hogyaz újonnan íródó kódok már az új metódust használják. Milyen módszerek vannak?

  • Írunk egy emailt mindenkinek, hogy használja az új metódust - ez EPIC FAIL.
  • A metódus XML kommentjében (ugye minden metóduson van?) jelezzük, hogy ne használd, és miért ne használd, és mit kell használni helyette - eggyel jobb, sőt, kiegészítő megoldásként kimondottan jó ötlet.
  • Megjelöljük az [Obsolete] attribútummal. - na, ez az, ez kell nekünk, az ultimate, überfrankó megoldás!
Az Obsolete attribútummal megjelelölt metódusok fordításakor a fordító egy warning-ot generál, ami remélhetőleg fel fog tűnni a fejlesztőnek a build output-ban.

Remélhetőleg - de messze nem biztos. Sokat segít, ha egyébként nem vagyunk tele warningokkal - azok sokszor amúgy is inkább error-ok, mint warningok - de még akkor sem hundert Prozent.

Van ugyan egy overload-ja az Obsolete attribútumnak, ahol egy bool paraméterben megmondhatjuk, hogy ne warning-ot, hanem error-t generáljon az elavult metódus hívásakor - azt már csak észreveszi a fejlesztő, hogy nem fordul a kódja.
Van viszont egy hátulütője is ennek a megoldásnak: az a régi, legacy kód sem fog fordulni, amit viszont nem akarunk átírni az új metódus használatára. Ennyi erővel ki is hajinthatnánk az elavult metódusunkat, úgy se lehet hívni sehogy (bár reflection-nel pl. lehet, de egyelőre maradjunk a keresztény kultúrkörben).

Meg egyébként is, ne bolygassuk a múltat, minden maradjon a régiben, ne jöjjenek mindenféle warningok, csak ha valami új kód próbálná hívni az elavult metódust, csapjon a fejlesző kezére a Visual Studio!
Maradjunk tehát az [Obsolete] annál az overload-jánál, ami nem dob hibát:

[Obsolete]
static void OldMethod()
{
    Console.WriteLine("Don't call me!");
}

static void Main(string[] args)
{
    OldMethod();
}
Ha ezt így lefordítjuk, egy "'OldMethod()' is obsolete" warningot kapunk. Tegyük fel, hogy ez az a pont, ahol a régi kód hív, tűntessük el a warningot:
static void Main(string[] args)
{
    #pragma warning disable 612
    OldMethod();
    #pragma warning restore 612
}
Megjegyzés: ha az Obsolete-nek azt az overload-ját használjuk, ami saját üzenetet ír ki, akkor nem 612-es, hanem 618-as kódú warning generálódik!

Eddig remek. Most már csak azt kéne elérni, hogy a Visual Studio egy warning-nál erőteljesebben hozza a tudomásunkra, ha olyat próbálnánk hívni, amit nem kéne.
Nosza, vegyük rá, hogy ezeket a warningokat hibaként kezelje! A projektünk properties ablakában, a build fül "Treat warnings as errors" szekcióban pont ezt tehetjük meg:


Ezzel el is értük, amit akartunk: a világ ismét megmenekült a pusztulástól.
Viszontlátásra.

0 megjegyzés:

Megjegyzés küldése