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!
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