Middle+
VIP döngüsü ile mimariyi biliyor musunuz?
sobes.tech yapay zeka
AI'dan gelen yanıt
VIP (Görünüm, Interactor, Sunucu) mimari bir şablondur ve temiz mimarinin bir varyantını temsil eder. iOS geliştirmede sorumlulukların ayrılması ve kodun test edilebilirliğinin artırılması için kullanılır. Temel olarak, bileşenler arasında tek yönlü veri akışı vardır.
VIP bileşenleri:
- Görünüm: Verileri gösterir ve kullanıcı eylemlerini (kullanıcı hareketleri) Interactor'a gönderir. Görünüm (UIView, UIViewController veya sadece protokol) iş mantığını içermez.
- Interaktor: İş mantığını içerir. Görünümden gelen eylemleri alır, gerekli işlemleri yapar (örneğin, verilere erişim, hesaplamalar) ve sonucu Presenter'a gönderir. UI'den bağımsızdır.
- Presenter: Interaktörden gelen verileri alır, görüntüleme için biçimlendirir ve Görünüm'e gönderir. İş mantığını içermez, sadece verilerin sunumundan sorumludur.
İşlem döngüsü:
- Kullanıcı, Görünüm üzerinde bir işlem yapar.
- Görünüm, bir "istek" (request - struct/enum) gönderir ve Interaktor'a iletir.
- Interaktor, isteği işler, iş mantığını gerçekleştirir ve bir "yanıt" (response - struct/enum) hazırlar ve Presenter'a gönderir.
- Presenter, yanıtı alır, verileri "ViewModel" (struct/enum) biçiminde biçimlendirir ve Görünüm'e iletir.
- Görünüm, ViewModel'i alır ve UI'yi günceller.
İlave bileşenler (isteğe bağlı):
- Router: VIP modülleri (sahneleri) arasındaki navigasyonu yönetir. Genellikle Interaktor veya Presenter tarafından çağrılır.
- Worker: Interaktor bileşeninin, belirli görevleri yerine getirmekle sorumlu olan parçası (örneğin, ağ istekleri, Core Data ile çalışma).
VIP'nin temel avantajları:
- Sorumlulukların ayrılması: UI, iş mantığı ve sunum mantığı arasında net ayrım.
- Test edilebilirlik: Her bileşeni bağımsız olarak test etmek kolaydır, bağımlılıkları taklit edilerek.
- Bakım kolaylığı: Bir bileşimdeki değişiklikler diğerlerini daha az etkiler.
VIP modülü için klasör yapısı örneği (UserScene):
UserScene/
├── UserViewController.swift
├── UserInteractor.swift
├── UserPresenter.swift
├── UserRouter.swift
├── UserModels.swift // Request, Response, ViewModel yapıları
├── UserProtocols.swift // Bileşenler arası iletişim protokolleri
Kullanıcı verilerini yükleme örneği:
// UserViewController'da
func viewDidLoad() {
super.viewDidLoad()
interactor?.fetchUserData(request: UserModels.FetchUser.Request())
}
// UserInteractor'da
func fetchUserData(request: UserModels.FetchUser.Request) {
// ... iş mantığıyla veri yükleme ...
let response = UserModels.FetchUser.Response(userData: fetchedData)
presenter?.presentUserData(response: response)
}
// UserPresenter'da
func presentUserData(response: UserModels.FetchUser.Response) {
let viewModel = UserModels.FetchUser.ViewModel(
displayName: response.userData.name,
displayEmail: response.userData.email
)
viewController?.displayUserData(viewModel: viewModel)
}
// UserViewController'da (UserDisplayLogic protokolünün uygulaması)
func displayUserData(viewModel: UserModels.FetchUser.ViewModel) {
nameLabel.text = viewModel.displayName
emailLabel.text = viewModel.displayEmail
}