# TypeScript ile decorator tanimlayarak methodlari ve siniflari loglamak

![](https://i.imgur.com/09cLvDY.png)

## `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.

```typescript
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:

```typescript
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.
