A híváslánc kitalálása [lezárva]

Zárt. Ez a kérdés témán kívüli . Jelenleg nem fogadja el a válaszokat.

Megjegyzések

  • ezek az osztályok között sincs öröklődés vagy semmi.
  • Az egyszerű reflexió bármikor megmondja az Ön jelenlegi módszereit. . Ehhez nem kell teljes veremkövetés '. Ez a kérdés valószínűleg a StackOverflow-hoz tartozik.
  • @JimmyHoffa A kérdés általános OO-módszereket keres erre (ellentétben az alábbi válaszom eredeti verziójával).
  • Tudna-e összeállítani AssemblyA és a assemblyB örökölje az assemblyC-t, így mindketten hozzáférhetnek ehhez a módszerhez? Vagy a MethodFoo () statikussá tehető, így nem kell ' valójában az adott osztályba tartozó objektumot létrehozni ahhoz, hogy felhívhassa?
  • miért kellene ? ha más viselkedésre van szüksége, akkor hozzon létre különböző módszereket, vagy adjon át egy paramétert

Válasz

Nincs tudomásom általánosról vagy a programozási nyelvek közös mintái. Legtöbben dedikált reflexiós API-kkal kezelik.

A .Net-ben használja a System.Diagnostics.StackFrame és a System.Diagnostics.StackTrace osztályok. Például lásd: https://stackoverflow.com/questions/12556767/how-to-get-current-line-number-for-example-use-at-messagebox-show/12556789#12556789 . Más nyelveknek és környezeteknek lehetnek ekvivalenseik.

Megjegyzések

  • Igen, de van-e objektum-orientált megoldás erre? így elkerülhető a StackTrace
  • @BDotA: Ha érdekel, ki hívott, ' nem csinálsz OOP-t. Gondold át, mi vagy próbálkozik. (Elismerem, hogy a .NET gyakran nem OO, és néha el kell hagynunk az OO-t, amikor használjuk, de érdemes tudnunk hogy ' újra így, még akkor is, ha ezt mindenképp meg kell tennünk.)

Válasz

Kifelé megyek itt egy végtag, és kitalálja, hogy objektumorientált technikákat keres a műszerezés megvalósításához.

Két azonnali mód jut eszembe, a leggyakrabban használt módszer az első, amit tippelek:

  1. Legyen egy globális (szingulett vagy mi van) verem valahol, amellyel minden végrehajtott módszer azonnal hozzáadja magát. hatékonyan fenntartja a globális hívásláncot. Nem szabad, hogy a Minden műszer végén, amelyet műszerezni próbál, a szokásos műszeres gyakorlat szerint stoppert indít a módszer elején, a végén pedig leállítja a hossz rögzítését stb.

  2. Rendelkezzen olyan DI típusú keretrendszerrel, amely egy útválasztó az összes metódushíváshoz, ami viselkedhet Ez sokkal inkább hasonlít az üzenet továbbítására, és ennek a keretrendszernek a tetején felírna minden metódushívást, amely a fentihez hasonlóan fordul elő, kivéve, ha erre az egy helyre központosítaná.

Nem mondhatom, hogy a 2. sz. javaslatot teszem anélkül, hogy esetleg használnék valamilyen AOP keretrendszert, vagy valami, de a saját verem nyomának fenntartása a metódushívások 100% -án kissé extrém műszer a szememben. Nagyszerű a típusú dolgok hibakereséséhez, és talán szükséges, ha nem reflexív nyelven dolgozol, de biztos lennék abban, hogy bármi hasonlót könnyen kikapcsolhatnék a gyártáshoz, és mindent megteszek, hogy megakadályozzam az utat, ezért nagyon nem tetszik a fenti 2. sz..

Ezek egyikére sem szükség van egy reflexív nyelvben, ezért nem szabad C # nyelven megvalósítani, csak az átlépési folyamat szemléltetésére. határok. (figyelmeztetés: lehet, hogy gyorsabbak, mint a tükrözés, ha jól csinálják, de a karbantartási költségek mégsem érik meg őket)

Megjegyzések

  • Köszönöm az ötleteket, ezért a C # -ban hogyan tudom megcsinálni Reflection-el? Nem tudom, ha áthelyezhetem ezt a bejegyzést SO-ra? vagy másolja be a beillesztést, és hozzon létre egy új bejegyzést SO-ban egy jó ötlet … szóval, ha tudnál segíteni a Reflection módon, nagyszerű lenne.
  • @BDotA Nézd meg a stackoverflow.com/questions/171970/ … , bár azt hittem, hogy felidéztem egy módszert anélkül, hogy az StackFrame I objektumot meghívtam volna a haven ' nem találta meg. A fenti technikákat még mindig nem szabad C # nyelven végrehajtani, inkább használja a StackFrame -et, ha szükséges.

Válasz

IMHO, komolyan kérdezd meg magadtól, miért gondolod, hogy erre van szükséged.

Ha a MethodFoo() másképp viselkedik, ha az A vagy B összeállításból hívják meg, akkor a hívó összeállítás valami rejtett bemeneti paraméter a MethodFoo() és valószínűleg a váratlan vagy téves viselkedés okává válhat.Tehát alternatívaként tegye egyértelművé azt a bemeneti paramétert: adjon hozzá egy további paramétert a MethodFoo() elemhez, amely jelzi a kontextust vagy a hívót. Ez lehet egy enum, egy string paraméter, vagy hivatkozás magára a hívó összeállításra, a MethodFoo().

Megjegyzések

  • Ó kedves, nem tettem ' t képzelje el, hogy megpróbálta irányítani az áramlást, ez ' nagyon ijesztő gondolat … Nyilvánvalóan sokkal pesszimistább vagy, mint én, hogy erre a következtetésre jutottál, de sajnos te igaza lehet ..
  • @JimmyHoffa: ha valaki ilyen kérdést tesz fel anélkül, hogy bármit is említene a szándékáról, gyanús leszek 😉

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük