PL/SQL Türkçe Karakter Problemi

Merhabalar.

PL/SQL’de Türkçe karakterleri göremiyorsanız veya kodlarınız check-in yaptığınızda Türkçe karakterler “?” karakterine dönüşüyorsa aşağıdaki işlem muhtemelen derdinize deva olacaktır.

  • Computer sağ tık -> Properties -> Advanced system settings -> Environment Variables adımlarını takip ederek aşağıdaki pencereye ulaşın.

nls

  • Daha sonra açılan pencerede, Variable name: NLS_LANG ve Variable value: TURKISH_TURKEY.TR8MSWIN1254 değerlerini girip OK deyin.

nls2

 

Kendinize çook iyi davranın..

 

 Bu sayfa 1978 kez görüntülendi

Boya

Merhabalar.

Küçüklüğümde babamın anlattığı bir hikaye vardı. Oldukça hoşuma gitmişti. Halen, zaman zaman aklıma gelir. Onu paylaşmak istiyorum:

Lokman Hekim’in hikmetli, mükemmel sohbetleri iştihar bulur. Pek çok insan arasında yayılır. İnsanlar onu görüp, sohbetinde bulunmak için can atar.

Bir gün, onu görmeyi çok isteyen bir kadın gelir, görmek için. Ama gördüğünde hiç beklemediği bir görüntüyle karşılaşır. Zira Lokman Hekim derisi siyah, kalın dudaklı birisidir.. ve ona biraz da küçümseyerek, “bu muymuş Lokman dedikleri?” manasında bakar.

Onun bakışlarından düşüncesini anlayan Lokman Hekim, yine mükemmel bir cevap verir:

“Bacım neden öyle şaşkın bakıyorsun? Boyayı mı beğenmedin, boyacıyı mı?

İşte, “öteki”ne karşı; bilhassa da yaratılıştan dolayı bizden farklı olanlara karşı saygı duymak için, sahip olunması gereken muhteşem bilinç!

Hayırlı kandiller..

 Bu sayfa 883 kez görüntülendi

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 964 kez görüntülendi

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 749 kez görüntülendi

C#’ta Dictionary Kullanımı

Merhabalar.

Bu yazıda temel manada C#’ta dictionary kullanımından bahsetmeye çalışacağım.

Fırsat bulursam ileride daha detaylı ele almayı düşünüyorum.

Nedir?

Adından anlaşılacağı üzere sözlüğe benzetilen, key-value ikilisini içeren “generic” bir yapı.

Tanımı şu şekilde yapılır:


Dictionary<TKey, TValue> d = new Dictionary<TKey, TValue>();

Buradaki hem key hem de value kısmı herhangi bir obje(primitive tipler, nesne, delege/metod vb.) alabilir.

Aşağıda basit bir örnek var:


using System;

using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary<int, string> d = new Dictionary<int, string>(){
            {1,"Ahmet"},
            {2, "Mehmet"},
            {3,"Muhammed"}};

        Console.WriteLine(d[1]);
    }
}

Çıktı: Ahmet

Üstte söylediğim gibi key ve value kısımlarına farklı objeler set edilebilir.

Örneğin oluşturduğumuz bir “Musteri” sınıfının nesnesini set edelim:


using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
         Musteri must1 = new Musteri(1, "Muhammed", "Hilmi");
         Musteri must2 = new Musteri(7, "Ahmet", "Koca");
         Musteri must3 = new Musteri(12, "Mehmet", "Kara");
         Musteri must4 = new Musteri(15, "Mustafa", "Kılıç");

         Dictionary<int, Musteri> musteri = new Dictionary<int, Musteri>();

         musteri.Add(must1.Id, must1);
         musteri.Add(must2.Id, must2);
         musteri.Add(must3.Id, must3);
         musteri.Add(must4.Id, must4);

         Console.WriteLine("Id : " + 1 + ", Ad : " + musteri[1].Ad + ", Soyad : " + musteri[1].Soyad);
}

public class Musteri
{
    public Musteri(int id,string ad,string soyad)
    {
        Id = id;
        Ad = ad;
        Soyad = soyad;
    }
    public int Id { get; set; }
    public string Ad { get; set; }
    public string Soyad { get; set; }
}

Çıktı: Id : 1,Ad : Muhammed, Soyad : Hilmi

 

 Bu sayfa 2422 kez görüntülendi