Hibrit mi? Native mi?

Kategori: C#, Genel, Genel Programlama, Referanslar
Tarih: 2nd Ekim 2017

Bir platformda, bir arkadaşın başlıktaki sorusu üzerine yazmış olduğum yorumdur. Yeni başlayan arkadaşlar için bir fikir verebilir.

 

Merhaba. Yukarıda bazı arkadaşlar biraz değinmişler. Bu soruyu biraz “Java mı yoksa C# mı?” sorusuna; biraz da “C# mı yoksa C++ mı?” sorusuna benzettim. Ben cevap olarak direk hibrit yada native demeyi doğru bulmuyorum. Bir parantez olarak şunu söyleyeyim; eğer vaktin var ise Javayı ve Swifti öğrenmeni tavsiye ederim. Dil seçiminde kıyaslama yapabilmen için o dili biliyor olman büyük fayda sağlayacaktır.

Hibrit frameworkler aslında uygulamanızın altında yine native kütüphaneleri kullanırlar. Siz bu native kütüphaneleri frameworkün izin verdiği dilde yönetirsiniz/kullanırsınız. Arada bir katman daha olması sebebiyle hibrit uyglamalar biraz daha yavaştır denilebilir. Bir örnek vermek gerekirse; mesela bir hibrit frameworkün bazı kütüphanelerinde IOS için çalışmaz yada desteklenmez yazar. Bu demek oluyor ki bu kütüphane içerisinde ios için native dosyayı barındırmıyor. Bu farklı sebeplerden olabilir. IOS gerçekten o işe izin vermiyor olabilir, geliştirici daha IOS için kütüphane yazmamış olabilir vs. vs.

Bunun yanında, hibrit uygulama geliştirirken işletim sisteminin değil kullandığınız frameworkün sınırları dahilindesiniz. Eğer frameworkün sizin istediğinizi yapan bir kütüphanesi yok ise uygulama geliştirmeye devam edemezsiniz. O özellikten vazgeçmelisiniz. Yada istediğiniz özelliği sağlayan bir kütüphanesi varsa bile kütüphanenin şarj tüketimine etkisi, işlemci kullanımı vs. tamamı sizin kontrolünüz dışında (İstisna: kütüphaneleri açık kaynak olan bir framework kullanıyor iseniz kodun istemediğiniz kısmını düzenleyip yeniden derleyebilirsiniz.)

Bunlar hibrit uygulamaların ilk bakışta göze gelen eksileri. Fakat bunların tamamını silip süpürecek bir artısı var ki; bir sefer yaz her platformda çalışsın özelliği. Eğer projeniz -aşağıda değineceğim gibi- hibrit bir framework ile yazılmaya uygun ise hem geliştirirken hem güncellerken en az yarı süresinde tasarruf edersiniz. Ayrıca yukarıda dezavantaj olan 3. parti kütüphaneler sayesinde herşeyi yeniden yazmayıp bir çok şeyi sadece kullanıp uygulama geliştirme sürecinizi de hızlandıracaksınız. Bu açıdan da avantaj sayılabilir. Ayrıca bu kütüphanelerin çoğu açık kaynak olup; ister istemez onlarca geliştiricinin eleğinden geçiyor. Ki defalarca güncellenenleri mevcut.

Şimdi asıl konuya dönersek, genel olarak hangi dil yada hangi platformu seçmeliyim demek çok sığ. Bence her proje için özel olarak değerlendirilip seçim yapılmak daha doğru. Yazılım yaşam döngüsünün analiz basamağı bunu amaçlar. Mesela bir gömülü sistemler projesi yapıyorsanız ve sadece bazı grafikleri izlemek için bir mobil uygulama tasarlayacak iseniz neden ayrı ayrı her platform için geliştirme yapasınız ki; bazı frameworklerde sadece javascript/typescript kullanarak bile geliştirme yapabiliyorken.

Yada yukarıda hocamın bahsettiği gibi performans gerektiren bir projeniz var ise native kullanmamak demek intihar olur. En iyi dil, en iyi framework yoktur, o proje için en uygunu vardır. Eğer öyle olsaydı whatsapp gibi performans canavarı bir uygulama -sunucu tarafı-herkesin tartıştığı Java yada C# da yazılırdı. Kaç bilgisayar/yazılım mühendisi biliyor ki whatsappın yazıldığı dili?

Karakter deseni tanımlama – Regex

Kategori: Genel Programlama
Tarih: 17th Haziran 2013

Programlama dilinden bağımsız olarak metinler ile işlem yapıyor ve bu metinlerin içinde komplex aramalar yapıyorsanız regex işinizi kolaylaştırabilir. Mesela bir metnin e-mail adresi olup olmadığını, yada bir karakter dizisinin sizin belirlediğiniz standarlarda bir karakter dizisi olup olmadığını karakter katakter arama yapmak yerine regex kullanak tespit edebilirsiniz. Her programlama dilinin regex fonksiyonları var; bir desen oluşturursunuz sonra o fonksiyonları kullanarak metin sizin karakter setinize uygun mu kontrolünü yaparsınız yada metnin istediğiniz alanını alanını alırsınız. Regex ile ilgili bazı notları taranmış hali burada. 2. sayfada “metin web adresimi?” kontrolünü yapan örnek desen var.

Katmanlı Mimari ve Platformlar Arası Haberleşme Üzerine

Kategori: Genel Programlama
Tarih: 3rd Mayıs 2013

Bazen bir projede birden fazla platform ile haberleşmeniz gerekebilir. Bu bazen zorunluluktan bazen de sistemin tasarımından kaynaklanır. Mesela katmanlı mimari kullanarak bir sistem geliştirdiğinizi varsayalım. 1. katman data access layer burada veriyi veritabanından bağımsızlaştırırsınız. 2. katman business Access layer burdada veriyi istediğiniz formatlarda sınırlar ve kullanıcıdan parametre olarak isteğiniz formatlarda alırsınız (sorrugate tipler). 3. Katman ise artık size kalmış burada direk bir Windows form yada wpf ile uygulama geliştirebilirsiniz.

3n.jpg

Ama fonksiyonel olan 3. Katman olarak bir servis yazmaktır. Daha sonra platformu ne olursa olsun uygulamamızda bu servisi referans ederek yine uygulamamızı geliştiririz. Mesela hem android bir cihazdan hem bir web sitesinden hemde masaüstü uygulamasından aynı servisi kullanırız. 3 platformda da bir butona basınca servisin ilgili methodu çalıştırılır. Bütün bu uygulamalar bizim sistemimizin bir istemcisi olur. Bir hata mesajını bile değiştirmek istesek bütün platformlarla teker teker uğraşmak yerine servisimizdeki method içinden değişlik yaparız ve tüm istemcilere artık o yeni hata mesajı gönderilir.

Aslında bir servis yazmak için hiçbir sınırınız yok. Soket programlama boyutunda verinizi istediğiniz formatta gönderip istediğiniz formatta okursunuz. Hatta gönderilen ve alınan veriyi şifreleyerek güvenliğide sağlayabilirsiniz. Ama yine fonksiyonel olan bir standart kullanmaktır. Wsdl (web service defination language) yani web servis tanımlama dili veri gönderip almanız için bir servis standartıdır. Bu şekilde bundan birkaç sene sonra çıkacak olan bir proglamlama dili yada framework bile olsa servisiniz ona da hizmet verebileceltir.

asd

Wsdl bir servis mimarisi değil mimari içinde kullanılan bir tanımlama dilidir. Mesela SOAP(Simple Object Access Protocol – Basit Nesne Erişim Protokolü) wsdl kullanan bir mimaridir. Biz wsdl ile bu servisin sunduğu fonksiyonları, onların gerek duyduğu parametreleri ve geri döndüreceği verileri belirleriz. Soap için örnek bir wsdl kodu aşağıdadır.


<?xml version='1.0' encoding='iso-8859-9'?>

<definitions name="server" targetNamespace="urn:server" xmlns:typens="urn:server" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:typens0="http://127.0.0.1/server.php">

<message name="ekle">

<part name="urunAdi"/>

<part name="aciklama"/>

<part name="marka"/>

<part name="fiyat"/>

<part name="taksit"/>

<part name="musterikodu"/>

</message>

<message name="ekleResponse">

<part name="ekleReturn"/>

</message>

<portType name="class.testPortType">

<operation name="ekle">

<input message="typens:ekle"/>

<output message="typens:ekleResponse"/>

</operation>

</portType>

<binding name="class.testBinding" type="typens:class.testPortType">

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="ekle">

<soap:operation soapAction="urn:class.testAction"/>

<input>

<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input>

<output>

<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output>

</operation>

</binding>

<service name="serverService">

<port name="class.testPort" binding="typens:class.testBinding">

<soap:address location="http://localhost/server.php"/>

</port>

</service>

</definitions>

Bu şekilde tanımlanmış bir servise php ile bağlanacağımızı düşünelim. Bağlantı kodu da aşağıdadır.


<?php

  $client = new SoapClient("http://localhost/siparis.wsdl", array('encoding' => 'ISO-8859-9'));
   echo $client->ekle($_POST['urunAdi'], $_POST['aciklama'], $_POST['marka'], $_POST['fiyat'], $_POST['taksit'], MUSTERISIFRE);

?>

İşte bu kadar basit. Ne veritabanı ne soket bağlantısı vs. hiçbirşeyle uğraşmadık. Sadece butona basılınca servise bağlandık ve fonksiyonu kullandık. Üstelik bu tüm platformlarda böyle basit.

Servis wsdl kullanıyorsa sorun yok. Ama wsdl kullanmayan bir servisiniz varsa bazı platformlarda sorun yaşabilirsiniz. Mesela Nufus ve vatandaşlık işleri bazı kurumlara protokol dahilinde bir Wcf açıyor. Üniversiteler, Valilikler gibi. Bu servise php bir projeden bağlanamazınız. Wcf in bi dolu avantajının yanında tek dezavantajı bu heralde. Bu seferde veriyi wcf den çekebilmek için bir ara masaüstü uygulaması yazmanız gerekir. Siz parametrelerinizi bu programa gönderirsinizi bu programda sizin yerinize wcf e bağlanır, verinizi ona gönderir gelen veriyide size iletir. Bu iş için C# ile geliştirilmiş uygulama kodları aşağıdadır.


static void Main(string[] args)

{

try

{

Service1SoapClient client = new Service1SoapClient();

TCDon[] veri = client.TCKimlik(args[0], args[1]);

Console.Write(veri[0]._ailesirano + "|" + Seo(veri[0]._adi) + "|" + Seo(veri[0]._soyadi));

}

catch (Exception ex)

{

Rapor.Yaz(ex);

}

}

Bu programı çalıştırıp veriyi geri okuyacak php kodu da aşağıdadır.


$tc = “..........”;
 $ip = “..........”
 $r = shell_exec('C:\.....\service.exe '.$tc.' ' . $ip);

Bu şekilde bir ara programla tüm platformlarda haberleşme sağlatılarbilir.

Optimization WordPress Plugins & Solutions by W3 EDGE