TypeScript ile decorator tanimlayarak methodlari ve siniflari loglamak

typescript, programming, logging, decorator, class, function, method

function Raporlama

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.

Tum class Methodlarini Raporlama

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.

Last updated

© 2024 ~ Yunus Emre Ak ~ yEmreAk