Voi ieși un membru aici și ghicind că sunteți în căutarea unor tehnici orientate pe obiecte pentru implementarea instrumentelor.
Există două moduri imediate care îmi vin în minte, cel mai frecvent utilizate ar fi primul pe care îl ghicesc:
-
Aveți o stivă globală (singleton sau ce aveți) undeva cu care se adaugă imediat fiecare metodă care se execută. menținerea eficientă a unui lanț global de apeluri. Nu ar trebui să apelați la sfârșitul fiecărei metode pe care încercați să o instrumentați, alte practici obișnuite de instrumentare sunt să porniți un cronometru la începutul metodei și să vă opriți la sfârșit pentru a înregistra lungimea etc.
-
Aveți un cadru de tip DI care este un router pentru toate apelurile de metodă, care s-ar putea comporta Este mai asemănător cu transmiterea mesajelor și, în interiorul acestui cadru, veți nota într-o stivă fiecare apel de metodă care apare similar cu cel de mai sus, cu excepția faptului că ar fi centralizat în acest singur loc.
u pot să spun că sugerez # 2 fără a folosi poate un cadru AOP sau ceva, dar, în general, menținerea propriei urme de stivă pe 100% din apelurile de metodă este un pic o instrumentare extremă în ochii mei. Excelent pentru depanarea lucrurilor de tip și poate necesar dacă nu lucrați într-un limbaj reflexiv, dar aș fi sigur că aș putea dezactiva cu ușurință așa ceva pentru producție și să fac tot posibilul să-l țin departe de drum, motiv pentru care nu îmi place cu adevărat # 2 de mai sus.
Niciunul dintre acestea nu este necesar într-un limbaj reflexiv și, prin urmare, nu ar trebui implementat în C # decât pentru a ilustra procesul de traversare granițe. (avertisment: acestea s-ar putea să fie mai rapide decât reflectarea dacă sunt făcute corect, dar costul de întreținere le face totuși să nu merite)
Comentarii
IMHO ar trebui să vă întrebați cu seriozitate de ce credeți că aveți nevoie de asta.
Dacă MethodFoo()
se comportă diferit dacă este apelat din ansamblul A sau B, atunci ansamblul apelant este ceva asemănător unui parametru de intrare ascuns la MethodFoo()
și poate deveni probabil cauza unui comportament neașteptat sau eronat.Deci, ca alternativă, faceți explicit acest parametru de intrare: adăugați un parametru suplimentar la MethodFoo()
care indică contextul sau apelantul. Acesta ar putea fi un parametru enum
, un parametru string
sau o referință la ansamblul apelant în sine, în funcție de schimbarea de comportament intenționată a MethodFoo()
.
Comentarii