Xamarin Forms: PCL vs. SAP (Portable Class Libraries or Shared Projects)

Xamarin

Yeni bir Xamarin Forms projesi oluştururken seçmeniz gereken ilk strateji, ortak kodun Portable Class Libraries (PCL) veya Shared Projects (SAP) tercihidir. İkisi de farklıdır ve kendilerine göre durumları ve avantajları-dezavantajları vardır.

Yine yeni bir Xamarin Forms projesi oluştururken UI Teknolojileri stratejisi vardır. Bunu bir sonraki makale yazısında bulacaksınız. Şimdilik buna girmiyoruz.

İlk olarak .Net Framework erişimlerine bakalım. Öncelikle her ikisininde .Net Kütüphanelerine erişimi var ama; hep bir aması olur. 🙂 Bu erişim ikisinde de farklıdır. Örneğin HTTPClient olsun. PCL’de bu kütüphaneye direkt olarak erişemezsiniz, bu bazen erişmek yerine kullanamazsınız diyenlerde var bunlar göz korkutmak için. 🙂 SAP’da import (using) edebilirken, PCL’de Nuget’e ihtiyacınız olacak.

Şimdi ise gelelim #elif’e. Aslında şuan bunun için satırlarca yazı yazdım ama şuan sildim çünkü biraz daha basitleşmem gerekiyor zira her yerde bir değişik anlatılır ve çok zor kötü bir şeymiş gibi gösterilir. En başta şunu söyleyelim; bizim olayımız C# değil mi? Tamam, çok da fanteziye girmeye gerek yok. Ama SAP biraz giriyor işte. Mesela en basitinden şu örneği vereceğim; projeyi yaptınız fakat o da ne O_O. IOS’ta ortalık karışmış, etraf yanıyor, cayır cayır. Yok canım şaka, o kadar da değil. 🙂 Sadece IOS durum çubuğu ile projenizin bir controller’ı (her platform için farklı bir şey deniliyor da ben genel olarak buna controller derim) her neyse, mesela Label controller’ı olsun, Label’ın text’i o durum çubuğu ile çakışıyor. Bu iOS 7’den sonra oldu, merak ederseniz view ile ilgili bir durum.

Gördüğünüz gibi üstte bir çakışma var ama Android’te veya Windows’da yok. İşte bunun gibi platforma özel durumda platforma özel kod yazarız. Bu SAP’ta #if’in olduğu yerden, PCL’de bildiğiniz kod ile. Peki C# ile bu kodu nasıl yazarız; bir çok yöntemi var ama en kısasını göstereceğim:


Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);

Üstteki kodda bakmanız gereken “Device.OnPlatform” metodudurBir başka kod örneği:

 var osName = string.Empty;
 
 if (Device.OS == TargetPlatform.iOS)
 {
 osName = "Hello from iOS!";
 }
 if (Device.OS == TargetPlatform.Android)
 {
 osName = "Hello from Droid!";
 }
 if (Device.OS == TargetPlatform.WinPhone)
 {
 osName = "Hello from WinPhone!";
 }
 
 Debug.WriteLine(osName);//http://hotkrossbits.com/2015/05/03/xamarin-forms-pcl-vs-shared-project/

Aynı zamanda diğer dikkat edilecek kod TargetPlatform’dur!
Üstteki kodun daha da güzeli:

var osName = string.Empty;
 
 Device.OnPlatform(
 iOS: () => { osName = "Hello from iOS!"; },
 Android: () => { osName = "Hello from Droid!"; },
 WinPhone: () => { osName = "Hello from WinPhone!"; });
 
 Debug.WriteLine(osName);

 

E birde #if-elif kodu paylaşmamak olur mu?:


#if __IOS__

// iOS specific code

#elif __ANDROID__

// Android specific code

#elif WINDOWS_UWP

// Universal Windows Platform specific code

#elif WINDOWS_APP

// Windows 8.1 specific code

#elif WINDOWS__PHONE_APP

// Windows Phone 8.1 specific code

#endif

SAP’ta kullanılan bu yönergelere “preprocessor yönergeleri” denir. PCL C# preprocessor yönergelerini kullanamazsınız, çünkü bu yalnızca build zamanında çalışır.

PCL’in avantajı;

  • Daha kolay unit test
  • Kod okunurluğu
  • Daha Üstün Taşınabilirlik
  • Kodun daha iyi uygulanması

PCL’de birde istediğiniz platformu hedefleyebilirsiniz ama buna gerek duyulmaz, ben projeden sadece UWP’yi çıkarıyorum, diğer bütün platformları desteklesin. 🙂 Kısacası PCL iyidir, peki projede gözle görülür ne değişiyor diye sorarsanız yani pek bir şey yok, performans farklılığı da yok! Hemen hemen bu kadardır, çok derinlere de inmeye gerek yoktur çünkü derinliği yoktur.

Son olarak eğer örnekler görmek istiyorsanız çok yakında video ve yine blogda bu konuyu işleyeceğim. Daha çok PCL’de kodları test ederek anlatacağım.

Previous
Xamarin.Forms {RelativeLayout} – Bölüm 11
Next
Xamarin Forms ContentPage – Bölüm 12

Leave a comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir