Swift Design Patterns: Chain of Responsibility Explored

Swift Design Patterns: Chain of Responsibility Explored

Swift, Apple’ın yeni programlama dili olan ve iOS, macOS, watchOS, tvOS gibi çok sayıda platformda kullanılabilen bir dildir. Swift, geliştiricilerin kodlarını daha hızlı ve verimli bir şekilde oluşturmalarına olanak tanıyan modern bir dildir. Bu yazıda, Swift’de kullanılan tasarım desenlerinden birisi olan zincir sorumluluk (chain of responsibility) desenini inceleyeceğiz.

Tasarım desenleri, belli bir amaca ulaşmak için kullanılabilecek tekrarlanan şablonlardır. Zincir sorumluluk deseni, çok sayıda sınıf arasındaki koordinasyonu kolaylaştırmak için kullanılan bir tasarım desenidir. Bu desen, sınıfların birbirleriyle bağlantılı hale getirilmesine ve iş akışının düzenlenmesine yardımcı olur.

Zincir sorumluluk deseninin temel mantığı, tek bir isteğin birden çok nesneye gönderilmesidir. İstek, bu nesnelerin her birinin kendi aralarındaki bağlantılarını kullanarak iletilir. Her nesne, isteği aldıktan sonra, isteği yerine getirmek için gerekli olduğunu düşünür veya diğer nesneye iletir. Bu desen, isteğin kolayca iletilmesini sağlar ve isteklerin zamana bağlı olmamasını sağlar.

Swift’te zincir sorumluluk desenini uygulamak için, bir istek nesnesi oluşturmamız gerekir. Bu istek nesnesi, zincir sorumluluk deseninin işlenmesi için gerekli olan bilgileri içerecek şekilde tasarlanmalıdır. Ayrıca, zincir sorumluluk deseninin çalışması için, nesnelerin zincirin bir parçası olduğu ve isteği bir sonraki nesneye iletme yeteneğine sahip olduğu bir Handler sınıfı da oluşturulmalıdır.


// Request.swift
import Foundation

struct Request {
    let type: String
    let data: [String: Any]
}

Yukarıdaki kod, zincir sorumluluk deseninin çalışması için gerekli olan istek nesnesinin nasıl oluşturulacağını göstermektedir. İstek nesnesi, verilen tip ve veri bilgilerini içeren bir yapıdır.


// Handler.swift
import Foundation

class Handler {
    var nextHandler: Handler?

    func handle(request: Request) {
        if canHandle(request: request) {
            // handle the request
        } else {
            nextHandler?.handle(request: request)
        }
    }

    func canHandle(request: Request) -> Bool {
        return false
    }
}

Yukarıdaki kod, zincir sorumluluk deseninin çalışması için gerekli olan Handler sınıfının nasıl oluşturulacağını göstermektedir. Handler sınıfı, zincirin bir parçası olduğunu ve bir isteği bir sonraki nesneye iletme yeteneğine sahip olduğunu belirtmektedir.


// ConcreteHandlerA.swift
import Foundation

class ConcreteHandlerA: Handler {
    override func canHandle(request: Request) -> Bool {
        if request.type == "TypeA" {
            return true
        } else {
            return false
        }
    }
}

Yukarıdaki kod, zincir sorumluluk deseninin çalışması için gerekli olan ConcreteHandlerA sınıfının nasıl oluşturulacağını göstermektedir. ConcreteHandlerA sınıfı, isteğin tipini kontrol eder ve isteği yerine getirebilirse true döndürür.


// ConcreteHandlerB.swift
import Foundation

class ConcreteHandlerB: Handler {
    override func canHandle(request: Request) -> Bool {
        if request.type == "TypeB" {
            return true
        } else {
            return false
        }
    }
}

Yukarıdaki kod, zincir sorumluluk deseninin çalışması için gerekli olan ConcreteHandlerB sınıfının nasıl oluşturulacağını göstermektedir. ConcreteHandlerB sınıfı, isteğin tipini kontrol eder ve isteği yerine getirebilirse true döndürür.

Şimdi, zincir sorumluluk deseninin kullanımına bakalım. Öncelikle, zincirin ilk elemanı olan ConcreteHandlerA sınıfının bir nesnesi oluşturulur. Ardından, zincirin ikinci elemanı olan ConcreteHandlerB sınıfının bir nesnesi oluşturulur. Son olarak, ConcreteHandlerA nesnesinin nextHandler özelliği ile ConcreteHandlerB nesnesi atanır.


let handlerA = ConcreteHandlerA()
let handlerB = ConcreteHandlerB()
handlerA.nextHandler = handlerB

Şimdi, istek nesnesi oluşturulabilir. İstek, zincirin ilk elemanı olan ConcreteHandlerA nesnesine iletilir. Eğer ConcreteHandlerA nesnesi isteği yerine getiremezse, istek ConcreteHandlerB nesnesi tarafından ele alınır.


let request = Request(type: "TypeA", data: ["foo": "bar"])
handlerA.handle(request: request)

Swift’te zincir sorumluluk desenini uygulamak için, bir istek nesnesi oluşturmamız ve zincirin bir parçası olan bir Handler sınıfı ve bu sınıfın uygulamalarının oluşturulması gerekir. Zincir sorumluluk deseni, isteklerin kolayca iletilmesini ve zamana bağlı olmamasını sağlar. Bu desen, isteklerin kolayca iletilmesi ve zamana bağlı olmamasını sağlamak için çok sayıda sınıf arasındaki koordinasyonu kolaylaştırır.

Swift’te zincir sorumluluk desenini uygulamak, bir istek nesnesi oluşturmak ve zincirin bir parçası olan bir Handler sınıfı ve bu sınıfın uygulamalarının oluşturulmasını gerektirir. Bu desen, isteklerin kolayca iletilmesini ve zamana bağlı olmamasını sağlamak için çok sayıda sınıf arasındaki koordinasyonu kolaylaştırır. Swift’te zincir sorumluluk deseni kullanarak, isteklerin kolayca iletilmesi ve zamana bağlı olmaması sağlanabilir.

Scroll to Top