9 Aralık 2010 Perşembe

Etkin Program Kodlama









Bir program parçası ne kadar kısa yoldan yapılırsa o kadar performanslı çalışacaktır. Bir program kodunun en iyi şekilde optimize edilmesine etkin kod yazımı denilir. Etkin Program Kodlamanın yanında Etkin Ara yüz'de çok önemlidir. Bunlar hakkında geniş bilgiyi aşağıda bulabilirsiniz.
Stringler ve Rutinler
Stringler (katar/alfanümerik karakterler) ve rutinler (düz kod parçaları) kullanımı optimizasyona ters düşen kodlama yöntemleridir. Aynı zamanda stringlerin kullanımı performansı, rutin kodların kullanımıda verimi ve düzenliliği düşürecektir. Etkin bir kodlama için biz string yerlerine işlem ve işleçleri rutin kodlar yerine prosedür ve fonksiyonlarını kullanacağız. Birde kullanılması pek de makul olmayan bazı komutlar var bunlar döngüleri kırma ve goto ile yönlendirme gibi komutlar.
YANLIŞ KODLAMA ETKİN KODLAMA
var
   parca  : array[1..8]of string;
   i      : byte

   aranan : string;
   bulundu: string;

{Program kodu}

parca[1]='işlemci';
parca[2]='anakart';
parca[3]='hafıza';
parca[4]='kasa;
parca[5]='ekran';
parca[6]='klavye';
parca[7]='fare';
parca[8]='sabit disk';

for i:=1 to 8 do begin
    if aranan=parca[i] then begin
       bulundu:='E';
       exit;
    end;
end;
if bulundu='E' then writeln('Aradığınız kayıt bulundu');
type parcalar=record
   isim:string;
   sira:integer;
end;
const
   parcalar:array[1..8] of parcalar=(
     'işlemci',1000,
     'anakart',1010,
     'hafıza',1020,
     'kasa;,1030,
     'ekran',1040,
     'klavye',1050,
     'fare',1060,
     'sabit disk',1070
  );

function bulma(aranan:integer): boolean;
     var i   :integer;
begin
   i:=0;  {Pascal'da gerekir}
   repeat
      inc(i);
      bulma:=(aranan=parca.sira[i]);
   until not bulma;
end;
{Program kodu}
if bulma(aranan) then begin
   writeln('Aradığınız kayıt bulundu');
end;
Örnek programları iyice inceleyerek göreceksiniz ki etkin kodlama gerçekten iyi bir optimizasyona ve anlaşılırlığa sahiptir. Görüldüğü gibi yanlış kodlamada boşuna string ifadeler ve rutinler kullanılmıştır. Eğer bir daha arama yapılsaydı aynı kodun bir daha yazılması gerekecekti. Oysaki etkin kodlamada işlem bölündüğü için defalarca yazmak yerine prosedürlerle bir defa akıllıca belirlemek yeterlidir. Daha sonra bir değişiklik gerektiğinde ilgili prosedüre giderek gerekli kısmı değiştirdiğinizde problem ortadan kalkacaktır fakat büyük bir yanlış kodlama içerisinde bu işlerin karma karışık olmasına neden olacaktır.
Ara yüz ve Resimler
Programınızı kullanılabilir kılan en önemli faktör ara yüzdür. Resimler programı daha performanslı kullanılması için konulan ivmelendiricilerdir. Lüzumsuz yere yapılan her süs (biçim ve resim) programın kullanılabilirliğini düşürür. Aşağıda yanlış ve doğru ara yüz ve resim seçimi görülmektedir.
Yanlış Arayüz Doğru Arayüz
wpeC.jpg (9212 bytes)

Gördüğünüz gibi ilk Ara yüz lüzumsuz belki de dikkat bile çekmeyecek yerlere yazılarak doldurulmuştur. Görüntüsü kirli, hantal ve gereksiz ayrıntılarla dolu. Fakat doğru ara yüzde gereken tüm işlemler sadelikle forma yerleştirilmiş. Kullanıcı sadece başlığı görerek hemen bunun bir login penceresi olduğunu anlayacaktır. Windows'u biraz kullanan her kes standart pencereleri gördüklerinde okumadan soruya cevap verebilirler çünkü o görüntünün onlara neyi çağrıştırdığını bilirler işin bu psikolojik boyutu hariç gerçektende aynı işi yapan aynı pencereler bir çok kez hiç okunmadan ya da göz ucuyla bakılarak cevaplanır.

Yanlış Resim Seçimi
Doğru Resim Seçimi
Özellikle amatör programcılar ve Türk programcıları nedense resimleri yanlış kullanmakta ustalar. Halbuki bunlar programınız şişiren ve frenleyen objelerdir. Doğru kullanılmış resimler sadece amaca hizmet ederler. İyi programcılar bunları genelde yerden ve kullanım rahatlığından faydalanmak için kullanırlarken yanlış kullananlar her komutun altına ona ilişkin bir resim koyarlar. Mesela yukarda konuşmuş Araç Çubuğu (toolbar) resimlerinden ilk formda bir şey anlamazsınız fakat ikincisi her programda standart olduğu için kaydet komutu bir bakışta görürsünüz. Ayrıca bilirsiniz ki bu objenin üstünde bekleyince yardım görüntülenir. Her iki formda aynı işi görür fakat birincisi sizi kullanırken öğrenmeye ve yavaşlamaya maruz bırakır.
Resim seçiminde dikkat etmeniz gereken unsur resmin varsa standartlardan seçilmesi yoksa doğru kriterlere göre hazırlanmasıdır. Bir resmin etkin olması için olması gereken başlıca özellikler şunlardır; resim formda fazla yer kaplamalıdır, çok renkli ve ayrıntılı resimler olmamalıdır, illa da komutu andırması gerekmez onu çağrıştırsa da yeter. Yalnız resim çizerken-ki özellikle küçük boyutlarda, resimlerinizde sadece temel öğelerini çizin ayrıntılar resminiz ilk bakışta görünmesini engellerler.

Resimden de anlaşılacağı gibi ayrıntılar resmin anlaşılabilirliğini yok ederler. İnsan gözü bir şekle ilk bakışta algıladığı hali ile kabul eder. İlk resmin kahve fincanı olduğu anlamanız diğerlerinde daha uzun sürer. Bunu engellemek için resimlerde ayrıntılarda aşırı renk kullanımından kaçınınız.
Uyarı İşaretleri ve Kullanım Yerleri



İkazlar yalnızca özel durumlarda sade ve kesin bir bilginin aktarılmasının lazım olduğu şartlarda kullanılmalıdır. Bir hatırlatma veya ön uyarıcı şeklinde kullanılmamalıdır. Bazı yanlış kullanımlar: "dikkat bilgileri dikkatlice doldurduktan sonra onaylayınız", "bu program demodur 10 günlük sınırlı kullanımını kullanmaktasınız", "Lütfen ürün girmeyi unutmayınız (girdiğiniz halde yine uyarılırsınız:)" gibi. Görüldüğü gibi bunlar kullanıcıyı her defasında kapatmak zorunda olduğu küçük sinir bozucu ikazlardır. Bunların hiç biri doğru değildir. Normalde ikazlar sadece önemli durumlarda kullanılmalıdır. Örneğin "Kullanıcı adınızı yanlış girdiniz, tekrar deneyin", "Stok rakamı eksi giremezsiniz", "Programın xxxxxx.xxx isimli dosyası silinmiş, bu dosya olmadan çalışmaz" gibi. Yalnız bu tür durumlarda ikazları kullanınız. Eğer kullanıcıyı bilgilendirmek ise amacınız bunu program üzerinde bir şekilde belli etmeniz programı anlaşılabilirliğini artırır. Ayrıca sürekli yanıp sönen, sesler çıkaran ikazlarda pek hoş değildirler. Onun yerine ikaz niteliği taşıyan bir ünlem işaretinin veya kırmızı bir noktanın bir yerde belirmesi daha uygundur. Özellikle stok vb. gibi sürekli durum değişen ve uyarısal konuma geçen programlarda ikaz lambası yanıp durum çubuğunda (status bar) isminin gözüküp geçmesi en iyi çözüm olacaktır.
Engellemeler ve Denetimler
Engelleme işlemi hiç kayıt yokken sil düğmesinin görevinin iptal edilmesi gibidir. Bu işlem iki şekilde yapılabilir birincisi silme tuşunun görevine bir kontrol satırı eklersiniz ve kayıt yoksa işlem yapmaz ya da doğru yöntem olarak sil tuşunu disabled yaparsınız, işlem gelince de geri çevirirsiniz. Böylece kullanıcı neyin niçin olduğunu görmüş de olur. Buna göre kullanılabilir düğmeler aktif, kullanılamazlar pasif (işlemez) olarak kalacaktır.

Resimden de anlaşılacağı üzere denetimlerin pencere üzerinde yapılması kullanıcının programı anlamasında daha etkili olur. Bu tür veri ve bilgi işleme formlarında ortalama bir standart vardır.
(Veri bilginin işlenmemiş halidir, yani kaydedilmemiş bilgi veridir)
Denetim işlemini yapmak için bir biriyle eş güdümlü çalışan objeleri prosedürlere böleceğiz. Bu prosedürler genelde; Arayüzü Yapıya Aktarma, Yapıdan Ara yüze Aktama, Ara yüzü Temizleme, Yapıyı Temizleme. Diğer bir grupta Kayıt Silme, Kayıt Okuma, Kayıt Yazma olacaktır (Kayıt Oluşturma işlemi sadece bir yerde yapıldığı için ilk kullanıldığı yerde kalır)
Kısayol Tuşları: İşlemlerin alternatif olarak tuşlardan yapılmasına denilir. İçsel kısayol tuşları (internal short cut) program tarafından bizler belirleriz. Dışsal kısayol tuşları (external short cut) Windows tarafından belirlenmiş sabit tuşlar ya da kombinasyonel kullanılan sabit tuşlardır. Program yaparken bunların ne kadar çakıştıklarına hangisinin diğerinden üstün olacağına biz karar vermeliyiz. Şu da unutulmamalıdır ki öncelikle içsel kısayol tuşlar işlem görür.
Kısayol tuşlarının seçimi sağ ellerini kullananlar ve solaklar (fareyi sol eliyle kullanması gerekir) için iki ayrı biçimde yapılır. Kısayol tuşu tanımlama fazladan bir uğraş gerektirdiği için bugüne kadar fazla özen gösterilmeden sağ elleri ile fareyi tutanlar için klavye kısayolları ayarlanmıştır. Buna göre fareyi sağ eliyle tutanlar klavyenin sol bölütünü kullanırlar, tersi durumda aynı işleminde tersi geçerlidir. Unutulmaması gereken bu sınırları geçmemek, bir diğer önemli problemde bunlar için Türkçe harfleri kullanmamak (ĞÜŞİÖÇğüşıöç).

Bordo renkteki tuşlar sağ ellerini kullanalar için, koyu mavi olan kısım solaklar içindir.
(Action) Menüler ve Araç Çubuğu: Windows standart'ında iki tip menü vardır. Pull Down ve Context Menu.

Pull Down Menu (bas çek menü)
Context Menu (konteks menü)
Tool Bar (araç çubuğu)

Pull Down menüler Pencere Bar'ının altında yer alan sürekli gözüken menülerdir. Context menüler herhangi bir objenin üzerindeyken farenin sağ tuşuna basınca çıkan menüdür. Araç Çubukları ise Pull Down menülerin altında yer alan küçük simgelerle dolu alanlardır.

Action: Faaliyet anlamına gelir. Dikkat edecek olursanız Pull Down menüler, Context menüler ve Tool Bar'lar üzerinde ortak tuşlar vardır. Örneğin Kes-Kopyala-Yapıştır tuşlarını tüm bu menü ve bar'larda görürsünüz.
Action bir kez tanımlandıktan sonra diğer menü ve barlara gerekli şekilde yerleştirilir. Barlara yerleştirilecekse birde simge seçilmelidir. Action kullanmak karmaşayı engeller ve anlık işlemlerde efektiflik sağlar.
Not: Yazdığınız programlama dilinde Action yoksa yeni versiyonlarını edinin.

Menü isimleri: Oldukça kısa ve işlem olmalıdır (tanım olmamalıdır) örneğin Programdan Çıkış ismi yerine sade Çıkış kullanılmalıdır.

Menü ayraçları (sperators): Ortak özellikten yapılan işlemler aynı blok içinde yer alırlar. Örneğin: Kes-Kopyala-Yapıştır

Menülerden sonraki üç nokta: Yukarıdaki Context Menu resmine bakacak olursanız bazı etiketlerin yanında ... (üç noktra) olduğunu fark edeceksiniz. Bunun anlamı: o işlemi yaparsanız çalışmanız üzerinde değişiklik olur.
Hızlı Kodlar:

Popüler Bazı Etkin Kodlar

Binary Search (ikili arama)
Alfabetik olarak küçükten büyüğe doğru sıralı büyük bir dizide etkin bir arama metodudur.
Çok performanslıdır, tahmini olarak örneklersek 10000 dizi içinde doğru kaydı yaklaşık 20 denemede bulur.

Sort Liste (Sıralama)
Bir dizi grubunu alfabetik olarak küçükten büyüğe veya büyükten küçüğe doğru sıralaya yarar.
En çok kullanılan 3 yöntem aşağıdadır.

Bu yöntemlerde sıralama küçükten büyüğe doğru yapılmaktadır. Eğer sıralamayı değiştirmek isterseniz koşulu tersine çevirmeniz yeterlidir. Yalnız unutulmamalıdır ki koşulların değişmesi yönünü tersine çevirmekle olmaz.
< simgesinin tersi >=
> simgesinin tersi <=
<= simgesinin tersi >
>= simgesinin tersi <

Genel değişkenler
A değişecek dizi
T temporal bölge
I ve J sayaç değişkenler

Bubble sort Çok popüler fakat en yavaş sıralama metodudur. Tüm dizi elemanları geriye kalan tüm dizi elemanları ile karşılaştırılarak sıralama yapılır.
 

procedure BubbleSort(var A: array of Integer);
 var
  I, J, T: Integer;
 begin
  for I := High(A) downto Low(A) do
  for J := Low(A) to High(A) - 1 do
   if A[J] > A[J + 1] then
   begin
    T := A[J];
    A[J] := A[J + 1];
    A[J + 1] := T;
   end;
end;

Selection sort Seçim tipi sıralama Bubble sort'tan daha hızlı fakat Quick sort'tan daha yavaştır.
 

procedure SelectionSort(var A: array of Integer);
 var
  I, J, T: Integer;
 begin
  for I := Low(A) to High(A) - 1 do
  for J := High(A) downto I + 1 do
   if A[I] > A[J] then
   begin
    T := A[I];
    A[I] := A[J];
    A[J] := T;
   end;
end;

Quick sort En hızlı sıralama işlemidir. Bu sıralama yönteminin çalışması Binary Search metoduna benzer.
 

procedure QuickSort(var A: array of Integer);

  procedure SubQuickSort(var A: array of Integer; iLo, iHi: Integer);
    var
      Lo, Hi, Mid, T: Integer;
  begin
      Lo := iLo;
      Hi := iHi;
      Mid := A[(Lo + Hi) div 2];
      repeat
        while A[Lo] < Mid do Inc(Lo);
        while A[Hi] > Mid do Dec(Hi);
        if Lo <= Hi then
        begin
          T := A[Lo];
          A[Lo] := A[Hi];
          A[Hi] := T;
          Inc(Lo);
          Dec(Hi);
        end;
      until Lo > Hi;
      if Hi > iLo then SubQuickSort(A, iLo, Hi);
      if Lo < iHi then SubQuickSort(A, Lo, iHi);
  end;

begin
  SubQuickSort(A, Low(A), High(A));
end;

Etkin kodlama önerileri
 

Yanlış kodlama Etkin kodlama
for i:=1 to 10000 do
  if b=i+i*6 and a=3 then islem;
for i:=1 to 10000 do
  if a=3 and b=i+i*6 then islem;
case EkBilgi of
  'BASLA': basla.enabled := TRUE;
  'BİTİR': basla.enabled := FALSE;
end;
const
  EK_BASLA   = 0;
  EK_BITIR   = 1;
case EkBilgi of
  EK_BASLA: basla.enabled := TRUE;
  EK_BITIR: basla.enabled := FALSE;
end;
for i := 1 to length(adres) do bitis := length(adres)
for i := 1 to bitis do

Hiç yorum yok:

Yorum Gönder