Merhaba arkadaşlar,
Objective-C bildiğiniz gibi C dilinin bir türevidir ve nesne tabanlı programlamaya bir örnektir. Objective-C MVC yapısı kullanılmaktadır, (M)odel, (V)iew ve (C)ontroller yapısını aşağıda elimden geldiğince açık bir şekilde anlatmaya çalışacağım.
Model: Oluşturacağınız uygulamanın ne olduğudur. Görünümüyle alakalı olmayan fakat uygulamalarınızda nelerin olacağı model sınıfına girer. Örnek olarak bir dövüş oyunu yapacağınızı düşünelim, bu oyunda bir kaç çeşit karakter olmasını istiyorsunuz. İşte bu oyununuz model kısmına girer. Bunun gibi karakterlerin kaç canı olacağı, yumruk ve tekmelerin ne kadar hasar verceği, hasar esnasında korunmanın hasarı yüzde kaç düşüreceği, vs vs uygulamanızın model sınıfına dahildir ve bunlar karakterinizin ekrandaki görüntüsüyle alakalı değildir.
Controller: Modelinizi ekranda ne şekilde göreceğimizi bu sınıfta belirtiriz ve bunun için View sınıfıyla iletişime geçeriz. View sınıfından karakterin görselini çağırırız ve ekranda nereye yerleştireceğimizi Controller ile uygularız. Bu aşamada cihaz farklılıklarında görünümde değişiklikler isteyebiliriz, örneğin iPhone ekranında daha basit bir yerleşim tercih ederken iPad ekranı daha geniş olduğundan daha verimli kullanmak isteyebiliriz. Bu farklılıklarıda yine controller sınıfı içerisinde yapmamız gerekmektedir.
View: Controller sınıfından gelen emirlerle ekrana yansıtılacak olan objeleri Controller'a iletir. Bunlar apple firmasının bize sunduğu Slider, Round Button, Webview, vs vs olabilir ve ayrıca bizim hazırladığımız imaj dosyalarıda olabilir.
MVC İletişim Yapısı
Yukarıdaki görselde MVC yapısının birbirleriyle nasıl iletişim kurabildiğini göstermeye çalıştım. Bu görsel Stanford Üniversitesi eğitimlerinde de kullanılmaktadır ve oradan esinlenerek hazırladığımı söylemek isterim.
Görselde sınıflar arasına çizdiğim düz çizgiler geçişe izin verilmediğini, kesikli çizgiler ise şartlar uygun olduğunda geçiş izninin bulunduğunu ifade etmektedir. Yani Controller sınıfı Model ve View sınıfına istediği kadar mesaj gönderebilir, fakat Model ve View Controller sınıfına dilediği gibi mesaj gönderemeyecektir.
1 Numaralı oka baktığımızda Controller sınıfının model sınıfına mesaj gönderdiğini görüyoruz, bu durumda Model sınıfı sadece sorulan soruya yanıt verebilecektir. Az önceki oyunumuzdan örnek verecek olursak, Controller Model sınıfına "Rakibin kaç canı kaldı", "levelim kaç", "dövüşten kaç puan kazandım" gibi sorular sormak isteyecek ve Model sınıfıda bu sorulara cevap verecektir.
Az önce belirttiğim gibi Model sınıfı istediği zaman Controller sınıfına mesaj gönderemez, yalnızca belirli durumlarda iletişime geçmesi gerekir. Modelde herhangi bir değişiklik olduğunda bunu Controller bilmek isteyecektir, mesela "oyuna yeni bir üye kayıt oldu" bunu Controller sınıfı sormadan Model sınıfı bildirmelidir. Bu işlemi Notification ismi verilen mekanizma ile yapmaktadır. Bu mekanizmayı radyo istasyonuna benzetebiliriz, Model sınıfında her zaman hazır bir şekilde bekleyen bir verici ve Controller sınıfında da bu haberleri her zaman alabilecek bir alıcı mevcuttur. Gelen bilgiye göre Controller herhangi bir işlem yapabilir veya yapmayabilir, bu uygulamamıza yani bize bağlıdır.
2 Numaralı oka baktığımızda Controller sınıfının View sınıfına mesaj gönderdiğini görüyoruz, bu durumda View sınıfı Controller sınıfının emrini yerine getirecektir. "Şu nesneyi şuraya koyacağım bana bu nesneyi ver" emrini alan View hemen x nesnesini controller sınıfına iletir. Fakat burada da View'in bazı durumlarda Controller'a soru sorması veya mesaj göndermesi durumu olabilecektir. Tabi yine "istediği zaman değil" gerekli durumlarda mesaj gönderebilecektir. View'de bulunan bir nesne (örneğin bir slider) Controller'da bir hedefe bağlıdır ve bu slider kullanıldığında Controller'a bir mesaj gönderilmesi gerekmektedir. Örneğin slider kullanılmadan önce uygulamanın arka planındaki müzik sesi seviyesi 50%'idi fakat slider ile bunu %70'e çıkarttık. Bunu controller sınıfına iletmeden ses seviyesini tetikleyemeyiz. Bu mekanizmayada yetkilendirme (delegation) mekanizması ismi verilmektedir. View'in yaptıklarını bilmek isteyen Controller bu mekanizma ile yapılanlardan haberdar olmaktadır.
MVC yapısını en kısa ve öz biçimde bu şekilde anlatabilirim, umarım yeterince açık ve anlaşılır biçimde yazabilmişimdir.
Objective-C bildiğiniz gibi C dilinin bir türevidir ve nesne tabanlı programlamaya bir örnektir. Objective-C MVC yapısı kullanılmaktadır, (M)odel, (V)iew ve (C)ontroller yapısını aşağıda elimden geldiğince açık bir şekilde anlatmaya çalışacağım.
Model: Oluşturacağınız uygulamanın ne olduğudur. Görünümüyle alakalı olmayan fakat uygulamalarınızda nelerin olacağı model sınıfına girer. Örnek olarak bir dövüş oyunu yapacağınızı düşünelim, bu oyunda bir kaç çeşit karakter olmasını istiyorsunuz. İşte bu oyununuz model kısmına girer. Bunun gibi karakterlerin kaç canı olacağı, yumruk ve tekmelerin ne kadar hasar verceği, hasar esnasında korunmanın hasarı yüzde kaç düşüreceği, vs vs uygulamanızın model sınıfına dahildir ve bunlar karakterinizin ekrandaki görüntüsüyle alakalı değildir.
Controller: Modelinizi ekranda ne şekilde göreceğimizi bu sınıfta belirtiriz ve bunun için View sınıfıyla iletişime geçeriz. View sınıfından karakterin görselini çağırırız ve ekranda nereye yerleştireceğimizi Controller ile uygularız. Bu aşamada cihaz farklılıklarında görünümde değişiklikler isteyebiliriz, örneğin iPhone ekranında daha basit bir yerleşim tercih ederken iPad ekranı daha geniş olduğundan daha verimli kullanmak isteyebiliriz. Bu farklılıklarıda yine controller sınıfı içerisinde yapmamız gerekmektedir.
View: Controller sınıfından gelen emirlerle ekrana yansıtılacak olan objeleri Controller'a iletir. Bunlar apple firmasının bize sunduğu Slider, Round Button, Webview, vs vs olabilir ve ayrıca bizim hazırladığımız imaj dosyalarıda olabilir.
MVC İletişim Yapısı
Yukarıdaki görselde MVC yapısının birbirleriyle nasıl iletişim kurabildiğini göstermeye çalıştım. Bu görsel Stanford Üniversitesi eğitimlerinde de kullanılmaktadır ve oradan esinlenerek hazırladığımı söylemek isterim.
Görselde sınıflar arasına çizdiğim düz çizgiler geçişe izin verilmediğini, kesikli çizgiler ise şartlar uygun olduğunda geçiş izninin bulunduğunu ifade etmektedir. Yani Controller sınıfı Model ve View sınıfına istediği kadar mesaj gönderebilir, fakat Model ve View Controller sınıfına dilediği gibi mesaj gönderemeyecektir.
1 Numaralı oka baktığımızda Controller sınıfının model sınıfına mesaj gönderdiğini görüyoruz, bu durumda Model sınıfı sadece sorulan soruya yanıt verebilecektir. Az önceki oyunumuzdan örnek verecek olursak, Controller Model sınıfına "Rakibin kaç canı kaldı", "levelim kaç", "dövüşten kaç puan kazandım" gibi sorular sormak isteyecek ve Model sınıfıda bu sorulara cevap verecektir.
Az önce belirttiğim gibi Model sınıfı istediği zaman Controller sınıfına mesaj gönderemez, yalnızca belirli durumlarda iletişime geçmesi gerekir. Modelde herhangi bir değişiklik olduğunda bunu Controller bilmek isteyecektir, mesela "oyuna yeni bir üye kayıt oldu" bunu Controller sınıfı sormadan Model sınıfı bildirmelidir. Bu işlemi Notification ismi verilen mekanizma ile yapmaktadır. Bu mekanizmayı radyo istasyonuna benzetebiliriz, Model sınıfında her zaman hazır bir şekilde bekleyen bir verici ve Controller sınıfında da bu haberleri her zaman alabilecek bir alıcı mevcuttur. Gelen bilgiye göre Controller herhangi bir işlem yapabilir veya yapmayabilir, bu uygulamamıza yani bize bağlıdır.
2 Numaralı oka baktığımızda Controller sınıfının View sınıfına mesaj gönderdiğini görüyoruz, bu durumda View sınıfı Controller sınıfının emrini yerine getirecektir. "Şu nesneyi şuraya koyacağım bana bu nesneyi ver" emrini alan View hemen x nesnesini controller sınıfına iletir. Fakat burada da View'in bazı durumlarda Controller'a soru sorması veya mesaj göndermesi durumu olabilecektir. Tabi yine "istediği zaman değil" gerekli durumlarda mesaj gönderebilecektir. View'de bulunan bir nesne (örneğin bir slider) Controller'da bir hedefe bağlıdır ve bu slider kullanıldığında Controller'a bir mesaj gönderilmesi gerekmektedir. Örneğin slider kullanılmadan önce uygulamanın arka planındaki müzik sesi seviyesi 50%'idi fakat slider ile bunu %70'e çıkarttık. Bunu controller sınıfına iletmeden ses seviyesini tetikleyemeyiz. Bu mekanizmayada yetkilendirme (delegation) mekanizması ismi verilmektedir. View'in yaptıklarını bilmek isteyen Controller bu mekanizma ile yapılanlardan haberdar olmaktadır.
MVC yapısını en kısa ve öz biçimde bu şekilde anlatabilirim, umarım yeterince açık ve anlaşılır biçimde yazabilmişimdir.
Son düzenleme:
