Tüm Projeler İçin Bir Code Base Oluşturma

Çok fazla proje geliştirdiyseniz, her projede tekrar tekrar yaptığınız şeyler olmuştur. Bir de proje yoğunluğunuz fazla ise işinizi kolaylaştıracak alternatif arayışlarına girmemiş olabilirsiniz. Sonuçta tüm projelerde kullanabileceğiniz şekilde kendinize ait bir kütüphane oluşturmakta başlı başına bir iş. Ama inanın herşeyi bir tarafa bırakıp, farklı projelerde yaptıklarınızı bir toparlamanızı şiddetle tavsiye ederim. Bununla beraber zaman ayırıp işinizi kolaylaştıracak yapılar kurgulayın. Servis katmanınızı standart hale getirin, stillerinizi oluşturun, hata yönetimini, crash yönetimini, loglamayı yönetebileceğiniz sınıflar oluşturun. Şuan elinizdeki proje üzerinden düşünün;

  • Projenizde farklı farklı nesnelerde Alamofire, AFNetworking, URLSession sınıfları çok fazla geçiyorsa,
  • Web Servislerinizden dönen standart hataları her response’da ayrı ayrı yönetiyorsanız,
  • Kullanıcıya bir mesaj görüntülemek için UIAlertController nesnesini tekrar tekrar yazıyorsanız,
  • Arayüzdeki butonların, label’ların, textfield’lerin fontlarını, renklerini her ViewController nesnesi içerisinde ayrı ayrı düzenliyorsanız ve hadi uygulama font’unu değiştirelim deyince bu sizin için 3-5 dk’lık bir işten daha fazlası ise,
  • ……

bu listeye daha neler eklenir neler. Ama öncelikli olarak bu söylediklerimin bir bölümünde sorun yaşıyorsanız çok net şunu söyleyebilirim. YANLIŞ YOLDASINIZ. Bunu görmek, sorgulamak için developer olmanız gerekmiyor. Yönettiğiniz projelerde bir kodlara göz atın derim. Şayet bu sorunları fark edebiliyorsanız tüm ekibin elini işten çekin ve kodlarınızı daha standart hale getirmenin yollarını arayın birlikte. Bireysel de olsada kurumsal bir yapı içerisinde de olsanız lütfen bu iş için kendinize, ekiplerinize zaman ayırın.

Farklı projeler, eğitimler, danışmanlıklar vesilesi ile çok fazla projenin içerisinde olma şansım oldu. Bir bankanın POC danışmanlığını yaparken kodlarını incelediğim piyasanın en büyükleri sayabileceğiniz firmalardan bile bu konuya yeterince özen göstermeyenlerin varlığı şaşırtmıştı beni. O yüzden bizim projede olmaz demeyin, lütfen bir göz atın. Size bunları gönül rahatlığıyla söylüyorum çünkü bu yazıyı kendi kütüphanelerimi düzenleme ihtiyacım oluşunca yazmaya karar verdim:)

Varsayımım şu yönde. Yukarıdaki bölümü okuyup bir projemize bakalım dediniz. Ve farkettiniz ki hakikaten her projede aynı nesneleri oluşturup durmuşsunuz. Storyboard’unuzu açın ve bir button bulun. Sonra o buton nesnesinin tipine bakın. UIButton görüyorsanız yine rahatlıkla söyleyebilirim, YANLIŞ YOLDASINIZ. UIButton yerine UIButton’dan türettiğiniz kendinize ait buton nesneniz var ise, bu ilk güzel haber. Diyelim ki bu nesnenizin adı MyButton. Şimdi lütfen başka projelerinizin içine de bakın. Şayet her projede bir MyButton nesnesi görüyorsanız.. tekrarlamak istemiyorum, durumlar kötü… 🙂

Hadi gelin bir code base oluşturalım. Her projede kullanabileceğiniz bir code base. Bunu sağlayabilmek için farklı yöntemler var. Mesela kodlarınızı git’de tutuyorsanız SubModule olarak kullanabilirsiniz. Ben size her proje için ortak nesnelerinizi nasıl bir framework’e dönüştürebileceğinizi anlatmak istiyorum. Adım adım ilerleyelim.

  1. Yeni bir proje oluşturun. Xcode -> File -> New -> Project. Ve Cocoa Touch Framework seçerek aşağıdaki şekilde işlemi tamamlayın.

Projemiz hazır. Şimdi önemli olan bu proje içerisinde nelerin olması gerektiği. Şu şekilde kategorize edebiliriz.

  • Extensions isminde bir Group oluşturalım. Bu Group içerisinde hangi nesne için extension’lar yazmak istiyorsak, o isimde bir swift dosyası ekleyelim. Örneğin String için extensionlar yazmak istiyorsak,  String.swift isminde bir file ekleyelim. Bu şekilde eklediğimiz dosyalar sadece extension’ları kategorize etme amaçlı olacaktır. String.swift içerisindeki kodları aşağıdaki şekilde düzenleyiniz. Bir String verinin sayısal olup olmadığını veren isNumber isminde bir extension tanımladık.

    import UIKit
    extension String {
        var isNumber: Bool {
            let characters = CharacterSet.decimalDigits.inverted
            return !self.isEmpty && rangeOfCharacter(from: characters) == nil
        }
    }

Bu şekilde extension’larınızı ekledikten sonra proje dosya yapısı aşağıdaki şekilde olacaktır.

 

  • Extension’lara benzer şekilde UIKit isminde bir Group oluşturup kendi button, textfield, label, tableview gibi nesnelerinizi oluşturmalısınız.
  • UIViewController nesnesinden türeyen bir nesne oluşturup tüm ekranların arkasında ortak kullanabileceğiniz metodları bu nesne içerisinde toplayabilirsiniz. Örneğin showMessage, showErrorMessage isimlerinde methodlar ekleyip, UIAlertController nesnelerinizi yani kullanıcıya görüntüleyeceğiniz popup mesajlarınızı bu methodlar içerisinde oluşturabilirsiniz. Bu size tek bir noktadan yönetme imkanı da verecektir.Şimdi bu CodeBase’imizin hazır olduğuna inanarak yeni bir projede keyfini sürmeye başlayalım. Yapılacak işlemler şu şekilde.
  1. CodeBase projenizi kapatınız. Codebase projeniz açık olması durumunda eklediğiniz projede kullanmanız ve dosyalara erişiminiz mümkün olmayacaktır.
  2. Yeni projenizi oluşturunuz. Ben proje ismine CodeBaseProject dedim. Projeye Add Files diyerek CodeBase projesini seçiniz.

    Önemli : CodeBaseProject içerisine eklenen CodeBase projenizin altında herhangi bir dosya görünmüyorsa, Framework projenizin kapalı olduğunu kontrol edin. Açık kalmış ise kapatıp tekrar açınız.

  3. Proje içerisine eklenen CodeBase’in altında Product klasörü ve onun içinde CodeBase.framework mevcut. Onu Embedded Library’i altına sürüklemeniz gerekmektedir. Resimlerle aşağıdaki şekilde akışı göstermeye çalıştım.
  4. ViewController nesneniz içerisinde String extension olarak tanımlanan isNumber property’isini kullanmaya deneyelim. Aşağıdaki şekilde düzenleme yapalım.

    import UIKit
    import CodeBase
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            let numberString = "123"
            if numberString.isNumber {
            }
        }
    }

Yukarıdaki düzenlemeyi yaptıktan sonra muhtemelen hata alacaksınız. Şunu unutmayalım. Framework içerisinde tanımladığınız class ve property/method’lara erişim için için public olarak tanımlamanız gerekmektedir. String.swift içerisindeki extension’ı aşağıdaki şekilde düzenleyiniz. Sonrasında dilediğiniz gibi erişebilirsiniz.

public var isNumber: Bool {....

Uzun süredir aklımda olan ve çok önemsediğim bu konuyu paylaşmaktan mutluyum. Ben sadece bir başlangıç yaptım sizin için. Bundan sonra işin zoru sizin üstünüzde. Lütfen yazının başında konuştuğumuz gibi kütüphanenizi oluşturma işine 3-4 elle sarılın. Eminim faydasını gördükçe çok duanızı alırım 🙂

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn
Bu yazıyı beğendiyseniz daha fazla kişiye ulaşmasını sağlamak için paylaşabilirsiniz.

Leave a reply