Transaction Script Deseninin Derinliklerine Dalış: Gerçek Dünya Örnekleri ile Detaylı İnceleme

[en] Read in English

2023-06-11

Transaction Script, genellikle işlem tabanlı sistemlerde kullanılan bir Enterprise uygulama tasarım desenidir. Bu desen, bir işlemi gerçekleştirmek için bir dizi prosedürün bir araya getirilmesiyle oluşturulur. Bu prosedürler genellikle bir işlemi başlatmak, veritabanı sorgularını çalıştırmak ve sonuçları işlemek için kullanılır.

Transaction Script deseni, karmaşık olmayan iş mantığına sahip uygulamalar için uygundur. Ancak, iş mantığı karmaşıklaştıkça ve çok sayıda işlem gerektirdikçe, bu desenin kullanılması kodun anlaşılmasını ve bakımını zorlaştırabilir.

Transaction Script Deseninin Yapısı

Bir Transaction Script, genellikle aşağıdaki bileşenlere sahiptir:

  1. İşlem Başlatıcı (Transaction Initiator): Bu, işlemi başlatan ve işlem sonucunu almak için bekleyen bileşendir. Bu genellikle bir kullanıcı arayüzü veya bir API çağrısı olabilir.

  2. İşlem Scripti (Transaction Script): Bu, işlemi gerçekleştiren ve işlem sonucunu döndüren prosedürlerin toplamıdır. Bu script, veritabanı sorgularını çalıştırır ve sonuçları işler.

  3. Veritabanı (Database): Bu, işlem scriptinin verileri sorguladığı ve güncellediği yerdir.

Gerçek Dünya Örneği

Bir online alışveriş sistemi, Transaction Script deseninin bir örneği olabilir. Bir kullanıcı bir ürün satın almak istediğinde, aşağıdaki işlemler gerçekleşir:

  1. Kullanıcı, bir ürün satın almak için bir istekte bulunur (İşlem Başlatıcı).

  2. İşlem Scripti, kullanıcının hesabında yeterli bakiye olup olmadığını kontrol eder, ürünün stokta olup olmadığını kontrol eder, eğer her şey uygunsa, kullanıcının hesabından ücreti çeker ve ürünün stok sayısını azaltır.

  3. Tüm bu işlemler, veritabanında gerçekleşir.

Transaction Script Diagram

Bu diagram, bir online alışveriş sisteminde bir ürün satın alma işlemini temsil ediyor. Kullanıcı arayüzü (işlem başlatıcı), bir satın alma isteği gönderir. Bu istek, işlem scriptine ulaşır. İşlem scripti, kullanıcının bakiyesini kontrol eder, ürünün stok durumunu kontrol eder, ücreti çeker ve stok sayısını azaltır. Tüm bu işlemler veritabanında gerçekleşir. İşlem tamamlandığında, işlem scripti sonucu kullanıcı arayüzüne gönderir.

Bir online alışveriş sisteminde bir ürün satın alma işlemini temsil eden basit bir C# kod örneği bulabilirsiniz. Bu örnekte, bir TransactionScript sınıfı oluşturduk ve bu sınıfın içinde PurchaseProduct adında bir metod tanımladık.

public class TransactionScript
{
    private readonly IAccountService _accountService;
    private readonly IProductService _productService;

    public TransactionScript(IAccountService accountService, IProductService productService)
    {
        _accountService = accountService;
        _productService = productService;
    }

    public async Task<bool> PurchaseProduct(int userId, int productId)
    {
        // Bakiye kontrolü
        var balance = await _accountService.GetBalance(userId);
        var product = await _productService.GetProduct(productId);

        if (balance < product.Price)
        {
            Console.WriteLine("Yetersiz bakiye.");
            return false;
        }

        // Stok kontrolü
        if (product.Stock <= 0)
        {
            Console.WriteLine("Ürün stokta yok.");
            return false;
        }

        // Ücret çekme ve stok azaltma
        await _accountService.DeductBalance(userId, product.Price);
        await _productService.DecreaseStock(productId);

        Console.WriteLine("Ürün başarıyla satın alındı.");
        return true;
    }
}

Bu örnekte, IAccountService ve IProductService adında iki servis kullanıyoruz. Bu servislerin her biri, kullanıcının bakiyesini kontrol etmek ve düşürmek, ürün bilgisini almak ve stok sayısını azaltmak gibi işlemleri gerçekleştirmek için kullanılıyor.

Bu kod örneği, Transaction Script deseninin basit bir uygulamasını temsil eder. Ancak gerçek dünya uygulamalarında, hata kontrolü ve işlem yönetimi gibi ek özelliklerin eklenmesi gerekebilir.

Aynı yapının Go kod örneği.

Bu örnekte, TransactionScript adında bir struct oluşturduk ve bu struct’ın içinde PurchaseProduct adında bir metod tanımladık.

package main

import (
	"fmt"
)

type AccountService interface {
	GetBalance(userId int) (float64, error)
	DeductBalance(userId int, amount float64) error
}

type ProductService interface {
	GetProduct(productId int) (*Product, error)
	DecreaseStock(productId int) error
}

type TransactionScript struct {
	accountService AccountService
	productService ProductService
}

func (ts *TransactionScript) PurchaseProduct(userId int, productId int) error {
	// Bakiye kontrolü
	balance, err := ts.accountService.GetBalance(userId)
	if err != nil {
		return err
	}

	product, err := ts.productService.GetProduct(productId)
	if err != nil {
		return err
	}

	if balance < product.Price {
		return fmt.Errorf("Yetersiz bakiye")
	}

	// Stok kontrolü
	if product.Stock <= 0 {
		return fmt.Errorf("Ürün stokta yok")
	}

	// Ücret çekme ve stok azaltma
	err = ts.accountService.DeductBalance(userId, product.Price)
	if err != nil {
		return err
	}

	err = ts.productService.DecreaseStock(productId)
	if err != nil {
		return err
	}

	fmt.Println("Ürün başarıyla satın alındı")
	return nil
}

func main() {
	// TransactionScript örneğini oluştur ve kullan
}

Bu örnekte, AccountService ve ProductService adında iki interface kullanıyoruz. Bu interface’lerin her biri, kullanıcının bakiyesini kontrol etmek ve düşürmek, ürün bilgisini almak ve stok sayısını azaltmak gibi işlemleri gerçekleştirmek için kullanılıyor.

Bu kod örneği, Transaction Script deseninin basit bir uygulamasını temsil eder. Ancak gerçek dünya uygulamalarında, hata kontrolü ve işlem yönetimi gibi ek özelliklerin eklenmesi gerekebilir.

Bu desenin kullanımı, iş mantığının karmaşıklığına bağlıdır. Basit iş mantığına sahip uygulamalar için mükemmel bir seçim olabilirken, karmaşık iş mantığına sahip uygulamalar için Domain Driven Design (DDD) gibi diğer desenler daha uygun olabilir.



Bu gibi daha fazla gönderi...

Transaction Script Deseninin Çözümlenmesi: Epiktetos ile Felsefi Bir Diyalog

2023-06-11 | #domain-logic-patterns #enterprise-patterns #transaction-script

Murat: Transaction Script deseni, işlemlerin basit ve düzgün bir şekilde gerçekleştirilmesini sağlar. Ancak, karmaşık iş mantığına sahip uygulamalar için bu desenin kullanılması kodun anlaşılmasını ve bakımını zorlaştırabilir. Epiktetos: Evet, Murat. Ancak, her şeyin karmaşıklığına bağlı olduğunu unutmamalıyız. Basit iş mantığına sahip uygulamalar için Transaction Script deseni mükemmel bir seçim olabilir. Ancak, iş mantığı karmaşıklaştıkça ve çok sayıda işlem gerektirdikçe, Domain Driven Design (DDD) gibi diğer desenler daha uygun olabilir. Murat: Kesinlikle katılıyorum, Epiktetos.

Devamı 