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: Bora Güngören (bora@boragungoren.com)
Date: Fri 27 May 2005 - 14:49:02 EEST


Merhaba,

Serdar Hocam ile kavram tartışması yapmak çok zevkli olacak. :-)

Sevgiler.

Bora.

Serdar KÖYLÜ wrote:

>
>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.
>
>

Zamanında void* ailesi ile fazlası ile uğraşmış birisi olarak bunların
mümkün ama gereksiz çabalar olduğuna karar verdim. Dolayısı ile her ne
kadar öngörüsel kavramlar olsa da "gerçek dünyanın gerçek insanları"
için kayda değer bir şiddetle doğrulanıyor.

>>(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.
>
>
Uygulama çatısı kullanıldığı zaman "iyi kurgulanmamış" nesne tabanlı kod
yazmak eskiye göre daha zor. Bu da son 4-5 yılın moda gelişmesinin
oldukça iyi sonuçlar getirdiği demek oluyor.

Kim uygulama çatısı kullanıyor dersek, o ayrı bir tartışma. :-)

>>(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.
>
>
Değişiklik var değişiklik var. :-)

#define lar ile "şu işlevin adını bu işlevin adına, bu sabitin adını şu
sabitin adına eşleriz" türü işler yaptık diyelim. Peki işlevin aldığı
parametrelerin tipi değişince ne yapacağız? Tip dönüşümü kabusundan
kaçmak için düzenli tertipli yollar yok mu? Var. Ama o yolları kodlayana
kadar nesne tabanlı yazarız. :-)

>>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.
>
>
Zaten programlar da programcının kafasında olmalıdır. Bilgisayarda değil.

Yapısal programlama programcının bilgisayar gibi düşünmesini istiyor
yeri geldiğinde. Bu, çoğu tür yazılım için iyi bir şey değil. İşletim
sistemi çekirdeği yada aygıt sürücüsü gibi bir şeyler yazmadığınız
sürece insanı durduk yerde yoran bir çabadır. O türde yazılımlar için
gereklidir; doğru. Ama kimse de o türdeki yazılımların şöyle yada böyle
yazılması üzerine iddiada bulunmaz. :-)

>Nesneye yönelik paradigmayı en basit tanımla;
>
>nesne->yontem(parametre); // Nesnel yaklaşım..
>yontem(nesne, parametre); // Yapısal yaklaşım...
>
>Şeklinde özetleyebiliriz.
>

Bu çok basit bir soyutlama. Çok biçimlilik işin içine sokulmalıdır.

birinciturdennesneyeisaretci->yontem(parametre);

çağrısında, aslında bu işaretçi ikinci türden nesneye bağlanıp da
çalışabildiği zaman nesne tabanlı oluruz. Yani kısaca çok biçimlilik
(polymorphism) sağlamak için nesne tabanlı oluruz yada tersi.

Çok biçimliliği C yada Pascal gibi yapısal bir dille yapmaya kalkarsak
işin içine void* ve aşırı dikkatli olunması gereken tip dönüşümleri
girer. Ayrıca elimizdeki nesnenin tam tipini bilmekle yükümlü oluruz.
Halbuki nesne tabanlı programlamada böyle bir yükümlülük olmaz. vptr
tekniğini elimizle yazmaya kalkarsak da void* lar tablosu ile uğraşmak
gerekir ki; eminim ben yazsam C++ derleyicisinin oluşturduğu vptr
tekniğinden yavaş çalışır. Olası hatalar da cabası. :-)

>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.
>
>

Çok biçimliliği açıklamak için sınıf kavramı zorunludur. Çok biçimlilik
olmadan sınıf kavramının anlamı eksik kalır. Zaten yapısal programlama
kavramları ile anlatılması mümkün olmayan ilk kavram da budur. İkincisi
miras almadır. Ona hiç girmeyeceğim. :-)

>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.
>
>
Yapısal yaklaşımda çok biçimlilik ve miras almayı baştan kodlayana kadar
ikinci ve üçüncü ve belki de dördüncü projeyi teslim etmeyi tercih
ederim. :-)

Diğer projeler yoksa, giderim evime uyurum. :-)

>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.
>
>

Bu avantajın önemi, kod yazmaktan daha uzun sürenin çözümleme ve
tasarıma harcandığı gerçeği ile daha da öne çıkacaktır.

Kod yazma işi yazılım geliştirmenin genelde azınlığı, hatta çok küçük
azınlığıdır. Bazı sistemlerde çözümleme ve tasarım toplam sürenin
%70-80'ine kadar uzar. Sadece basit ve sıradan işlerde kod yazma içi
çoğunluğa sahip olur ki o zaman da aslında uygulama çatısı kullanarak bu
iş aşırı derecede kısaltılabilir.

Her iki durumda da nesne tabanlı yaklaşım ciddi zaman kazandırır.

>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.
>

Bu sadece ilk avantaj. Esas gücü veren çok biçimlilik ve miras almayı
yine atlıyorsunuz hocam. :-)

Üç temel tekniğin üçü de olmaksızın nesne tabanlı olmayız.

>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?
>

Aslında kendi içi dahil her yerde get/set kullanılması daha doğrudur.
Çünkü buradaki özelliğin değerindeki bir değişiklikten haberdar edilmesi
gereken birileri olabilir. Örneğin bir PropertyChangeListener için bir
olay oluşturulması gerekebilir. :-)

Onu geçelim elimizdeki nesnenin tipini bilmek zorunda değiliz. Çok
biçimlilik için get/set kullanmak daha sağlıklı. Doğrudan değere
erişilen bir kod o an için çalışan ama ileride alt sınıflar
yazıldığında bakım sorunu çıkartması olasılığı olan bir koddur.

>Çü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.
>
Binlerce nesne varsa zaten onları yönetmek için başka nesnelerden oluşan
yapılar kurmak (çok biçimlilik sayesinde hiyerarşiler, ayrıca tasarım
biçimleri ve nihayetinde uygulama çatıları) gerekeceği için ilkel mantık
gene işi fazlası ilegörüyor. :-)

C++ ve Java'nın diğer nesne tabanlı dillerden daha popüler olmasındaki
en önemli sebep çalışan programın hızı değil, bu tür yapıların hazır
gelmesi ve sürekli ortaya çıkmasıdır.

>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ı";
>
>
Aslında akış gene de vardır. operator<< paramtre olarak akışı alır.
Tampon stratejileri çok kanallı kod yazarken dikkat etmemizi gerektirse
de akış orada bulunmaktadır. :-) Ama biz o akışın ne türden bir akış
olduğunu bilme gereksinimi duymadan kendi sınıfımız için operator<< ile
çalışabiliriz. Burada yine çok biçimlilik ortaya çıkıyor.

>Nesneye yönelim iyidir. Ama her zaman en iyisi değildir.
>
Ortalama insanların ortalama projelerinde nesne tabanlı çalışmak
kesinlikle ortalama yaşam süresini uzatıyor. :-) Üstün insan
(übermensch) misali üstün kodlayıcıların (überkoder) projelerini
bilemem. Onlar için 1 v 0 düğmeleri olan klavyeler imal edelim
icabında. Ne de olsa diğerleri gereksiz. :-)

>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.
>
>
Doğru söze ne denir? :-)

>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..
>
>
Überkoder mi demiştim? :-) Nerede? Bizim burada yok. O yüzden genelde
nesne tabanlı çalışıyoruz.

_______________________________________________
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.