At finde ud af opkaldskæden [lukket]

Lukket. Dette spørgsmål er uden for emnet . Det accepteres i øjeblikket ikke svar.

Kommentarer

  • der er heller ingen arv eller noget mellem disse klasser.
  • Enkel refleksion fortæller dig til enhver tid din nuværende metode til opkaldsmetode . Du behøver ' ikke brug for en fuld staksporing til dette. Dette spørgsmål hører sandsynligvis til StackOverflow.
  • @JimmyHoffa Spørgsmålet er på udkig efter generiske OO-måder at gøre dette på (i modsætning til den oprindelige version af mit svar nedenfor).
  • Kunne du lave forsamlingA og forsamlingB arver fra forsamlingC, så de begge har adgang til denne metode? Eller kunne MethodFoo () gøres statisk, så du ikke ' faktisk ikke har brug for at gøre et objekt af den klasse for at kalde det?
  • hvorfor skulle du have brug for ? hvis du har brug for forskellig opførsel, skal du oprette forskellige metoder eller sende en parameter

Svar

Jeg er ikke opmærksom på nogen generisk eller almindelige mønstre på tværs af programmeringssprog. De fleste håndterer det ved dedikerede refleksions-APIer.

I .Net skal du bruge System.Diagnostics.StackFrame og System.Diagnostics.StackTrace klasser. Se https://stackoverflow.com/questions/12556767/how-to-get-current-line-number-for-example-use-at-messagebox-show/12556789#12556789 for et eksempel. Andre sprog og miljøer kan have ækvivalenter.

Kommentarer

  • Ja, men er der en objektorienteret måde at løse dette på? så for at undgå StackTrace
  • @BDotA: Hvis du er ligeglad med, hvem der ringede til dig, ' laver du ikke OOP. Tænk igen over, hvad du er forsøger at gøre. (Jeg indrømmer, .NET er ofte ikke OO, og vi må nogle gange efterlade OO, når vi bruger det, men det lønner sig at vide at vi ' gør dette, selvom vi alligevel skal gøre det.)

Svar

Jeg går ud på et lem her og gætter på, at du leder efter objektorienterede teknikker til implementering af instrumentering.

Der er to øjeblikkelige måder, der kommer til at tænke på, mest brugt ville være det første, jeg gætter på:

  1. Har en global stak (singleton eller hvad har du) et sted, hvormed hver metode, der udføres, straks føjer sig til. effektivt opretholder en global opkaldskæde. Du kan kun være nødt til at poppe på slutningen af hver metode, du prøver at instrumentere, er almindelig anden instrumentationspraksis at starte et stopur i starten af din metode og stoppe i slutningen for at registrere længden osv.

  2. Har en DI-type ramme, der er en router til alle metodekald, som muligvis opfører sig mere beslægtet med meddelelsesoverførsel, og inden i denne ramme vil du notere i en stak alle metodekald, der forekommer svarende til ovenstående, bortset fra at det ville være centraliseret til dette sted.

Jeg kan ikke sige, at jeg foreslår nr. 2 uden måske at bruge nogle AOP-rammer eller noget, men i det hele taget er det lidt af en ekstrem instrumentering i mine øjne at opretholde dit eget stack-spor på 100% af metodekald. Fantastisk til fejlretning af ting, og måske nødvendigt, hvis du ikke arbejder på et refleksivt sprog, men jeg ville være sikker på, at jeg let kunne slå noget lignende fra til produktion og gøre mit bedste for at holde det ude af vejen, hvorfor jeg kan ikke lide nr. 2 ovenfor.

Ingen af disse er nødvendige i et refleksivt sprog og bør derfor ikke implementeres i C # undtagen for at illustrere krydsprocessen grænser. (advarsel: de kan være hurtigere end refleksion, hvis de gøres rigtigt, men vedligeholdelsesomkostningerne gør dem stadig ikke det værd)

Kommentarer

  • Tak for idéerne, så i C # hvordan kan jeg gøre det med refleksion? Jeg ved ikke, om jeg kan flytte dette indlæg til SO? eller kopier indsæt og opret et nyt indlæg på SÅ en god ide … så hvis du kunne hjælpe mig med refleksion, ville det være godt.
  • @BDotA Se på stackoverflow.com/questions/171970/ … selvom jeg troede, jeg huskede en måde uden at påberåbe mig StackFrame har ikke haft ' det. Selv stadig skal ovenstående teknikker ikke udføres i C #, men du skal hellere bruge StackFrame om nødvendigt.

Svar

IMHO, du bør spørge dig selv alvorligt, hvorfor du tror, du har brug for dette.

Hvis MethodFoo() opfører sig anderledes, hvis det kaldes fra samling A eller B, er den opkaldende enhed omtrent som en skjult inputparameter til MethodFoo() og kan sandsynligvis blive årsagen til uventet eller fejlagtig opførsel.Så som et alternativ skal du gøre denne inputparameter eksplicit: tilføj en yderligere parameter til MethodFoo() som angiver konteksten eller den, der ringer op. Dette kan være en enum, en string -parameter eller en henvisning til selve den opkaldende enhed afhængigt af den tilsigtede adfærdsændring af MethodFoo().

Kommentarer

  • Åh kære jeg gjorde ikke ' t forestil dig endda, at han forsøgte at kontrollere flowet, at ' er en meget skræmmende tanke … Det er klart, at du er meget mere pessimistisk end jeg at have kommet med den konklusion, men desværre dig kan have ret ..
  • @JimmyHoffa: hvis nogen stiller et spørgsmål som dette uden at nævne noget om hans intention, bliver jeg mistænksom 😉

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *