Zjištění řetězce hovorů [closed]

Uzavřeno. Tato otázka je mimo téma . Momentálně nepřijímá odpovědi.

Komentáře

  • ani mezi těmito třídami není žádné dědictví ani nic.
  • Jednoduchá reflexe vám kdykoli řekne, jak vaše současná metoda volání metody . K tomu nepotřebujete ' úplné trasování zásobníku. Tato otázka pravděpodobně patří na StackOverflow.
  • @JimmyHoffa Otázka hledá obecné OO způsoby, jak toho dosáhnout (na rozdíl od původní verze mé odpovědi níže).
  • Mohli byste sestavit A a assemblyB dědí z assemblyC, takže oba mají přístup k této metodě? Nebo by mohla být metoda MethodFoo () nastavena na statickou, takže ' ve skutečnosti není nutné vytvořit objekt této třídy, aby jej mohl nazvat?
  • proč byste měli ? pokud potřebujete jiné chování, vytvořte různé metody nebo předejte parametr

odpověď

nejsem si vědom žádného obecného nebo běžné vzory napříč programovacími jazyky. Většina to zvládne pomocí vyhrazených odrazových API.

V .Net použijte System.Diagnostics.StackFrame a třídy System.Diagnostics.StackTrace . Příklad najdete v https://stackoverflow.com/questions/12556767/how-to-get-current-line-number-for-example-use-at-messagebox-show/12556789#12556789 . Jiné jazyky a prostředí mohou mít ekvivalenty.

Komentáře

  • Ano, ale existuje objektově orientovaný způsob řešení? abyste se vyhnuli StackTrace
  • @BDotA: Pokud vám záleží na tom, kdo vám volal, ' neděláte OOP. Přehodnoťte, čím jste snaží se dělat. (Připouštím, .NET často není OO a při jejím používání musíme OO někdy nechat za sebou, ale vyplatí se vědět , že ' re dělat to, i když to stejně musíme udělat.)

Odpověď

Jdu dál končetina tady a hádám, že hledáte objektově orientované techniky pro implementaci přístrojového vybavení.

Existují dva bezprostřední způsoby, které mi přijdou na mysl, nejčastěji používaným by byl první odhad:

  1. Mít někde globální (singleton nebo co máte) zásobník, se kterým se každá prováděná metoda okamžitě přidá. účinně udržovat globální řetězec volání. Můžete ale nemuset vyskočit na na konci každé metody, kterou se snažíte instrumentovat, je běžným dalším postupem instrumentace spuštění stopek na začátku vaší metody a zastavení na konci pro zaznamenání délky atd.

  2. Mít rámec typu DI, který je směrovačem pro všechna volání metod, která se mohou chovat Je to více podobné předávání zpráv a uvnitř tohoto rámce byste zaznamenali do zásobníku každé volání metody, které se vyskytuje podobně jako výše, kromě toho, že by bylo centralizováno na toto jedno místo.

emohu říci, že navrhuji # 2, aniž bych použil nějaký rámec AOP nebo něco takového, ale celkově je udržování vlastního trasování zásobníku na 100% volání metod v mých očích trochu extrémní instrumentací. Skvělé pro ladění typu a možná nutné, pokud nepracujete v reflexivním jazyce, ale byl bych si jist, že bych mohl něco takového snadno vypnout pro produkci a udělat vše pro to, aby to nepřekáželo, a proto opravdu se mi nelíbí # 2.

Ani jeden z nich není nutný uvnitř reflexivního jazyka, a proto by neměl být implementován v C # kromě ilustrace procesu křížení hranice. (upozornění: mohou být rychlejší než reflexe, pokud budou provedeny správně, ale díky nákladům na údržbu jim to za to nestojí)

Komentáře

  • Děkuji za nápady, takže v C #, jak to mohu udělat s Reflection? Nevím, jestli mohu tento příspěvek přesunout na SO? nebo zkopírujte vložení a vytvořte nový příspěvek v SO dobrý nápad … takže pokud byste mi mohli pomoci s Reflection způsobem by bylo skvělé.
  • @BDotA Podívejte se na stackoverflow.com/questions/171970/ … , i když jsem si myslel, že jsem si vzpomněl, aniž bych vyvolal StackFrame objekt I nebyl ' schopen jej najít. I přesto by výše uvedené techniky neměly být prováděny v C #, raději byste měli v případě potřeby použít StackFrame.

Odpověď

IMHO, měli byste se vážně ptát, proč si myslíte, že to potřebujete.

Pokud se MethodFoo() chová jinak, pokud je volána ze sestavy A nebo B, pak je volající sestava něco jako skrytý vstupní parametr pro MethodFoo() a pravděpodobně se může stát příčinou neočekávaného nebo chybného chování.Jako alternativu tedy tento vstupní parametr explicitně přidejte: do parametru MethodFoo() přidejte další parametr, který označuje kontext nebo volajícího. Může to být enum, string parametr nebo odkaz na samotné volající sestavení, v závislosti na zamýšlené změně chování MethodFoo().

Komentáře

  • Panebože, nedělal jsem ' t dokonce si představte, že se pokouší ovládat tok, ta ' je velmi děsivá myšlenka … Je zřejmé, že jste mnohem pesimističtější než já, abych přišel k tomuto závěru, ale bohužel vy může mít pravdu ..
  • @JimmyHoffa: pokud někdo položí takovou otázku, aniž by zmínil něco o svém záměru, mám podezření 😉

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *