Re: [Linux-programlama] Yapisal Programlama / Nesne Temelli Programlama

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Fri 27 May 2005 - 12:02:54 EEST


Selamlar..

> Merhaba,
>
> Nesne Tabanlı Programlama'nın gerekliliğini "anlamak" için bazı
> deneyimleri yaşamak gerekiyor.
>
> (i) "Büyük" bir uygulama yazmak. Bunu ekip halinde yazmak. Mesela 8-10
> kişinin 1-2 yıl kod yazacağı bir şeyin içinde bulunmak.
> Gereksinimlerin sürekli değiştiği bir ortamda bu ölçekte bir
> uygulamanın düzgün biçimde ve hatasız biçimde teslim edilmesi için
> yapısal programalamanın sunduğu bir yöntembilim yok.
> Yapısal programlama "dondurulan" bir gereksinim belgesinin var
> olduğunu düşünür. Ancak böyle bir şey yoktur. Nesne tabanlı
> programlama ise üzerine kurulduğu "soyutlama" kavramı sayesinde
> varlığını zaten kabul ettiği "değişen gereksinimler" için "esnek"
> yapılar kurmaya olanak sağlar.

Bu biraz öngörüsel bir kavram. Yok olup olmadığı ayrı bir tartışma
konusu. Fakat bu "Yapısal programlama için böyle bir mekanizma
getirilemez" çıkarımını getirmez. Yani dilerseniz, yapısal programlama
içinde benzer yöntemler bulabilirsiniz.

> (ii) Eski, hatta başkasının yazdığı, bir uygulamaya "bakım" yapmak.
> Kimin, nerede, ne amaçla, neyi, nasıl ve ne zaman yaptığını kısa
> sürede tespit edip, gerekli görülen değişiklikleri yapabilmek için
> uygulamanın yapısının çok iyi kurgulanması gerekir. Nesne tabanlı
> programlama bu konuda son derece güçlü araçlar sunar. Elbette yazılım
> bakımı sadece değişiklik gereken yeri tespit etmekle bitmez. Bir de
> bu değişikliğin, yazılımın geri kalan kısımlarında ek bir değişiklik
> gerekmeden (yada azıcık gerektirerek) yapılabilmesi gerekir. Nesne
> Tabanlı Programlama burada da avantajlı.

İyi kurgulanmamış nesne tabanlı bir program için bunlar geçerli
olabildiği gibi, iyi kurgulanmış yapısal bir kod içinde benzer
avantajları görebiliriz.

> (iii) Önceden yazılan uygulamalardaki kodları kullanarak, aynı türden
> olmasa da, yeni bir uygulamayı daha hızlı biçimde geliştirmek. Yani
> yeniden kullanım (re-use) sağlamak. Bu konu çok tartışılmakta olan bir
> konu. Nesne tabanlı proramlama "bileşen" hazırlamak ve kullanmak için
> çok önemli bazı alt yapılar getirerek bu amaca ulaşmak için
> kullandığımız temelleri atmıştır.
> Uygulama çatısı olarak adlandırdığımız şeyler de buradan çıkmıştır.
> PHP ile benzeterek bir örnek vermeye çalışayım. Nuke kodları ile
> oynayarak bir portalı kısa sürede çıkartmak çok yapılan bir şey. Ama
> sonuçta Nuke'de olmayan bir özellik, davranış ve hatta dış görünüşte
> ciddi bir değişiklik istendiği zaman tıkanmak olası. Ancak nesne
> tabanlı bir portal uygulama çatısı ile çalışınca, ne
> geliştirdiğimizden bağımsız biçimde kazanımlarımız oluyor. Bu nedenle
> bakınca "Nuke" demek olasılığı kalmıyor. Neyin çalıştığını
> anlayamıyorsunuz. Çünkü aslında çok da önemi yok. Birisini söker
> ötekini takarsınız. (Madde ii)

Buda biraz totoloji. Bugün C ile uygulama yazarken tonla kütüphane
kullanıyoruz ve önceden yazılmış kodları tekrar tekrar güzelce
kullanıyoruz. Değişiklik vs. yapmak içinde aynı durum elbette geçerli.

> Kısaca özetlersek "nesne tabanlı düşünce" bambaşka bir düşüncedir.
> Yapısal düşüncenin çözemediği problemleri çözmek için yapısal
> düşüncenin dışına çıkar. Kavramlarının bazılarının yapısal düşüncede
> dengi yoktur.

Eğer, nesne tabanlı yaklaşım içindeki kavramların yapısal programlamada
olmaması ile tersi her zaman doğru olacaktır. Olay şudur. Nesneler
programcının kafasındadır, bilgisayarda nesne filan yoktur.

Nesneye yönelik paradigmayı en basit tanımla;

nesne->yontem(parametre); // Nesnel yaklaşım..
yontem(nesne, parametre); // Yapısal yaklaşım...

Şeklinde özetleyebiliriz. Kısacası Nesneye yönelik çalışmanın
avantajlarını bu şekilde özetlemek biraz yanlış olur. Nesneye yönelik
çalışmanın illaki mevcut dillerdeki "class" gibi kavramlarla açıklanmaya
çalışılması da bir diğer sorundur.

Nesne mevzusunun getirileri çoktur, günlük hayatta karşılaşılacak
sorunların pek çoğuna daha kolay çözümler de sunar. Ama bunun için
öncelikle NESNE kavramını anlamak gerekir. Şöyleki, siz hiç alakasız
dillerle (mesela BASIC veya C) de nesneye yönelik çalışabilirsiniz.
Yukarıda saydığınız yaklaşımlar, nesneye yönelimin getirileri değil,
sonuçlarıdır. Aynı faydaları sıradan yapısal programlama araçları ile de
sağlamak mümkündür.

Nesneye yönelimin tek avantajı, analiz ve dizayn aşamalarında sağladığı
kolaylıktır. Bunun da sebebi, işlenecek veriyi saklayıp güzelce bunu
işleyecek kodla birlikte kapsüllemesidir. Bunun dizayn için avantajı son
derece büyüktür. Çünkü bir "nesne" yi verilerinin nasıl olduğuna
bakmaksızın, onun dilinden anlamaksızın kullanabilirsiniz. Bunu o kadar
iyi yapabilirsiniz ki, kendinizin bir parçası gibi kullanabilirsiniz.
Çünkü dışarıdan bakanlar için sizin neyi yaptığınız, nasıl yaptığınız
vs. değil, yapabildikleriniz önemli olur. Nesneyi kullanırken şunun
datasına bir bakalım. Mesela bir buffer olsun bu data. Şuna biraz data
ekleyelim, ama buffer boyu yeterli değilse vs. gibi düşünmekten
kurtulursunuz. Buffer'i bir nesne olarak tanımlar, ona "la işte sana
data, bunu sonuna ekle" dersiniz. Gerisini o nesne kendisi halleder.
Verinin diğer nesne ve kullanıcılardan saklanmış olması, verinin farklı
şekillerde sunulabilmesini mümkün kılar. Bu sayede örneğin verilerinizi
kalıcı yapabilir, başka sisteme taşıyabilir vs. bunları yaparken de o
nesnenin uyumluluğu hakkında düşünmekten kurtulursunuz.

Nesneye yönelimi bir mesaj ile açıklamak zor olacak. Ama nesne
kavramının tek avantajının veriyi saklamak ve bu sayede veri dediğimiz
şeye akıl kazandırmış olmak olduğunu püf noktası olarak söyleyebiliriz.
Biz artık veri ile değil, o verinin kullanılacağı görevle
ilgilenebiliriz. Konuyu biraz açmak için bir nesnemiz olsun ve ne
yaparsak veriyi saklamış oluruz/olmayız buna bir bakalım.. Örnek
nesnemiz ekrandaki bir yazı kutusu (textbox) ve ilgilendiğimiz şeyde
onun yazı rengi ve içeriğindeki yazı olsun vede jenerik bir dil
kullanalım..

public:
     renk yazirengi;
     string icerik;
     function void refresh();
private:
     ....

....

textbox.yazirengi = "#FFFFFF";
textbox.refresh();

Olmadı... Birisi dışarıdan yazı rengini değiştir dediği zaman, sizin bir
değişkeninizi değiştirmeyi değil, görünen renginizi düşünmeli. Bu şöyle
olmalı mesela:

public:
    function void setyazirengi(renk yenirenk);
    function renk getyazirengi();

private:
    renk yazirengi;

Oldu işte.. Hayır, hayır olmadı.. Gene olmadı.. Siz gene "nesnel"
kavramdan uzaklaştınız. Çünkü get/set gibi konuyu yapısallığa çeken
doğal düşünce varsayımına ters oldunuz. Daha doğrusu şöyle olmalı:

public:
    property yazirengi;

private:
    renk gecerliyazirengi;

.......
// Kod icinde bir yer..

textbox.yazirengi = "#FFFFFF";

Neden get/set gibi bir method değilde, böyle bir property? Çünkü nesnel
yaklaşımda siz nesneye senin yazı tipin şu demelisiniz. Bunun set/get
edileceği vs. hepsi nesnenin sorumluluğundadır. setyazirengi() gibi bir
yaklaşımınız, nesneyi yazan tarafından farklı şekilde algılanabilirken,
nesneyi kullanan tarafından da farklı şekilde algılanabilir. Elinizde
3-5 nesne, 5-10 property varsa burada doğabilecek farklar aklıda kalıcı
olur ama, böyle dar uygulamalar sadece ödevlerde olur. Geniş çaplı
uygulamalarda binlerce nesne ile uğraşırken bu ve/veya benzeri bilgiyi
akılda tutabilmek zordur. Nesneye şunu diyorum, bunu diyorum yaklaşımı
olmamalıdır. Yaklaşım, nesneyi kullanmaktır. Programcı nesneye emir
yönelttiğini değil onun yazi rengini değiştirdiğini düşünmelidir.

Hal böyle olunca, C ile nesnel düşünce oturtmaya filan boğuşmaktansa,
C++ veya Python gibi nesneye yönelik bir dil kullanmaya çalışmak en
iyisidir. C++ için stream ve operator overloading kavramı en iyi
anlaşılan örnek olacaktır. Bu sayede insanlar dil tanımında hiç olmayan
"stream" mantalitesini dilin bir parçası imiş gibi rahatlıkla
kullanabilirler.

cout << "Sayı";

Nesneye yönelim iyidir. Ama her zaman en iyisi değildir. Daha kötüsü,
eğer siz nesneye yönelik bir çalışma yaptığınızı düşünüp felsefesini
yapısal yaparsanız gene amacınıza ulaşamazsınız.

Demek ki, bu yaklaşımın getirilerinin sonucu olarak çıkan avantajları
değil, nesneye yönelimin felsefesine dair yaklaşımları öne çıkarmak
gerekir. Ve de nesneye yönelim tercih edilmeli, bolca kullanılmalıdır.
Hatta, C gibi yapısal olarak kabul edilen bir dil kullanıyor olsanız
bile bu felsefenin kodunuza katabileceği çok şey vardır.

Elbette, kavramsal yaklaşımı aşmış, çalışan programa çalışırken şöyle
bir bakınca veri yapılarını filan kestirebilecek tecrübeniz varsa
yapısal veya nesnel kavramlar size fuzuli görünecektir. Fakat, o hale
gelmiş olmak gerçekten zor iştir, o yüzden en kısa zamanda nesneye
yönelik çalışmanın üzerine gitmek faydalı olacaktır..

Saygı ve sevgiler..

_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.