Comment on page
TypeScript ile decorator tanimlayarak methodlari ve siniflari loglamak
typescript, programming, logging, decorator, class, function, method

Typescript'te Python'daki gibi decorator kullanarak bir metodun çağrılmasını ve bitişini otomatik olarak raporlamak için, bir decorator fonksiyonu yazabiliriz. Aşağıda,
scheduleClear
metodunun başlangıcını ve bitişini loglayan bir decorator örneği bulunmaktadır. Bu decorator, metod çağrıldığında ve tamamlandığında log mesajları yazacaktır.function LogMethodExecution(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<Function>) {
const method = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${propertyName}`);
const result = method!.apply(this, args);
if (result instanceof Promise) {
result.then(() => console.log(`${propertyName} finished execution`))
.catch((error) => console.log(`Error in ${propertyName}: ${error}`));
} else {
console.log(`${propertyName} finished execution`);
}
return result;
}
}
class YourService {
// Existing properties and methods...
@LogMethodExecution
scheduleClear(reason: string) {
// ... existing implementation ...
}
// ... other methods ...
}
Bu decorator,
scheduleClear
metodunu sarmalar ve her çağrıldığında log mesajları yazdırır. Eğer metod bir Promise döndürüyorsa, bu Promise'in çöz ümlenmesi veya reddedilmesine bağlı olarak uygun log mesajlarını yazar. Bu şekilde, her metod çağrısının başlangıç ve bitiş zamanlarını takip edebilirsiniz. Bu örnekte console.log
kullanılmıştır, ancak kendi loglama mekanizmanızı buraya entegre edebilirsiniz.Tüm class metotlarına veya programdaki tüm metotlara bir decorator uygulamak için, manuel olarak her metoda decorator eklemek yerine, genel bir yaklaşım kullanabiliriz. Bunun için, class'ların ve metodların dinamik olarak işlenmesi gerekmektedir. Ancak, TypeScript'te bu tür genel decorator kullanımı doğrudan desteklenmez, bu nedenle bazı ekstra adımlar gereklidir.
Aşağıda, tüm sınıfların ve metotların dinamik olarak işlenmesi için bir örnek verilmiştir:
- 1.Metot Decorator'u Tanımlama: Her metot çağrısında loglama yapan bir decorator fonksiyonu tanımlayın.
- 2.Sınıf Decorator'u Tanımlama: Bu decorator, bir sınıfın tüm metotlarına metod decorator'unu uygular.
- 3.Genel Decorator Kullanımı: Tüm sınıflarınıza veya belirli sınıflarınıza sınıf decorator'unu uygulayarak, tüm metodlara otomatik olarak metod decorator'unu uygulayın.
İşte bu adımları gerçekleştiren örnek bir kod:
function LogMethodExecution(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<Function>) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${propertyName}`);
const result = originalMethod.apply(this, args);
if (result instanceof Promise) {
result.then(() => console.log(`${propertyName} finished execution`))
.catch((error) => console.log(`Error in ${propertyName}: ${error}`));
} else {
console.log(`${propertyName} finished execution`);
}
return result;
}
}
function ApplyLogToMethods(target: Function) {
for (const propertyName of Object.getOwnPropertyNames(target.prototype)) {
const descriptor = Object.getOwnPropertyDescriptor(target.prototype, propertyName);
if (descriptor && typeof descriptor.value === 'function') {
Object.defineProperty(target.prototype, propertyName, {
value: LogMethodExecution(target, propertyName, descriptor)
});
}
}
}
@ApplyLogToMethods
class YourService {
// Your methods...
}
Bu kod,
ApplyLogToMethods
sınıf decorator'ünü kullanarak YourService
sınıfındaki tüm metotlara LogMethodExecution
metod decorator'unu otomatik olarak uygular. Böylece, bu sınıfın herhangi bir metodunun çağrılması, başlangıç ve bitiş loglarını otomatik olarak yazdırır.Program genelinde uygulamak için, bu yaklaşımı projenizin tüm sınıflarına uygulamanız gerekir. Ancak, bu tür geniş çaplı değişikliklerin performans üzerinde olumsuz etkileri olabileceğini ve kodun okunabilirliğini azaltabileceğini unutmamak önemlidir.