Final 2024-2025 20 soru

Mobil Programlama 2024-2025 Final

Kaynak: https://lolonolo.com/2025/12/07/mobil-programlama-2024-2025-final-sorulari-guz/

📖 Konu özeti (sınav öncesi tekrar)

Mobil Programlama 2024-2025 Final Soruları (Güz)

Mobil Programlama 2024-2025 Final Soruları (Güz)

Giriş

Mobil programlama, özellikle Flutter gibi modern çerçevelerle (framework), platformlar arası uygulama geliştirmenin temelini oluşturur. Bu süreçte veritabanı yönetimi, navigasyon, animasyonlar, hata ayıklama ve durum yönetimi gibi konular kritik öneme sahiptir. Bu makalede, Flutter ekosistemindeki temel API’ler, performans optimizasyonu ve uygulama mimarisi ele alınacaktır.

Veritabanı ve Navigasyon

Flutter uygulamalarında veritabanı (SQLite gibi) işlemleri için dosya yolunu bulmak önemlidir. sqflite paketi içindeki getDatabasesPath() fonksiyonu, işletim sistemine özgü güvenli veritabanı klasörünü döndürür.

Sayfalar arası geçişlerde (Navigasyon), Navigator.pop fonksiyonu, yığındaki (stack) en üst sayfayı kaldırarak kullanıcıyı bir önceki sayfaya döndürür. Navigator.push ise yeni bir sayfa açmak (ileriye gitmek) için kullanılır.

Performans ve Boyut Optimizasyonu

Uygulama boyutunu azaltmak için kullanılmayan kaynakların çıkarılması, görsellerin sıkıştırılması ve dağıtım sürümünde --split-debug-info etiketi kullanılması etkilidir. Ancak, Android ve iOS SDK sürümlerini düşük tutmak, uygulama boyutunu azaltan bir yöntem değildir; aksine uyumluluk ve performans sorunlarına yol açabilir.

Görsel akıcılık için ekran tazeleme hızının 16 ms‘yi (60 FPS) geçmemesi gerekir. Uygulamanın çalışma zamanı davranışlarını (bellek, performans) izlemek için ise DartDev Tools kullanılır.

Animasyonlar ve Etkileşim

Animasyonlarda duration parametresi, geçişin ne kadar süreceğini belirler. Sürekli tekrar eden veya karmaşık kontrol gerektiren animasyonlar için AnimatedWidget veya AnimationController kullanımı uygundur. Kullanıcı etkileşimlerini yakalamak için GestureDetector widget’ının onTap parametresi kullanılır.

Kütüphaneler ve Yapılandırma

Flutter’da Package (Paket) sadece Dart kodlarından oluşurken, Plugin (Eklenti) platforma özgü (Java/Kotlin, Swift) kodları da içerir. pubspec.yaml dosyasında paket sürümü zorunluluğu için dependency_overrides kullanılır.

Veritabanı işlemleri için Floor kütüphanesinde sorgular @Query ve parametreler :id şeklinde (@Query('SELECT * FROM Person WHERE id = :id')) tanımlanır. Firebase kullanımı için ise önce initializeApp() çağrılmalıdır.

Hata Yönetimi ve Durum Yönetimi (State Management)

Hata yönetiminde finally bloğu, hata olsun olmasın çalıştırılacak temizleme kodları içindir. Durum yönetiminde provider kütüphanesi kullanılırken, veri modeli ChangeNotifier sınıfından miras almalıdır.

Uygulama genelindeki veriler (oturum, sepet) için App State yaklaşımı kullanılırken, tek bir widget’ı ilgilendiren animasyon durumları için (Ephemeral State) bu yaklaşım gereksizdir. Veri akışı yukarıdan aşağıya olduğu için, üstteki widget’taki değişim, alttaki widget’ın yapıcı (constructor) fonksiyonuna parametre olarak geçilir.

Mobil Programlama 2024-2025 Final Soruları (Güz)

Mobil Programlama 2024-2025 Final Soruları (Güz)

20 soru
Şıkka dokun, anında açıklamasını gör — ya da çalışma modunda tüm cevapları aç.
Soru 1
Akıllı telefonlarda veritabanlarının saklanması için belirtilen varsayılan klasöre erişmek için aşağıdaki fonksiyonlardan hangisi kullanılır?
CDoğru cevap
Açıklama
Flutter uygulamalarında SQLite veritabanlarının fiziksel olarak depolandığı varsayılan klasörün yolunu (path) elde etmek için genellikle `sqflite` paketi içerisindeki **getDatabasesPath()** fonksiyonu kullanılır. Bu fonksiyon, işletim sistemine özgü güvenli bir depolama konumunu döndürür. Diğer seçenekler bu amaçla kullanılan standart fonksiyonlar değildir.
Soru 2
Aşağıdakilerden hangisi Navigator API içerisinde bulunulan sayfadan bir önceki sayfaya dönmeyi sağlayan fonksiyon çağrısıdır?
EDoğru cevap
Açıklama
Flutter’da sayfalar (Route’lar) bir yığın (stack) üzerinde yönetilir. **Navigator.pop fonksiyonu, yığının en üstündeki sayfayı yığından çıkararak (pop** ederek) kullanıcıyı doğal olarak bir önceki sayfaya döndürür. Diğer fonksiyonlar:
* **Navigator.push** (A): Yeni bir sayfayı yığına ekler (ileriye gitme).
* **Navigator.move (B), Navigator.return (C), Navigator.back** (D): Navigator API’de bu işlev için standart olarak kullanılmazlar.
Soru 3
Aşağıdakilerden hangisi Flutter uygulama boyutunu azaltmak için kullanılacak yöntemlerden biri değildir?
EDoğru cevap
Açıklama
Uygulama boyutunu azaltan yöntemler genellikle kaynak optimizasyonuna odaklanır:
* Kullanılmayan kaynakların çıkarılması (B) ve PNG/JPEG sıkıştırma (C) doğrudan dosya boyutunu düşürür.
* **--split-debug-info** (D) etiketi, hata ayıklama sembollerini ayrı bir dosyaya taşıyarak ana yürütülebilir dosyanın boyutunu azaltır.
* Kütüphane kaynaklarını en aza indirme (A) gereksiz bağımlılıkları ortadan kaldırır.
* Android ve iOS SDK sürümlerinin düşük tutulması (E) genellikle uygulama boyutunu etkilemez; bu, uygulamanın uyumluluk gereksinimleri ile ilgilidir ve performansı veya yeni özelliklere erişimi etkileyebilir.
Soru 4
AnimatedOpacity (
opacity: value,
duration: const Duration (seconds: 2),
curve: Curves.easeInOut,)

Yukarıda şeffaflık değerinin değiştirildiği bir animasyon kodu verilmektedir. Buradaki “duration:” parametresi kullanılma amacı aşağıdakilerden hangisidir?
DDoğru cevap
Açıklama
Flutter’da animasyonlarda (özellikle `ImplicitlyAnimatedWidget` sınıfından miras alanlarda), **duration parametresi, animasyonun başlangıç durumundan (eski değer) bitiş durumuna (yeni değer) olan geçişinin ne kadar zaman alacağını** (süre) belirtmek için kullanılır. Bu örnekte şeffaflık değeri 2 saniyede değişecektir.
Soru 5
if (response.statusCode == 200)
http paketi kullanılarak http.get() ile bir web hizmetine bağlanıldığında, dönen cevap response adında bir değişkene kaydedildiyse;
yukarıdaki if koşulu aşağıdaki hangi kontrolü gerçekleştirir?
BDoğru cevap
Açıklama
HTTP protokolünde, durum kodları (status codes) sunucunun isteğe verdiği cevabın sonucunu belirtir. **200 ile başlayan kodlar (2xx aralığı), isteğin başarıyla alınıp işlendiği anlamına gelir (örneğin 200 OK). Bu nedenle, koşul Erişilen web servisinin başarılı bir cevap döndüğünü teyit eder** (B).
Soru 6
Kullanıcının ekrana tıklama etkileşimini yakalayacak bir arayüz bileşeninde GestureDetector kullanılıyorsa, GestureDetector yapıcı fonksiyonunun aşağıdaki parametrelerden hangisinin verilmesi gerekir?
BDoğru cevap
Açıklama
**GestureDetector widget’ı, kullanıcı etkileşimlerini (jestleri) yakalamak için kullanılır. Ekrana yapılan bir tıklama (dokunma/tap) etkileşimini yakalamak ve bu olaya tepki vermek için onTap** (B) parametresinin bir geri çağrım fonksiyonu alması gerekir. Diğerleri bu amaç için birincil parametreler değildir.
Soru 7
Flutter’da uygulanacak bir animasyonun sürekli tekrar etmesi isteniyorsa oluşturulacak widgetın aşağıdaki sınıflardan hangisinden miras alması uygun olur?
CDoğru cevap
Açıklama
Animasyonların sürekli kontrol edilmesi, tekrarlanması veya manuel olarak yönetilmesi gerekiyorsa, genellikle bir **AnimationController kullanılır. Bu tür bir kontrolcü ile çalışan ve sürekli değişen değerleri dinleyen özel widget’lar oluşturmak için AnimatedWidget (C) sınıfından miras almak veya daha yaygın olarak StatefulWidget ve SingleTickerProviderStateMixin** kullanmak uygundur. Diğer seçenekler (A, B, E) önceden tanımlanmış (implicitly) ve otomatik geçiş sağlayan widget’lardır, sürekli tekrar için ideal değildir.
Soru 8
Dart programlama dilinde bir değişken tanımlamasının alt çizgi (_) ile başlaması ne anlama gelmektedir?
DDoğru cevap
Açıklama
Dart ve Flutter’da (Dart programlama dili), bir değişken adının alt çizgi (_) ile başlaması, o değişkenin (veya sınıfın/fonksiyonun) yalnızca tanımlandığı kütüphane (library) içinde kullanılabilir olduğunu, yani **private** (D) olduğunu belirtir. Bu durum, sınıfa dışarıdan erişimi engeller (ancak Dart’ta `private` kapsamı sınıf değil, dosya/kütüphane düzeyindedir).
Soru 9
Plugin (Eklenti) ile Package (Paket) arasındaki farklılık aşağıdakilerden hangisidir?
BDoğru cevap
Açıklama
Flutter terminolojisinde:
* **Package (Paket)**: Tamamen Dart kodundan oluşur ve platforma özgü bir kodlama (iOS/Android) gerektirmez.
* **Plugin (Eklenti): Dart koduna ek olarak, mobil cihazın donanımına veya işletim sistemi API’lerine erişim sağlamak için platforma özgü kodlama (köprü)** (Java/Kotlin, Swift/Objective-C) içerir.
Bu nedenle B şıkkı doğrudur.
Soru 10
Ekran tazelenmesinde kullanıcının bir sıçrama görmemesi için ekran tazeleme hızının kaç milisaniyeyi (ms) geçmemesi gerekir?
CDoğru cevap
Açıklama
Pürüzsüz bir görsel deneyim (kullanıcının sıçrama görmemesi) için ekran tazeleme hızının ideal olarak 60 FPS (kare/saniye) olması gerekir. 60 FPS, her bir karenin **1000 ms / 60 = 16.67 ms sürede çizilmesi demektir. Dolayısıyla, ekran tazeleme hızının 16 milisaniyeyi** (C) geçmemesi gerekir.
Soru 11
Bir Flutter uygulamasının çalışma zamanı davranışlarını takip etmek için kullanılan araç setinin adı aşağıdakilerden hangisidir?
EDoğru cevap
Açıklama
Flutter/Dart uygulamalarının çalışma zamanı davranışlarını (performans, bellek kullanımı, widget ağacı, hata ayıklama) takip etmek için kullanılan web tabanlı araç setinin adı **DartDev Tools** (E)’dur.
Soru 12
Aşağıdakilerden hangisi flutter_test paketi içerisindeki Matcher sabitlerinden biri değildir?
DDoğru cevap
Açıklama
Flutter’ın resmi flutter_test paketi içerisinde bulunan yaygın ve doğru Matcher sabitleri şunlardır:
findsNothing → Hiçbir widget bulmazsa geçer
findsWidgets → Bir veya daha fazla widget bulursa geçer
findsNWidgets(n) → Tam olarak n tane widget bulursa geçer
matchesGoldenFile → Golden file (görsel) testlerinde kullanılır, flutter_test içinde tanımlıdır
Soru 13
Firebase özelliklerinin kullanıma başlanmasından önce aşağıdaki fonksiyonlardan hangisi çağrılmalıdır?
DDoğru cevap
Açıklama
Firebase özelliklerini (örneğin Cloud Firestore, Authentication) Flutter uygulamasında kullanmaya başlamadan önce, **firebase_core paketi aracılığıyla initializeApp()** (D) fonksiyonunun çağrılması ve uygulamanın Firebase ile başlatılması gerekir.
Soru 14
Bir paketin belli bir sürümünün kullanımı zorunluluğu varsa bunu belirtmek için pubspec.yaml dosyasında aşağıdaki başlıklardan hangisi kullanılır?
BDoğru cevap
Açıklama
**pubspec.yaml dosyasında, normal bağımlılıklar (dependencies) listesinde çakışma veya uyumsuzluk olduğunda, bir paketin belirli bir sürümünü kullanma zorunluluğu veya kısıtlaması için dependency_overrides** (B) başlığı kullanılır.
Soru 15
'SELECT * FROM Person WHERE id = 2'
Floor kütüphanesini kullanarak yukarıdaki gibi bir sorgu yazmak istenirse aşağıdakilerden hangisi kullanılmalıdır?
CDoğru cevap
Açıklama
Floor kütüphanesinde, veritabanı işlemlerini tanımlayan DAO (Data Access Object) sınıfları içinde sorguları belirtmek için **@Query (D) veya @Insert gibi etiketler kullanılır. Sorgu içinde bir değişkene atıf yapılırken :id** (C) formatı kullanılır. Eğer sorguda id = 2 gibi sabit bir değer yerine değişken kullanılacaksa **:id** formatı tercih edilir. (Not: D şıkkı olan @Query('SELECT * FROM Person WHERE id = ?') de Floor kütüphanesinde pozisyonel parametre olarak geçerlidir, ancak `id = :id` (C şıkkı) adlandırılmış parametre olduğu için daha yaygın ve okunurdur. Verilen seçenekler arasında C şıkkı, `id = 2` sorgusunun değişkenli hale getirilmiş, en yaygın ve doğru Floor kullanımını temsil eder.)
Soru 16
Hata yakalama için yazılan try-catch-finally kod kümesinde finally bloğu …… için vardır.
Yukarıdaki cümlede yer alan boşluğa aşağıdaki seçeneklerden hangisi gelmelidir?
ADoğru cevap
Açıklama
**finally bloğu, try veya catch bloklarının çalıştırılmasından sonra, istisna (hata) oluşsa da oluşmasa da kesinlikle çalıştırılması gereken** kodları (örneğin, dosya veya veritabanı bağlantılarını kapatma gibi temizleme işlemlerini) içermek için kullanılır.
Soru 17
Flutter’da, provider kütüphanesi kullanılarak bir veri modeli oluşturulacaksa, bu veri modeli aşağıdaki sınıflardan hangisinden miras almalıdır?
ADoğru cevap
Açıklama
**provider kütüphanesi ile durum yönetimi (state management) yapılırken, değişimi dinlenecek olan veri modelinin (Model Class) diğer widget’ları uyarabilmesi için Dart’ın ChangeNotifier (A) sınıfından miras alması ve veri değiştiğinde notifyListeners()** metodunu çağırması gerekir.
Soru 18
setState(() {
_active = _active;
});

Yukarıdaki kod parçasında “setState” içerisinde “_active” değeri güncellenmiş ve bu değere göre hiyerarşide içteki bir widget arkaplan rengini seçecektir.
Hal böyle iken, setState metodu arayüz bileşenlerinin oluşturduğu ağaçta güncellenecek arayüz bileşeninden daha dış seviyede bulunuyorsa, arayüz güncellenmesinde değişen veri içteki arayüz bileşenlerine (widget) aktarılma yöntemi aşağıdakilerden hangisidir?
EDoğru cevap
Açıklama
Flutter’da veri, widget ağacında tek yönlü olarak, yukarıdan aşağıya akar. Dışarıdaki bir **StatefulWidget’ın setState() ile durumu güncellendiğinde, bu yeni veri, ilgili widget’ın (arayüz bileşeninin) build metodu içinde, içeride kalan (child) widget’ın yapıcı (constructor) fonksiyonuna** (E) parametre olarak beslenir. Bu, verinin hiyerarşide alt seviyelere aktarılma şeklidir.
Soru 19
GridView düzenleyici arayüz bileşeni için aşağıdaki tanımlardan hangisi uygundur?
ADoğru cevap
Açıklama
**GridView widget’ı, çocuk widget’ları (children) düzenli bir ızgara (grid) şeklinde (birden fazla sütun/satır) ve kaydırılabilir** (scrollable) bir görünüm içinde düzenlemek için kullanılır.
Soru 20
“App State” (Uygulama durumu) Flutter’da veri değişiminin bir durum ile uygulama genelinde takibini sağlayan yaklaşımdır.
Aşağıdakilerden hangisi için “App State” yaklaşımını kullanmak gereksiz olacaktır?
ADoğru cevap
Açıklama
**App State** (Uygulama genelindeki durum), uygulamanın birçok farklı yerinde ihtiyaç duyulan ve değiştirildiğinde birçok widget’ı etkilemesi gereken veriler (oturum bilgisi, sepet içeriği, bildirimler) için kullanılır (B, C, D, E). Bir animasyonlu widgetın animasyonu oynatımı (A) ise genellikle yalnızca o widget’ı veya yakın çevresini etkileyen, yerel (local) bir durumdur ve uygulama genelinde izlenmesi (App State) gereksizdir.