Designing with Swift: Chain of Responsibility Pattern
Swift programlama dili, iOS ve macOS uygulamalarını geliştirmek için mükemmel bir seçimdir. Ancak, bu dilin tüm özelliklerini kullanarak verimli bir şekilde programlamayı öğrenmek oldukça zaman alabilir. Bu yazıda, bu dili kullanarak tasarım desenlerinden birini oluşturmayı göstereceğiz: Zincir Sorumluluk Deseni. Bu desen, işlemleri sıralamak için kullanılır ve kodunuzu çok daha okunaklı hale getirebilir.
Zincir Sorumluluk Deseni, bir zincirdeki bağların sorumluluklarını tek tek yerine getirmesi mantığına dayanır. Örneğin, bir web sayfasına bir istek gönderdiğinizde, bu isteğin bir sunucuya gönderilmesi gerekiyor. Sunucu, bu isteği alır ve içeriğini doğrulamaya çalışır. Yani, sunucu isteğin geçerli olup olmadığını kontrol eder. Ancak, sunucu tarafından onaylanan bir istek, sunucu tarafından işlenmeyecektir. Bu nedenle, bir sonraki bağa (örneğin, bir veritabanı) gönderilmesi gerekir. Veritabanı, isteğin geçerli bir istek olup olmadığını kontrol eder ve sonuç olarak, isteğin cevaplanması gereken son bağa gönderilir.
Swift’te, Zincir Sorumluluk Deseni, bir sınıf dizisi oluşturmak için kullanılır. Bu sınıf dizisi işlemleri sırayla yürütmek için kullanılır. Her sınıf, diğer sınıfa ait işlemleri gerçekleştirmek için arayüz sağlar. Örneğin, bir web sayfasına istek göndermek için, her sınıf kendisine ait işlemleri gerçekleştirmek için arayüz sağlayacaktır. Sonuç olarak, istek, ilgili sınıflar tarafından işlem gördükten sonra son bağa gönderilecektir.
Swift’te Zincir Sorumluluk Deseni’ni oluşturmak için, öncelikle Protocol ve generic sınıfları kullanmanız gerekir. Bir protokolün ne olduğunu bilmiyorsanız, kısaca, bir arayüzdür. Oluşturduğunuz protokolü, kullanmak istediğiniz sınıflara sağlayabilirsiniz. Ardından, generic sınıfların ne olduğunu anlamanız gerekir. Genel sınıflar, belirli bir türü temsil edebilen sınıflardır. Örneğin, bir sınıf “StringProtocol” olarak adlandırılabilir ve herhangi bir String türünü temsil edebilir. Böylece, oluşturduğunuz protokolü, istediğiniz herhangi bir türü temsil edebilen sınıflara sağlayabilirsiniz.
Şimdi, Zincir Sorumluluk Deseni’ni oluşturma zamanı. Öncelikle, bir protokol oluşturmalıyız. Bu protokol, isteği işlemek için bir arayüz sağlar. Ardından, bu protokolü implemente eden sınıfları oluşturabilirsiniz.
protocol RequestHandler {
func processRequest(_ request: String) -> String
}
Bu protokolü implemente eden bir sınıf, isteği işlemek için bir arayüz sağlar. Örneğin, bir sunucu sınıfı oluşturabilirsiniz.
class Server: RequestHandler {
func processRequest(_ request: String) -> String {
// Process the request
}
}
Bu sınıf, isteği işleyebilmek için gerekli olan kodu içerir. Ardından, bir sonraki bağa göndermek için bir sonraki sınıfı oluşturabilirsiniz. Örneğin, bir veritabanı sınıfı oluşturabilirsiniz.
class Database: RequestHandler {
func processRequest(_ request: String) -> String {
// Process the request
}
}
Bu sınıf, veritabanına istek göndermek için gerekli olan kodu içerir. İstek, sunucu tarafından işlenip doğrulandıktan sonra, bu sınıfta işlenir. Ardından, sonuç olarak, son bağa gönderilir. Örneğin, bir cevap sınıfı oluşturabilirsiniz.
class Response: RequestHandler {
func processRequest(_ request: String) -> String {
// Process the request
}
}
Bu sınıf, isteğe cevap oluşturmak için gerekli olan kodu içerir. İstek, veritabanı tarafından işlenip doğrulandıktan sonra, bu sınıfta işlenir. Sonuç olarak, istek, kullanıcıya iletilir.
Şimdi, zincirin tamamını bir araya getirmemiz gerekiyor. Bunu yapmak için, her sınıfın diğer sınıfın işlemlerini yürütebilecek bir referansa sahip olması gerekiyor. Bunu sağlamak için, her sınıfın bir nextRequestHandler özelliğine sahip olması gerekiyor.
class Server: RequestHandler {
var nextRequestHandler: RequestHandler?
func processRequest(_ request: String) -> String {
// Process the request
}
}
class Database: RequestHandler {
var nextRequestHandler: RequestHandler?
func processRequest(_ request: String) -> String {
// Process the request
}
}
class Response: RequestHandler {
var nextRequestHandler: RequestHandler?
func processRequest(_ request: String) -> String {
// Process the request
}
}
Şimdi, bu sınıfları bir araya getirmek için, bir zincir oluşturmamız gerekiyor. Bu zincir, her sınıfın bir diğer sınıfın işlemlerini yürütebilecek bir referansa sahip olmasını sağlayacaktır.
let server = Server()
let database = Database()
let response = Response()
server.nextRequestHandler = database
database.nextRequestHandler = response
Şimdi, istek zincirin sonuna gönderildiğinde, istek zincirini takip ederek, ilgili sınıflar tarafından işlenmiş olacaktır.
Zincir Sorumluluk Deseni, kodunuzu okunaklı hale getirmek için harika bir seçimdir. Ayrıca, Swift’de bu deseni kullanmak oldukça kolaydır. Özet olarak, bu deseni kullanmak için, bir protokol oluşturmalı, bu protokolü implemente eden sınıflar oluşturmalı ve her sınıfın diğer sınıfın işlemlerini yürütebilecek bir referansa sahip olmasını sağlamalısınız. Böylece, istekler zincirin sonuna gönderildiğinde, istek zincirini takip ederek, ilgili sınıflar tarafından işlenmiş olacaktır.
Swift programlama dili, iOS ve macOS uygulamalarını geliştirmek için mükemmel bir seçimdir. Ancak, bu dilin tüm özelliklerini kullanarak verimli bir şekilde programlamayı öğrenmek oldukça zaman alabilir. Bu yazıda, bu dili kullanarak tasarım desenlerinden birini oluşturmayı gösterdik: Zincir Sorumluluk Deseni. Bu desen, işlemleri sıralamak için kullanılır ve kodunuzu çok daha okunaklı hale getirebilir. Zincir Sorumluluk Deseni’ni oluşturmak için, bir protokol oluşturmalı, bu protokolü implemente eden sınıflar oluşturmalı ve her sınıfın diğer sınıfın işlemlerini yürütebilecek bir referansa sahip olmasını sağlamalısınız. Böylece, istekler zincirin sonuna gönderildiğinde, istek zincirini takip ederek, ilgili sınıflar tarafından işlenmi