Vienkāršs atkļūdošanas palīgs

Bieži vien, atkļūdojot kādu koda fragmentu mēs vēlamies ātri identificēt objekta instanci un redzēt tās nozīmīgākos datus. Lai to redzētu uzraudzīto objektu ("Watch") logā, bieži nākas "uzraudzīt" vairākas viena objekta īpašības. Ja apskatām personas klasi, kas sastāv no vārda, uzvārda un personas koda,

    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Code { get; set; }
    }

tad tas varētu izskatīties apmēram šādi:

debuging_1

Neērti, un pie sarežģītākas objektu struktūras paliek vēl neērtāk. Dzīvi (vismaz atkļūdošanu) var padarīt ērtāku, ja objektam pārraksta ToString() metodi, lai tā atgrieztu svarīgāko objekta informācija teksta formā. T.i. šajā gadījumā papildinot Person klasi ar ToString() metodi

    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Code { get; set; }

        public string ToString()
        {
            return FirstName + " " + LastName + ", " + Code;
        }
    }

Atkļūdošanā var redzēt svarīgo informāciju jau tajā rindā, kurā ir izvēlētais objekts:

debuging_2

Ja šeit šī iespēja varētu arī nelikties tik iespaidīga, tad īpaši dzīvi tā atvieglo Visual Studio atkļūdošanas režīma konteksta izvēlnē. Salīdziniet paši:

debuging_4

debuging_3

Veiksmīgu atkļūdošanu!

Published 05 November 2008 09:43 AM by ivars.arins

Comments

# andrejs.mamontovs said on 06 November, 2008 10:01 AM

Redz kā, metodes ToString pārrakstīšana var noderēt tur, kur to mazāk gaidījām:)

# valdis.iljuconoks said on 06 November, 2008 05:59 PM

ar speciāliem atribūtiem arī ir iespējams regulēt ko redz un ko neredz debuggerī :)

# ivars.arins said on 06 November, 2008 09:28 PM

Valdi, varbūt ka kļūdos, bet es nezinu veidu, kā dabūt šādu rezultātu ar atribūtiem :)

# Andris said on 07 November, 2008 12:45 AM

Tadam lietam ir domats DebuggerDisplayAttribute;

[DebuggerDisplay("{FirstName} {LastName} {Code}")]

   class Person

   {

...

# valdis.iljuconoks said on 07 November, 2008 06:19 AM

es gribēju pateikt, ka troksni ko redzi debugger logā vafr samazināt ar, piemēram, DebuggerBrowsableAttribute atribūtu

# ivars.arins said on 07 November, 2008 08:23 AM

Andri, par šādu atribūtu nezināju (kā jau minēju iepriekšējā komentārā). Lai gan lielākajā daļā tas noderētu,varu atrast scenārijus, kur ar to nepietiks (piem., ja reprezentācijai nepieciešama kāda loģika).

P.S. Prieks, ka šeit komentē vēl kāds!

# Andris said on 07 November, 2008 11:29 AM

Ivar,  ja reprezentācijai nepieciešama kāda loģika var ievest property un tur realizēt.

P.S. Komentē vēl kāds, jo guest post review by moderator un post paradas ar aizkavēšanu.

# andrejs.mamontovs said on 07 November, 2008 12:26 PM

Piebilde no profesionālās pieredzes, mēs pārāk reti aizdomājamies par atkļūdošanas ērtību. Šo tēmu var turpināt nākotnē.

P.S. Patīkami pārsteigts, ka šeit sāka veidoties diskusija.

# ivars.arins said on 07 November, 2008 06:19 PM

Andri, protams, var izmantot arī variantu ar property, bet, manuprāt, tas būtiski neatšķirsies. Jebkurā gadījumā, redzam, ka ir iespējami vairāki varianti, no kuriem izvēlēties.

# darkYuris said on 19 April, 2009 12:04 AM

Šādas lietas ir jāpakārto produkcijas kodam un nevis otrādi. Ja atribūta uzspraušana vēl ir salīdzinoši pieņemama, tad ToString metodes pārrakstīšana šādiem mērķiem jau ir redundantas loģikas veidošana, kas var izraisīt nevajadzīgas kolīzijas un konsekvences trūkumu reizēs, kad šī metode jāpārraksta citiem mērķiem.

Pašam riebj cik smalki sanāca. :)

Leave a Comment

(obligāts) 
(obligāts) 
(brīvizvēles)
(obligāts)