Puheluketjun selvittäminen [suljettu]

Suljettu. Tämä kysymys on aiheen ulkopuolella . Se ei tällä hetkellä hyväksy vastauksia.

Kommentit

  • Myöskään näiden luokkien välillä ei ole perintöä tai mitään muuta.
  • Yksinkertainen pohdinta kertoo sinulle milloin tahansa nykyiset tapasi kutsumenetelmä . Et tarvitse ' tätä varten täyttä pinoa. Tämä kysymys kuuluu todennäköisesti StackOverflow-palveluun.
  • @JimmyHoffa Kysymys etsii yleisiä OO-tapoja tehdä tämä (toisin kuin alla olevan vastaukseni alkuperäinen versio).
  • Voisitko tehdä assemblyA: n ja assemblyB periä assemblyC: ltä, joten molemmilla on pääsy tähän menetelmään? Vai voisiko MethodFoo (): sta tehdä staattisen, jotta sinun ei ' tarvitse itse tehdä kyseisen luokan objektia kutsuttaaksesi sitä?
  • miksi sinun pitäisi ? jos tarvitset erilaista käyttäytymistä, luo erilaisia menetelmiä tai välitä parametri

Vastaa

En ole tietoinen yleisistä tai yleisiä malleja ohjelmointikielillä. Useimmat käsittelevät sitä omilla heijastussovellusliittymillä.

Käytä .Netissä System.Diagnostics.StackFrame ja System.Diagnostics.StackTrace -luokkia. Katso esimerkki https://stackoverflow.com/questions/12556767/how-to-get-current-line-number-for-example-use-at-messagebox-show/12556789#12556789 . Muilla kielillä ja ympäristöillä voi olla vastaavia.

Kommentit

  • Kyllä, mutta onko olemassa objektiivinen tapa ratkaista tämä? StackTracen välttämiseksi
  • @BDotA: Jos välität siitä, kuka soitti sinulle, ' ei tee OOP: ta. Ajattele uudelleen mitä olet yrittää tehdä. (Myönnän, että .NET ei ole usein OO, ja meidän on jätettävä OO joskus sen käytölle, mutta kannattaa tietää että ' uudelleen näin, vaikka meidänkin olisikin tehtävä se joka tapauksessa.)

Vastaa

Menen ulos raaja täällä ja arvaat etsivänsi kohdennettuja tekniikoita instrumentoinnin toteuttamiseksi.

Tulee mieleen kaksi välitöntä tapaa, yleisimmin käytetty olisi ensimmäinen arvaus:

  1. Pyydä globaalia (singleton tai mitä sinulla on) pinoa jonnekin, johon jokainen suoritettava menetelmä lisää välittömästi itsensä. globaalin puheluketjun ylläpitäminen tehokkaasti. Sinun ei kuitenkaan tarvitse ponnahtaa jokaisen instrumentin lopussa, jota yrität instrumentoida, yleisiä muita instrumentointikäytäntöjä ovat sekuntikellon aloittaminen menetelmän alussa ja lopettaminen lopussa pituuden tallentamiseksi jne.

  2. Käytä DI-tyyppistä kehystä, joka on reititin kaikille menetelmäpuheluille, mikä saattaa toimia Se muistuttaa enemmän viestien välittämistä, ja tämän kehyksen sisällä kirjoittaisit pinoon jokaisen menetelmäkutsun, joka tapahtuu samanlaisella kuin yllä, paitsi että se keskitettäisiin tähän yhteen paikkaan.

En voi sanoa, että ehdotan # 2 käyttämättä ehkä jotakin AOP-kehystä tai jotain, mutta kaiken kaikkiaan oman pinojäljesi ylläpitäminen 100%: lla menetelmäpuheluista on hiukan äärimmäinen instrumentointi silmissäni. Erinomainen virheenkorjaukseen ja ehkä välttämätön, jos et työskentele refleksiivisellä kielellä, mutta olisin varma, että voisin kytkeä kaiken sen pois päältä helposti tuotantoon ja tehdä parhaani pitääksesi sen poissa tieltä, minkä vuoksi minä Älä todellakaan pidä yllä olevasta # 2: sta.

Kumpikaan näistä ei ole välttämätöntä refleksiivisen kielen sisällä, eikä sitä siksi pidä toteuttaa C #: ssä paitsi ylitysprosessin havainnollistamiseksi. rajoja. (varoitus: ne saattavat olla nopeammat kuin pohdinta, jos ne tehdään oikein, mutta ylläpitokustannukset eivät silti kannata niitä)

Kommentit

  • Kiitos ideoista, joten miten C #: ssä voin tehdä sen Reflectionin avulla? En tiedä, voinko siirtää tämän viestin SO: han? tai kopioi liitä ja luo uusi viesti SO: ssa hyvä idea … joten jos voisit auttaa minua Reflection-tavalla, olisi hienoa.
  • @BDotA Katso stackoverflow.com/questions/171970/ … , vaikka ajattelin, että muistan tavan kutsumatta objektia StackFrame I haven ' ei löytänyt sitä. Silti yllä olevia tekniikoita ei pitäisi tehdä C #: ssä, vaan sinun on käytettävä StackFrame tarvittaessa.

Vastaa

IMHO: n tulisi kysyä itseltäsi vakavasti, miksi luulet tarvitsevasi tätä.

Jos MethodFoo() käyttäytyy eri tavalla, jos sitä kutsutaan kokoonpanosta A tai B, niin kutsuva kokoonpano on jotain piilotettua syöteparametriä kuin MethodFoo() ja siitä voi todennäköisesti tulla syy odottamattomaan tai virheelliseen käyttäytymiseen.Joten tee vaihtoehtoisesti, että syöteparametri on selkeä: lisää uusi parametri kohtaan MethodFoo(), joka ilmaisee kontekstin tai soittajan. Tämä voi olla enum, string -parametri tai viite itse kutsuvaan kokoonpanoon, riippuen aiotusta MethodFoo().

Kommentit

  • Voi rakas, en ' t edes kuvittele, että hän yritti hallita virtausta, että ' on hyvin pelottava ajatus … Olet selvästikin paljon pessimistisempi kuin minä, kun olet tullut tähän johtopäätökseen, mutta valitettavasti sinä voi olla oikeassa ..
  • @JimmyHoffa: jos joku kysyy tällaisen kysymyksen mainitsematta mitään aikomuksestaan, minusta tulee epäilyttävä 😉

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *