Kategori Arşivi Yazılım Hakkında

Yazılımcılar ve İşsizlik

TÜİK’in son açıkladığı(16.01.2017 tarihinde) verilere göre işsizlik oranı bir önceki seneye göre %1,3 artarak %11,8 olmuş. Verilere daha detaylı bakınca tarım dışı işsizlik oranının 1,5 puanlık artış ile %14,1 , genç nüfustaki (15-24 yaş) işsizlik oranının 1,9 puanlık artış ile %21,2; 15-64 yaş grubundaki oranın ise 1,3 puanlık artış ile %12 olduğu görülüyor.

Aslında bu veriler Linkedin’deki “iş arıyorum” paylaşımlarının devamlı surette artmasıyla gördüğümüz gerçeğin matematiksel açıklaması.

Piyasanın genelinde görülen sıkıntının finans sektörü özelinde daha fazla olduğu ise arkadaşlarımdan duyduğum ayrı bir konu.

Tabi ki tüm bu sıkıntılardan yazılımcılar da -tüm sektörlerde çalışabildiğimiz için “yazılım sektörü” demek istemiyorum- azade değil elbette. İş arayan pek çok yazılımcıyı görüyor, duyuyor ve yakinen biliyorum.

Bütün bu kasvetli ortamda yazılımcıların diğer meslek grubu mensuplarında olmayan bir avantajı var elbette: Bir iş ortamı zorunluluğu olmadan üretim yapabilmesi. Evden, kafeden, hatta Anadolu’nun ücra bir köyünden. Yeter ki yanında ihtiyacı olan programları muhtevi bir bilgisayarı olsun!

Ben de bu konu üzerinde biraz kafa patlatıp, iş arayan bir yazılımcının “o esnada” neler yapabileceğini düşündüm. İşte aklıma gelenler:

* Öncelikle direkt bir ofis çalışanı olmak dışında freelance ve remote çalışma gibi iş modelleri yaygınlaşıyor. Şu an uluslararası uzaktan çalışma platformları da revaçta. Bunları göz önünde bulundurmakta elbette fayda var. Tabi İngilizce burada ayrı bir önem kazanıyor. Öte yandan imkanı olanlar için yurtdışı da diğer bir seçenek. Örneğin Fransa gibi IT çalışanlarına özel kolaylıklar sunan ülkeler var.

* Dünya her geçen gün daha hızlı dönüyor. Bilişim dünyası ise çok çok çok daha hızlı dönüyor. Geniş vakte sahip olmayı fırsata çevirebileceğimiz en iyi yol: yeni bir şeyler, mesela yeni diller, yeni teknolojiler öğrenmek. Backend, frontend kısıtlarına takılmaksızın Python, Ruby, Go, Angular,PHP, HTML 5, Mobil programlama, IoT(Raspberry Pi, Arduino) .. ve hatta yapay zeka; Lisp, Prolog vs. Öğrenilebilecek sonsuz şey var!

Elbette bu öğrenim sürecini belli konuları önceliklendirerek yapmalıyız ama mutlaka bir öğrenim süreci oluşturmalıyız. Hatta bu öğrenim süreci sadece iş arayanlar için değil tüm yazılımcılar için olmazsa olmaz. Devamlı surette yeni teknolojiler, diller(şu an GoLang’ın yardırması gibi), yaklaşımlar/konseptler(DevOps, Mikroservisler vs) çıkıyor.. ve mesela yıllarca uygulamaya çalıştığımız “code reuse” prensibi için Mikroservis yaklaşımı “bunu o kadar da şa’apmayın” diyebiliyor. Bütün bu değişimlere ayak uydurabilmek için devamlı koşmaktan başka çaremiz de yok.

Hele bir de Endüstri 4.0 (İçinde yapay zeka, makine öğrenimi, IoT, Robotik vs. bir çok teknoloji sayılabilir) olayı var ki(ayrı bir yazı karalama amacındayım E4.0 için) topyekün ülke halinde koşmamız gerekiyor -bu sefer de!- geri kalmamak için.

Neyse konu çok dağıldı. İşin özü yeni bir şeyler öğrenerek hem canlı/diri kalmak hem CV’mizi genişletmek, hem de örneğin blog yazarak, video ders hazırlayarak katma değer üretmek mümkün.

Ve elbette bütün bu söylediklerim için 10 yılını, 15 yılını aynı kurumda, aynı teknolojileri kullanmaya veren arkadaşların “Bu saatten sonra ne öğreneyim?” psikolojisinden sakınmaları gerekiyor.. naçizane tavsiyem.

* Aklıma gelen diğer konu ise özellikle son paragrafta bahsettiğim yıllarını belli teknolojilere vermiş yazılımcılarla ilgili. Bu tecrübelerinizi profesyonel biçimde paylaşabilirsiniz. Ne basılı kitap olarak ne de video ders olarak derinlikli Türkçe kaynaklarımızın sayısı belki 2 elin parmaklarını geçmiyor. Bunları üretebilirsiniz. Kitap yazarak iyi kötü bir gelir de elde edebilirsiniz. Hatta Youtube videoları ile bile az da olsa(tam piyasasını bilmiyorum açıkçası. Mesela 10 bin izlenen bir videodan ortalama ne kadar reklam geliri oluşur?) bir gelir elde edebilirsiniz. Bunun en iyi tarafı da diğer insanlar için de bir şeyler üretiyor olmanız.

* Diğer bir konu ise kendi uygulamalarımızı geliştirebiliriz: Web, mobil.

Örneğin şu videodaki 06:58’de başlayan traktör sitesi olayını dinleyebilirsiniz. “Bu devirde o kadar kolay para yok!” diyor olabilirsiniz. Ama 3 tane PHP sayfası olmasa da kaliteli bir site şablonu hatta frameworkü oluşturup bunu ticari ürüne çevirebilirsiniz. Veya örneğin; 4-5 sene önce bir arkadaşım, geliştirdiği Android döviz uygulamasından aylık 200-300 dolar reklam geliri elde ettiğini söylemişti. Ki o zamanlar da bol miktarda muadili uygulama vardı.

Bunların dışında eksikliğini hissettiğiniz başka uygulamalar da olabilir. Örneğin benim aklıma gelen, bildiğim kadarıyla derli toplu, Türkçe bir “yazılım magazin” sitesi yok. Donanım, girişim, genel teknolojiler hakkında -hepimizin aklına gelecek- başarılı siteler var elbette. Ama yalnız yazılım hakkında aklıma gelen aktüel bir yazılım magazin sitesi yok. “Yeni çıkan konseptler hakkında neler var? Martin Fowler en son neyden bahsetmiş? Go dilinde neler eklenecekmiş?Microsoft .NET Framework’e yatırım yapmay bırakacak mı?” vs. Bilhassa İngilizcesi iyi olan arkadaşların kolaylıkla yapabileceği bir şey.

* Üsttekine benzer ayrı bir düşüncem ise kurumsal firmalar için üretilebilecek ürünler. Hatta bunu birkaç kişi beraber geliştirip “startup”a da dönüştürebilir. Örneğin bir cache yapısı, log yapısı hatta bütün bir framework. Yine mesela bir “Deployment tool”. Halen Türkiye’nin en büyük bankalarından birinde geçen seneye kadar manuel deployment yapıldığını biliyorum ve asla bu konuda yalnız olduğunu zannetmiyorum. Yine örneğin finans sektöründe çalışmış birkaç kişi, çalıştıkları “business know-how”ıyla o konudaki bir ihtiyacı gideren ürünler tasarlayabilirler.

* Bunların dışında, maddi sıkıntı varsa biraz daha hızlı getirisi olabilecek özel ders piyasası da var(Özgür Yazılım Dünyası’nın affına sığınarak :))

Benim naçizane önerilerim bunlar. Söz konusu yazılım olunca yapılabilecek başka pek çok şey de vardır muhakkak. Yorumlar da katkılarınızı beklerim.

Yazıyı okuduğunuz için teşekkürler.

Allah iş arayışındaki herkese hayırlı rızık kapıları nasip etsin.

 Bu sayfa 425 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

PL/SQL’e Nereden Başlamalı?

Merhaba.

Bugün “PL SQL öğrenmek istiyorum ama nereden nasıl başlayacağımı bilmiyorum. Bir tavsiye verirseniz mutlu olurum” şeklinde bir mail aldım.

Ben de kalkıp bir Üstad edasıyla tavsiyelerimi sıralamaya başladım 🙂

Şaka bir yana bir üstad olmasam da tecrübesi benden daha az olanlara faydası olur ümidiyle naçizane tavsiyelerimi -az bir tasarrufla- buradan da paylaşmaya karar verdim.

Katkıda bulunmak isteyenler yorumlarını paylaşırsa memnun olurum.

Buyrun:

Öncelikle İngilizceniz iyiyse her şey çok kolay 🙂 İyi değilse doğal olarak biraz daha fazla efor sarfetmek gerekiyor. Ben blogda kapsamlı bir içerik üretmeyi hedefledim ama önce iş yoğunluğu akabinde ise iş değişikliğiyle beraber Oracle’dan Microsoft SQL Server veritabanına geçiş olunca maalesef yarım kaldı.

Hatta o dönem Türkçe kitap olmadığı için kitap yazmayı bile düşündüm ama fırsat bulamadım. Sonrasında Fahrettin Ateş, Orhan Eripek ve Özgür Umut Vurgun tarafından bir Türkçe kitap yayınlandı ama henüz inceleme imkanım olmadı.

Sorunuza gelirsek..

PL SQL dili, SQL üzerine bina edildiği için öncelikle temel SQL bilgisine sahip olmanız gerekmekte. Yani;

  • DML (SELECT, INSERT, UPDATE, DELETE)
  • DDL (CREATE, ALTER, DROP vb.)
  • Trigger, Primary Key, Foreign Key, GRANT, Snonym, Constrains, Distinct, Join, Group By, Order By yapıları ve terimlerini bilmeniz gerekiyor.

Bu konularla alakalı internette çokça Türkçe kaynak da bulabilirsiniz. Ama biraz İngilizceniz varsa tavsiyem buradaki veya buradaki tutorialları incelemeniz.

Sonrasında artık “merhaba dünya” diyebilirsiniz! Daha sonra

  • değişkenler,
  • fonksiyonlar,
  • prosedürler (stored procedures) şeklinde devam edebilirsiniz.

Bu kısımları ben de blogda anlatmaya çalıştım.

Sonraki aşamada yuklarıda bahsettiğim SQL işlemlerinin PL SQL’de nasıl kullanıldığını inceleyebilirsiniz.

Bunlardan sonra ise sırasıyla;

  • şart-koşul yapıları (IF-THEN-ELSE ve CASE yapıları),
  • cursorlar, döngüler(FOR, WHILE),
  • hata yönetimi (Exception Handling),
  • Transaction yönetimi şeklinde devam ederek ilerleyebilirsiniz.

Bu konuları da hallettikten sonra artık SQL Tuningle beraber daha derinlere dalabilirsiniz. Yazılımcıysanız muhtemelen bu kısımlar size yetecektir. Ama DBA iseniz daha da ilerlemenizde (benim de şu an bilmediğim sulara doğru :)) fayda var.

Benim bu saydığım konular için tavsiye edeceğim kaynak ise burada.

Naçizane tavsiyelerim bunlar. Umarım yardımcı olabilmişimdir.

Bu sayfa 759 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

C# Gerçek Hayat Örneği : Reflection ve Expression Tree

Merhaba.

Bu yazıda C#’ın ileri diyebileceğimiz bir kaç özelliğini kullandığım bir örnekten bahsedeceğim. Bir konuyu anlatmaktan ziyade ihtiyaç duyduğumuz senaryoyu nasıl gerçekleştirdiğimi anlatacağım. İnternette ciddi bir araştırma zamanı geçirdiğim için paylaşma ihtiyacı hissettim. Ama nasip olursa bu konular, özellikle de Reflection hakkında bir kaç giriş makalesi yazma planım var.

Asıl konumuza gelecek olursak.. İhtiyacımız olan karışık bir senaryoyu gerçekleştirmek için yoğun bir mücadele sonucu aşağıdaki metodları yazdım.

Öncelikle sistemimizde bir proxy yapısı var. Proxy’ye interface i vererek servis metodlarının remote çalıştırılmasını sağlıyoruz.

Örnek verecek olursak.. Amacım kod içerisinde kullanımı aşağıdaki gibi olan yapıyı çalışma zamanında oluşturup çalıştırmak.

using (var service = new Proxy<IUrunler>())

{

   var response = service.Execute<Response<List<Urunler>>>(srv => srv.GetUrunler());

   object list = response.Value;

   //Diğer kodlar

}

Burada proxy sınıfıma ait “Execute” metodu parametre olarak gönderilen “Action”ı çalıştırıp “Response<T>” tipinde dönüş yapan bir metod.

Bahsettiğim gibi bu scripti dinamik olarak oluşturmam lazım. Lakin zorluk şu ki; buradakilerden “IUrunler” sınıfını da, “Response<List<Urunler>>” tipini de, “srv => srv.GetUrunler()” ifadesini de bilmiyorum ve çalışma zamanında alabiliyorum.

Burada ilk olarak “srv => srv.GetUrunler()” ifadesini oluşturmam gerekiyor. Bunun için yazdığım metod aşağıda.

 private Expression CreateExpression(Type interfaceType, MethodInfo method)

{

   ParameterExpression parameter = Expression.Parameter(interfaceType, "srv");

   Expression callExpression = Expression.Call(parameter, method.Name, null, null);

   Expression lambdaExpression = Expression.Lambda(callExpression, new ParameterExpression[] { parameter });

   return lambdaExpression;

}

Metodun parametrelerini yukarıdaki “IUrunler” örneği üzerinden açıklayacak olursam:

interfaceType: “IUrunler” vb. sözkonusu interface in tipi.

method: “GetUrunler()” metoduna ait Reflection ile elde edilmiş “MethodInfo” nesnesi.

İlk önce lambda ifademizde parametre olarak “srv” kullanacağımı belirtiyorum. Daha sonra “call” edilecek metodun ismini(GetUrunler) vererek callExpression ifadesini elde ediyorum.  Burada Expression sınıfına ait tam 14 adet “Call” metodundan parametre olarak methodName alan Call metodunu kullandım (public static MethodCallExpression Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments);).

“Expression”ımda kullanacağım elemanlarımı elde ettikten sonra bu alemanlarla Lambda Expression’ı oluşturmaya geldi sıra. Bunun için de yine Expression sınıfına ait 18 adet Lambda metodundan parametre olarak yalnız “Expression Body” ve “ParameterExpression” dizisi alan metodu kullanıyorum(public static LambdaExpression Lambda(Expression body, params ParameterExpression[] parameters);)

Şu ana kadar en üstte verdiğim örnekteki Lambda expression(“srv => srv.GetUrunler()”) ifadesini oluturmuş olduk. Scriptin kalan kısmını elde etmek için bu lambda expression ı da parametre olarak alan yeni bir metod yazıyorum:

private object GetResponseValue(Type interfaceType, Type methodReturnType, Expression expression)

{

   var proxyType = typeof(Proxy<>);

   var service = proxyType.MakeGenericType(interfaceType);

   string methodSignature = "TResponse Execute[TResponse](System.Linq.Expressions.Expression`1[System.Func`2[" + interfaceType.FullName + ",TResponse]])";

   MethodInfo executeMethodInfo = service.GetMethods().Single(mi => mi.ToString() == methodSignature);

   MethodInfo executeGeneric = executeMethodInfo.MakeGenericMethod(methodReturnType);

   var instanceClass = Activator.CreateInstance(service);

   var response = executeGeneric.Invoke(instanceClass, new object[] { expression });

   object list = response.GetType().GetProperty("Value").GetValue(response, null);

   return list;

}

 

Bu metodda ekstra parametre olarak “methodReturnType” var ve bu “GetUrunler” metodunun dönüş tipini yani “Response<List<Urunler>>” değerini ifade ediyor.

Oluşturmamız gereken proxy nesnesi ve çağıracağımız “Execute” metodu generic yapılar olduğu için bunları reflection ile oluştumamız gerekiyor.

İlk etapta “service” instanceını oluşturabilmek için “Proxy<>” nesnesinin tipini alarak bundan yine reflection ile generic “service” tipini elde ediyorum.

Execute metodunun farklı overload ları olduğu için direkt kullanacağım metodun imzasını belirterek MethodInfo’sunu elde ediyorum. Kullanacağım metod da generic olduğu için metodun dönüş tipini belirterek ve “MakeGenericMethod” kullanarak “Execute” metodunun generic versiyonunu oluşturuyorum(MethodInfo executeGeneric = doActionMethodInfo.MakeGenericMethod(methodReturnType)).

Sonrasında “Activator.CreateInstance“ yardımıyla “service” instance ımı oluşturuyorum.

..ve oluşturduğum instance yardımıyla, expression parametresini de göndererek metodu invoke ediyorum, sonucu response değişkenine atıyorum.

Son olarak da “respons”un “Value” propertysini list değişkenime atıyorum.

Umarım açıklayıcı ve faydalı bir anlatım olmuştur.

Kendinize çook iyi davranın…

 

 Bu sayfa 665 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

IF Enflasyonundan Kurtulmak İçin Dictionary Kullanımı

Merhabalar.

Daha önce temel manada Dictionary kullanımından bahsetmiştim.

Dictionary yapıları anahtar-değer(key-value) ikilisiyle içinde değer tutan generic yapılar. Burada farklı bir kullanımından bahsetmek istiyorum.

Dictionary kullanırken value olarak method atayabiliyoruz.

Atamak istediğimiz bu metod geriye değer dönen bir metod olacaksa Func<parametre1,parametre2.., return_tipi> ifadesiyle;
değer dönmeyecek bir metod olacaksa Action<parametre1,parametre2….> ifadesiyle set ediyoruz.

Bilhassa IF enflasyonu olan yerlerde bu şekilde gayet temiz bir iş yapabiliyoruz.

Şimdi bir banka için, mesela combobox’tan seçilip gönderilen değerlere göre, çeşitli raporlar hazırlayan aşağıdaki gibi bir metodumuz olsun:

private void RaporHazirla(int raporTuru)
{
	if (raporTuru == 1)
	{
		SubeBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 2)
	{
		PersonelBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 3)
	{
		MusteriBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 4)
	{
		ToplamGunlukIslemRaporu();
	}
	else if (raporTuru == 5)
	{
		MessageBox.Show("Bu rapor 01.01.2015 tarihinden itibaren verilememektedir.");
	}
}

Burada bir Dictionary oluşturup, key olarak raporTuru‘nu, value olarak da rapor oluşturan metodları ekleyebilirim.

Ama burada bir problemimiz var! Son casede bir metod çağırılmıyor. Ama buradan da bir metod çağırmamız gerekiyor.

Yani:

private void RaporYokUyari()
{
    MessageBox.Show("Bu rapor 01.01.2015 tarihinden itibaren verilememektedir.");
}
private void RaporHazirla(int raporTuru)
{
	if (raporTuru == 1)
	{
		SubeBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 2)
	{
		PersonelBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 3)
	{
		MusteriBazliGunlukIslemRaporu();
	}
	else if (raporTuru == 4)
	{
		ToplamGunlukIslemRaporu();
	}
	else if (raporTuru == 5)
	{
		RaporYokUyari();
	}
}

gibi.

Artık Dictionary’mi oluşturabilirim. Global değişken olarak oluşturuyorum:

Dictionary<long?, Action> _dictRaporlar = new Dictionary<long?, Action>();

Burada value’yu Action tipinde tanımlamam demek, ekleyeceğim metodların tamamının void olması demek.
Eğer örneğin 2 int parametre alıp string bir sonuç dönen metodlar kullanacaksam(tabi bu defa da metodların tamamının parametre tipleri ve dönüş tipi aynı olmak zorunda. Ama object kullanılarak biraz esnetilebilir.) Action yerine Func<int,int,string> yazmam gerekirdi.

Her neyse şimdi Dictionary’nin içeriğini oluşturalım:

private void raporDictionaryOlustur()
{
	_dictRaporlar[1] = new Action(SubeBazliGunlukIslemRaporu);
	_dictRaporlar[2] = new Action(PersonelBazliGunlukIslemRaporu);
	_dictRaporlar[3] = new Action(MusteriBazliGunlukIslemRaporu);
	_dictRaporlar[4] = new Action(ToplamGunlukIslemRaporu);
	_dictRaporlar[5] = new Action(RaporYokUyari);
} 

Son tahlilde RaporHazirla metodumu aşağıdaki gibi ziyadesiyle sade bir şekilde düzenliyorum:

private void RaporHazirla(int raporTuru)
{
	 _dictRaporlar[raporTuru].Invoke();
}

Kendinize çook iyi davranın.

 Bu sayfa 1058 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

Refactoring 5: Açıklayıcı Değişken Kullanımı (Introduce Explaining Variable)

Merhabalar.

Bu yazıda Açıklayıcı Değişken Kullanımı – Introduce Explaining Variable yöntemini anlatmaya çalışacağım.
(Çeviri için arkadaşım Mesut Fatih Elevli’ye sevgiler..)

Nedir?

if ((platform.toUpperCase().indexOf("MAC") > -1) &&
(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0 ) {
// do something
}

extractmethod

final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;

if (isMacOs && isIEBrowser && wasInitialized() && wasResized) {
// do something
}

Neden?

Kimi zaman kod içerisinde -belki de- zamanla koda yeni caseler eklenmesiyle okunması zor kompleks ifadeler oluşur.

Bu ifadeler okunurluğunu ve yönetilebilirliğini artırmak için parçalanıp, değişkenlere atanabilir.

Elbette oluşturulan bu değişkenlerin güzel isimlendirilmesi(yukarıdaki örnekte isMacOs, wasResized kullanımları gibi) ziyadesiyle önem arz eder.

Bazı durumlarda bu yöntem yerine Extract Method yöntemini kullanmak daha efektif olabilir. Mesela bu ifadeler yerel değişkenler içerip, tamamı tek bir yerde kullanılıyorsa veya buradaki değişkenlerin tamamı global değişkense Extract Method kullanımı tavsiye edilebilir.

Nasıl?

  • Öncelikle anlaşılır şekilde isimlendirilmiş bir değişken oluşturulur ve sözkonusu kompleks ifade bu değişkene atanır.
  • Daha sonra ifadelerin yerine değişkenler yazılır.
  • Derleme ve test.

Örnek

Yöntemimizi şöyle basit bir fiyat hesaplamasıyla inceleyebiliriz. 500 adet üzerindeki siparişlere %5 indirim yapılan bir ürün için toplam fiyatı hesaplıyoruz:

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
     return _miktar * _adetFiyati -
        Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
        Math.min(_miktar * _adetFiyati * 0.1, 100.0);
}

İlk etapta taban fiyat hesaplamasını ayırıyoruz.

double fiyat() {
     // fiyat = taban fiyat - indirim + nakliye
     final double tabanFiyat = _miktar * _adetFiyati;

     return tabanFiyat -
         Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
         Math.min(_miktar * _adetFiyati * 0.1, 100.0);
}

Nakliye masrafının hesaplamasında da taban fiyat üzerinden hesaplama yapılıyor. Dolayısıyla yeni değişkenimizi oraya da koyabiliriz.

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
    final double tabanFiyat = _miktar * _adetFiyati;

    return tabanFiyat -
        Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
        Math.min(tabanFiyat * 0.1, 100.0);
}

Şimdi toplam indirimi de değişkene alalım:

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
    final double tabanFiyat = _miktar * _adetFiyati;
    final double miktaraGoreIndirim = Math.max(0, _miktar - 500) * _adetFiyati * 0.05;

    return tabanFiyat - miktaraGoreIndirim + Math.min(tabanFiyat * 0.1, 100.0);
}

Nakliyeyi de ayırdık mı gayet okunur ve temiz bir kodumuz oluşuyor.

double fiyat() {
    final double tabanFiyat = _miktar * _adetFiyati;
    final double miktaraGoreIndirim = Math.max(0, _miktar - 500) * _adetFiyati * 0.05;
    final double nakliye = Math.min(tabanFiyat * 0.1, 100.0);

    return tabanFiyat - miktaraGoreIndirim + nakliye;
}

Bu örnekte tüm değişkenler global değişken olduğu için Extract Method yöntemi de kullanılabilir. Şimdi üstadın tavsiyesi üzerine bu yöntemi uygulayalım.

Örneği başa sarıyoruz.

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
     return _miktar * _adetFiyati -
        Math.max(0, _miktar - 500) * _adetFiyati * 0.05 +
        Math.min(_miktar * _adetFiyati * 0.1, 100.0);
}

Taban fiyatı bu defa değişkene değil metoda çıkartıyoruz:

double fiyat() {
    // fiyat = taban fiyat - indirim + nakliye
    return tabanFiyat() -
        Math.max(0, _miktar - 500) * _adetFiyat * 0.05 +
        Math.min(tabanFiyat() * 0.1, 100.0);
}
private double tabanFiyat() {
    return _miktar * _adetFiyat;
}

Daha sonra tüm ifadeleri metodlara çıkarıyoruz:

double fiyat() {
    return tabanFiyat() - miktaraGoreIndirim () + nakliye();
}
 
private double miktaraGoreIndirim () {
    return Math.max(0, _miktar - 500) * _adetFiyat * 0.05;
}
 
private double nakliye() {
    return Math.min(tabanFiyat() * 0.1, 100.0);
}
 
private double tabanFiyat() {
    return _miktar * _adetFiyat;
}

Extract Method kullanımı, düzenlediğimiz ifadenin programın farklı yerlerinde de kullanımına imkan sağlayacağı için daha esnek bir yapı oluşturabilir. Bu yüzden ekstradan çaba gerektirmeyen durumlarda daha faydalı bir yöntem olabilir. Ama bolca lokal değişkenlerin olduğu ifadeler için Introduce Explaining Variable yöntemi kullanılabilir.

Kaynak: https://sourcemaking.com/refactoring/introduce-explaining-variable

Kendinize çook iyi davranın.

Bu sayfa 808 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr