Räkna ut samtalskedjan [stängd]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Stängd. Denna fråga är utanför ämnet . För närvarande accepteras inte svar.

Kommentarer

  • det finns inget arv eller något mellan dessa klasser heller.
  • Enkel reflektion visar dig när som helst din nuvarande metod för att anropa . Du behöver ' inte behöver en fullständig stackspårning för detta. Frågan hör antagligen till StackOverflow.
  • @JimmyHoffa Frågan letar efter generiska OO-sätt att göra detta (till skillnad från den ursprungliga versionen av mitt svar nedan).
  • Kan du göra montering A och församlingB ärver från församlingC så att de båda har tillgång till den här metoden? Eller kan MethodFoo () göras statisk så att du inte ' inte behöver göra ett objekt av den klassen för att kalla det?
  • varför skulle du behöva ? om du behöver olika beteenden skapa olika metoder eller skicka en parameter

Svar

Jag känner inte till någon generisk eller vanliga mönster över programmeringsspråk. De flesta hanterar det med dedikerade reflektions-API: er.

I .Net använder du System.Diagnostics.StackFrame och System.Diagnostics.StackTrace -klasser. Se https://stackoverflow.com/questions/12556767/how-to-get-current-line-number-for-example-use-at-messagebox-show/12556789#12556789 för ett exempel. Andra språk och miljöer kan ha motsvarigheter.

Kommentarer

  • Ja, men finns det ett objektorienterat sätt att lösa detta? så för att undvika StackTrace
  • @BDotA: Om du bryr dig om vem som ringde till dig ' gör du inte OOP. Tänk om vad du är försöker att göra. (Jag erkänner att .NET ofta inte är OO och vi måste lämna OO ibland när vi använder det, men det lönar sig att veta att vi ' gör detta, även om vi måste göra det ändå.)

Svar

Jag går ut på en lem här och gissar att du letar efter objektorienterade tekniker för att implementera instrumentering.

Det finns två omedelbara sätt att tänka på, mest använda skulle vara det första jag gissar:

  1. Ha en global stapel (singleton eller vad har du) någonstans med vilken varje metod som körs omedelbart lägger till sig. effektivt upprätthålla en global samtalskedja. Du kan bara inte behöva poppa på slutet av varje metod som du försöker instrumentera, vanliga andra instrumenteringsmetoder är att starta ett stoppur i början av din metod och sluta i slutet för att registrera längden etc.

  2. Ha en ram av DI-typ som är en router för alla metodsamtal som kan fungera mer liknar meddelandeöverföring, och inuti detta ramverk noterar du i en stapel varje metodsamtal som förekommer liknande ovan, förutom att det skulle vara centraliserat till det här stället.

Jag kan inte säga att jag föreslår # 2 utan att kanske använda något AOP-ramverk eller något men totalt sett är det lite av en extrem instrumentation i mina ögon att behålla din egen stackspårning på 100% av metodsamtal. Perfekt för felsökningstyp och kanske nödvändigt om du inte arbetar på ett reflexivt språk, men jag skulle vara säker på att jag kunde stänga av något liknande för produktion och göra mitt bästa för att hålla det ur vägen, varför jag gillar inte # 2 ovan.

Ingen av dessa är nödvändig i ett reflexivt språk och bör därför inte implementeras i C # förutom för att illustrera korsningsprocessen gränser. (påminnelse: de kanske är snabbare än reflektion om de görs rätt, men underhållskostnaden gör dem ändå inte värda det)

Kommentarer

  • Tack för idéerna, så i C # hur kan jag göra det med Reflection? Jag vet inte om jag kan flytta det här inlägget till SO? eller kopiera klistra in och skapa ett nytt inlägg i SÅ en bra idé … så om du skulle kunna hjälpa mig med reflektion skulle det vara bra.
  • @BDotA Titta på stackoverflow.com/questions/171970/ … men jag trodde att jag återkallade ett sätt utan att åberopa StackFrame objektet har inte hittat '. Ändå bör teknikerna ovan inte göras i C #, utan du bör använda StackFrame om det behövs.

Svar

IMHO du bör fråga dig själv på allvar varför du tror att du behöver det här.

Om MethodFoo() beter sig annorlunda om det anropas från sammansättning A eller B, är den anropande enheten något som en dold inmatningsparameter till MethodFoo() och kan förmodligen bli orsaken till oväntat eller felaktigt beteende.Så som ett alternativ, gör den ingångsparametern uttrycklig: lägg till en ytterligare parameter till MethodFoo() som anger sammanhanget eller uppringaren. Detta kan vara en enum, en string -parameter eller en referens till själva den anropande enheten, beroende på den avsedda beteendeförändringen av MethodFoo().

Kommentarer

  • Åh kära jag gjorde inte ' t föreställ dig till och med att han försökte kontrollera flödet, att ' är en mycket skrämmande tanke … Det är uppenbart att du är mycket mer pessimistisk än jag att ha kommit med den slutsatsen, men tyvärr du kan ha rätt ..
  • @JimmyHoffa: om någon ställer en fråga som denna utan att nämna något om hans avsikt blir jag misstänksam 😉

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *