»
Y
A
N
M
E
N
Ü
«
etkili kullanıcı arabirimleri hazırlamak
ibrahim dursun @ 25 Kasım 2005 19:26

Raize Şirketi Yetkilisi Ray Konopka Borland Konferanslarında yaptığı bir sunumun makale olarak hazırlanmış hali

http://bdn.borland.com/article/borcon/files/1226/paper/1226.html

Ben daha önce hiç bu kadar ilginç, eğlenceli ve yararlı bir makale okumamıştım. Yazı da çeşitli tipteki kullanıcıların neyi nasıl değerlendirdikleriyle ilgili tespitler yapılmış.

Birkaç tane de kural verilmiş

  • İyi tasarlanmış kullanıcı arabirimli bir program ancak kullanıcının düşündüğü gibi çalışandır
  • Sunum modeli kullanıcı modeline yaklaştıkça programın kullanımı ve anlaşılması kolaylaşır
  • Kullanıcılar en basit modeli kullanacaklardır
  • Her seçenek sunduğunuzda kullanıcıdan bir karar vermesini istiyorsunuz
  • Tutarlılık kullanım kolaylığı sağlar
  • Bir penceredeki kelime sayısı arttıkça onları okuyan kullanıcı sayısı azalır

SWT ve JFace
ibrahim dursun @ 21 Kasım 2005 15:22

IBM, eclipse projesine başladığında Swing kütüphanesinin performans açısından düşündükleri tarzda bir IDE oluşturmak için yeterli olmadığına karar verdi. Bu yüzden yeni bir GUI kütüphanesi yazdılar(SWT). Bu yeni kütüphanede çalışan kod yerel kod olduğu için performans açısından büyük bir kazanım oldu. Her işletim sistemi için SWT’nin özelleştirilmesi ile de platformdan bağımsızlık sağlandı. Drag&Drop gibi işletim sistemine özgü yeteneklerden direk yararlanma imkanı doğdu.

SWT sayesinde elde edilenler:

  • Performans: Çalışan uygulamalar sanki çalıştırıldığı işletim sistemi için hazırlanmış gibi hızlı çalışabildiler.
  • Uyumluluk: SWT ile hazırlanmış uygulamalar herhangi bir eklemeye gerek duymadan işletim sisteminin görünümü alabileceklerdi. Swing uygulamaları da Look&Feel desteği içermekte ama bu görünümler önceden hazırlanmış kütüpheneler halinde. Eğer kullanıcı WindowBlind gibi üçüncü parti yazılımlarla işletim sisteminin görünümünü değiştirirse, swing uygulamaları buna tepki veremez ama SWT uygulamaları bu değişikliği anında yansıtır.

Swing’in en beğenilen tarafı ise MVC (Model-View-Controller) tasarım şablona bağlı kalınarak hazırlanmış olmasıydı. SWT ise Olay tabanlı (Event based) bir kütüphane olmuştu. Oluşturulan nesneler sistem kaynaklarını kullanıyor bu yüzden yok edildiklerinde ise dispose metodu ile bu kaynakların işletim sistemine geri verilmesi gerekiyordu. Basit bir pencere açmak için bir ton kod yazmak gerekiyor,
Swingde Garbage collector’un yaptığı işler ise programlayana bırakılıyordu.

import org.eclipse.swt.widgets.*;

public class MainWindow {
    public MainWindow() {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Main Window");
        shell.setBounds(100,100,400,400);
        shell.open();
        // Even Loop - Olay döngüsü
        while(!shell.isDisposed()) {
            display.readAndDispatch();
        }
        display.dispose(); // iş bittikten sonra yoket
    }

    public static void main(String[] args) {
        MainWindow mw = new MainWindow();
    }
}

Bu noktada programcılara yardımcı olması ve Eclipse geliştirilken oluşabilecek bir kaosu önlemek için yardımcı bir kütüphane oluşturuldu (JFace)

JFace, MVC ayrımını yapan bir çok sınıftan oluşturulmuş bir kütüphanedir.

Yukarıdaki örneği JFace kullanarak şu şekilde yazmak mümkün:

import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MainWindow2 extends ApplicationWindow {
    public MainWindow2() {
        super(null);
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("Main Window 2");
    }

    @Override
    protected Point getInitialLocation(Point initialSize) {
        return new Point(100,100);
    }

    @Override
    protected Point getInitialSize() {
        return new Point(400,400);
    }

    public static void main(String[] args) {
        MainWindow2 mw2 = new MainWindow2();
        mw2.setBlockOnOpen(true);
        mw2.open();
        Display.getCurrent().dispose();
    }
}

JFace’in belli başlı kazanımları

  • Action ve Contribution: Kullanıcı ile iletişim sağlanması sırasında aynı kodun tekrar tekrar yazılması yerine merkezi bir kontrol tabakası oluşturmak için gerekli sınıflar. Mesela kullanıcının, bir menü öğesini seçmesi veya bir düğmeye tıklaması gibi işlemler ilişkilendirilmiş Action sınıfa yönlendiriliyor.
  • Dialog ve Wizard Pencereleri: Uygulamalarda çok kullanılan belli tip pencereler sınıflar haline getirildi. TitleAreaDialog, MessageDialog, ErrorDialog vb..
  • Viewerlar: TreeView ve Table gibi widgetlar için Model oluşturulmasına olanak tanıyan sınıflar eklendi. TreeViewer, TableViewer vb.

Expression Evaluation
ibrahim dursun @ 17 Kasım 2005 20:28

Merhaba,

Recursion yöntemini kullanarak neler yapılabileceğini göstermek amacıyla

   12
-------- + 6
 13 + 1
 ------
   28

gibi ifadeleri (Expression) hesaplayan örnek bir program yazalım dedim.

Program bölme ve toplama işlemlerini tanıyabilecek. Bölme için gerekli çizgiler ‘-‘ karakteri kullanılarak çizilecek.

İfadeler ya bölme ya toplama işlemi olacak o yüzden şöyle bir class hiyerarşisi oluşturuyoruz.

İlk olarak bütün ifadelerin hesaplama yapan bir metodu olmalı ve bu metod Real bir değer döndürmeli. O yüzden TExpression diye abstract bir class tanımlıyoruz ve içine Evaluate metodunu yazıyoruz. Devam…

Backtracking
ibrahim dursun @ 17 Kasım 2005 19:25

Merhaba arkadaşlar, İlk algoritma olarak kodlaması kolay ama kolay olduğu kadarda masraflı çok olan “Aynı yere geri dönme” (Backtrack) algoritmasını seçtim. Makelenin geri kalanında backtrack olarak söz edeceğim.

Backtrack algoritması özyineleme (recursion) desteklenen her dilde kodlanabilir ve basit bir algoritma olmasına rağmen de bir çok ufak iş için kullanılabilir. Bu algoritmanın dezavantajı maximum adım sayısı bilinmeyen durumlarda stackoverflow hatasına neden olabilmesidir.

Algoritmanın pseudo-code’u aşağıdaki gibi :

procedure backtrack(i:integer;deger: integer);
basla
  Eger sonuclardan-biriyse
    << sonucla ilgili islemleri yap >>
  degilse
    her adaydeger icin backtrack(i+1,adaydeger);
  bitir;
bitir;

Tabi ilk bakışta bu pseudo-code’dan her şeyi anlamak kolay değil, o yüzden hemen bir örnek verelim. Bu algoritmayı kullanarak bir kümenin bütün alt kümelerini oluştururalım. Kümemiz 1’den 5’e kadar olan sayılardan oluşsun. Algoritmada bahsi geçen her adım için adaylar true ve false değerlerini alacak. Yani herhangi bir indexdeki eleman o altkümenin içindeyse true değilse false olarak işaretlenecek. Eger adım sayısı kümenin eleman sayısına eşit olduysa tüm kombinasyonlar üretildi demektir, sonucu ekrana yazıyoruz. Eger adım sayısı kümenin eleman sayısından küçükse daha üretilmesi gerek kombinasyonlar var demektir, bizde bir sonraki adım için tüm olası değerleri veriyoruz.

arr : array[1..5] of boolean;

procedure Recurse(i : integer; val:boolean);
var 
  j : integer;
begin
  arr[i]:= val;
  if (i=Length(arr)) then begin
    Write('{ ');
    for j := 0 to Length(Arr) do  if(arr[j]) then Write(j,' ');
    WriteLN(' }');
  end else begin
    recurse(i+1,true);
    recurse(i+1,false);
  end;
end;
begin
  recurse(1,true);
  recurse(1,false);
  readln;
end.

n elemanlı bir kümenin 2^n tane altkümesi vardır, dolayısıyla örneği çalıştırdığımızda 32 tane sonuç göreceğiz.

İkinci örnek olarak da bir string içindeki karakterlerin bütün permütasyonlarını oluşturalım. Yine aynı mantığı kullanıcaz ama bu sefer biraz daha fazla çalışmamız lazım.

var
  str : string = 'ABC';

 procedure backtrack(str:string;i:integer);
 var
  j: integer;
  ch : char;
 begin
   if i = length(str) then begin
     WriteLn(str);
   end else begin
     for j := i to length(str) do begin
        ch := str[i];
        str[i] := str[j];
        str[j] := ch;
        backtrack(str,i+1);
     end;
   end;
 end;

begin
  backtrack(str,1);
  Readln;
end.

Örnekteki i değeri str değişkeninin uzunluğuna denk olduğunda bunu ekrana yazıyoruz, eğer değilse i ve length(Str) arasındaki karakterleri str değişkeninin i. karakteri ile değiştirip prosedürü tekrar çağırıyoruz. Üç karakterden oluşan stringin toplam 3! = 6 tane permütasyonu olması lazım, yalnız biz bunu yaparken bütün karakterlerin birbirinden farklı olduğunu farzediyoruz. ‘AAA’ şeklinde tanımlanmış bir değişkende birbirinin aynısı olmasına rağmen 6 tane satır göreceğiz.

»  Substance: WordPress   »  Style: Ahren Ahimsa