Delphi her ne kadar nesneye yonelik bir dil olsada icerdigi vcl teknolojisi nedeniyle gelistirilen uygulamalar genelde yapisal programlama seklindedir. Yani bir problemi cozmek uzere delphi ide sini actigimizda problemi yukairdan asagiya dogru bir yaklasim izlerek cozmeye calisiriz. Nesneye yonelik cozumlerde ise bu tasarim sureci yukaridan asagiya degil asagidan yukariya dogru olacak sekilde cereyan eder.

Ayni ornek uzerinden giderek olayi her iki tasarim acisindan da orneklemeye calisalim. Cozmemiz gereken problem ise “X tabaninda ki bir sayiyi Y tabanina cevirmek” olsun. Bu problemi ilk once yapisal programlama mantigiyla cozup hemen arkasindan da nesneye yonelik olarak cozum gelistirecegiz ama bunun icin yazinin geriye kalan bolumlerini okumadan 10 dakika bir ara verin ve kendi cozumunuzu uretin. ardindan burdaki cozumlere bakin ve yapisal olarak mi yoksa nesnesel olarak mi dusundugunuzu kesfetmeye calisin. belki cok ogretici bir deneyim olmayacak ama eminim eglenceli olacaktir :)

Yapisal Cozum :

Yapisal cozumlerde daha once soyledigimiz gibi problem yukaridan asagiya dogru cozulur. Ilk once bizden istenilenler belirlenir hemen arkasindan bu islem icin gerekli olan parametreler belirlenir. bu parametrelerin saklanacagi degiskenler tanimlanir. hemen ardindan bu degiskenler sirayla fonksiyondan fonksiyona sokularak istenilen sonuc elde edilmeye calisilir.

Bu asamayi sesli olarak dusunursek asagiya yukari suna benzer bir dusunce gecer aklimizdan.

x tabaninda ki bir sayiyi y tabanina cevirebilen bir fonksiyon yazayim, bu fonksiyon x ve y tabani ile birlikte sayi degerlerini parametre olarak alsin elde edilen sayiyi bana geri dondersin. fonksiyonum soyle bir sey olabilir.

Function TabanCevir(Taban,CevrilecekTaban:Byte;Sayi:String):String;

Sayi ve geriye donecek deger 16 lik sayi sistemi de olabilecegi icin bu degiskenleri string olarak tanimladim.

yukaridan asagiya tasarim. goruldugu gibi ilk once en yukaridan basladik. metodun kendisinden..

simdi metodumun icini yazmaya baslayabilirim.
ilk once bana verilen sayiyi onluk sisteme cevireyim, ardindan da elde ettigim bu yeni sayiyi istenilen tabana cevirip sonucu geri dondereyim. Bunun icin verilen sayiyi onluk tabana ceviren ve onluk tabandaki bir sayıyı da istenilen bir tabana cevirebilen iki adet fonksiyon daha yazmam gerekir.

Function TabanCevir(Taban,CevrilecekTaban:Byte;Sayi:String):String;
var
OnlukTabanaCevrilmisSayi:Integer;
begin
OnlukTabanaCevrilmisSayi: OnlukTabanaCevir(Taban,Sayi);
Result := OnlukTabandanXTabaninaCevir(CevrilecekTaban,OnlukTabanaCevrilmisSayi);
end;

OnlukTabanaCevir, OnlukTabandanXTabaninaCevir fonksiyonlarini da yazdiktan sonra islemimiz bitmistir. Artik elimizdeki bir sayiyi bir baska tabana cevirebiliriz. Bu yapisal programlama da gidecegimiz cozum yoludur. Sonuca ulasmak icin gerekli adimlari belirleyip yukaridan asagiya dogru kodumuzu yazdik ve elimizdeki degerleri sirayla bi o fonksiyondan bi bu fonksiyona sokarak sonuca ulastik. Simdi de nesnesel programlama da gidecegimiz yolu gorelim.

Nesnel cozum :

Nesnel cozumlerde problem asagidan yukariya dogru cozulur. aslinda bu sıralama yapisal programlama da oldugu gibi cok kati bir yol takip etmez ama sanirim akilda daha kalici olabilmesi bakimindan tam tersi olarak kabul etmisler. Nesnel cozumlerde problemin cozumunun basladigi bir tepe nokta yoktur sadece problemin cozumu icin gerekli metod ve fonksiyonlar vardir. bu nedenle ister yukaridan asagiya ister asagidan yukariya ister soldan saga. karar size ait. simdi de yukarida ki ayni problem icin nesnel dusunelim.

x tabaninda ki bir sayiyi y tabanina cevirmem lazim. burda aslolan sey cozume giden yol degil cozumun altinda yatan nesnedir yani sayinin kendisi. ben bir sayiya kendisinin hangi tabanda oldugunu ve baska bir tabana nasil cevrilecegini ogretirsem problemim cozulmus olur. Sayi adinda asagidaki gibi bir sinif tanimlayayim.

TmySayi = Class
Public
Sayi:String;
Taban:Byte;
Function toBase(CevrilecekTaban:Byte):String;
end;

mySayi.Sayi:='B';
mySayi.Taban :=16;
ShowMessage(mySayi.toBase(10)); // 11

ornek biraz kisa ve kisitlida olsa olayi aciklamasi babindan yeterli oldugunu dusunuyorum. “ufak bir fonksiyonla yapilabilecek bir ceviri isi icin yeni bir sinif yazmanin manasi var mi?” derseniz bu ornek icin gercekten de yoktur. eger bir gun boyle bir problemle karsi karsiya kalirsam hic dusunmeden TabanCevir adli fonksiyonu kullanacagimdan emin olabilirsiniz :) Daha dogrusu bir tane metodu olan bir sinif tanimladiginizda bu sinifa gercekten ihtiyaciniz var mi diye durup kendinize sormalisiniz. tek bir metodu olan bir sinif bana gore gercekten de yanlis dusunulusmus , yanlis tasarlanmis bir siniftir.

mySayi.Sayi:='B';
mySayi.Taban :=16;
ShowMessage(mySayi.toBase(10)); // 11

iyi de yukarida ki satirlarda yapisal programlama gibi yukaridan asagiya dogru sirayla giderek problemi cozuyor. ya da toBase metodunun icerisinde de yukaridan asagiya bir tasarim mevcut. bu nasil is ?

yapisal programlama nesnel programlamanin bir parcasi. tipki nesnel ozellikte olan delpihede yapisal programlama yaptigimiz gibi. nesnelerin icerisinde ya da olustrudugumuz nesneleri bir araya getirirken yapisal programlama kullandigimiz gibi. burda dikkatlerin cekilmeye calisildigi husus problemlerin cozumunde nesnel cozumlerin kullanilmasi/dusunulmesi.

kaynak: http://www.bilgidata.com/kjebook/slidepage286.html

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>