Tam Sürümünü Görmek İçin : modüler kod yazmak?
selam
öncelikle modüler ile benim anladığım şeyi söyleyim yanlışsa düzeltin.
"parça parça gelişen ve gelişmeye açık"
bunu sağlayabilmek için ne yapmalıyız? bunu sormamın nedeni bir proje geliştiriyorum ve bazı dosyaların boyutu 1000 satırı geçti. bir ordan bir burdan bir sürü değişken takip edilemeyen boyutlara ulaştı. ayrıca bu yapı geliştirme hızımıda yavaşlatıyor.
Bu tip sorunlar icin nesne yonelimli programlama yapmak en iyi cozumlerden birisi. Ilgili nesne gruplarini bir dosyada/pakette toplayip nesne koleksiyonlari olusturabilirsin.
Nesnelerle calisan kodlar, nesnenin ic isleyisi ile ilgilenmeyecegi icin her degisikligin butun yapiyi degistirme ihtimali de oldukca azalir.
dionysos
16/07/2003, 12:26
Ben de nesneye yönelik programlama tekniğini tavsiye ederim ama duruma bakılırsa projende ilerlemişsin ve bu yöntemi kullanmıyorsan geri dönüş yok. Bunun yerine; projeni daha çok fonksiyona ve dosyaya (ve alt başlıklar olarak dizinlere) bölmeyi dene. MFC kütüphanesi gibi bir ağaç yapısı olarak fonksiyonların, dosyaların hiyerarşik yapısını çizip ve neyin nerde olduğunu yazabilirsin. Kolay gelsin.
bende zaten c++ kullanıyorum ve nesneye yönelimli programanın ne olduğunu damarlarına kadar çözdüm. fakat benim parçalama taktiğim .h ve implementasyonun bulunduğu .cpp nin pekde ötesine geçemedi. ve bir class a fazla yüklenmişim onun .cpp dosyası 1098 satır oldu. bundan da çok şikayetçiyim. geçen sene ekimin sonunda başlayan bu projedeki bazı değişkenleri ve özellikle fonksiyonların yaptıkları işleri unutmaya başladım. artık herhangi bir işlem yapacaksam o anda bulunduğum fonksiyonda gereken yeni değişkenleri tanımlıyorum ve işlemimi hallediyorum. tahmin edeceğiniz gibi proje kod salatası oldu. bunun olmaması için baştan veya geliştirirken ne yapmalıydım.
ha bu arada fonksiyonların ve değişkenlerin çoğu comment li. bu tip bir durumda performans nasıl artırılır?
o ortalıkta bulunan değişkenleri class ın içine taşısam bir değişiklik olurmu?
Nesneler, genelde performansi iyi degil, kotu yonde etkiler ama getirdiklerinin yaninda, bu goz ardi edilebilir.
fatihhood
17/07/2003, 12:02
Selam ile...
mascix...
Senin de bahsettiğin gibi bir süre sonra dallanıp/budaklanan kodlar insana zor anlar yaşatabiliyor. Üstelik dosya sayısı artıkça aynı fonksiyonları defalarca ( farklı class veya dosyalarda ) tekrarlayıp farkına bile varamadığın anlar oluyor.
Ben sanmıyorumki programlama diline aşikar birinin sorunu her zaman programlama dili üzerindeki yetersiz bilgisi olsun. Zira bir programlama dilinde herşeyi yapabilecek kadar bilgiye sahip insanların sorunu genelde her zaman hayalindeki bütünlüğü ve ergonomiği kuramamaktır. Daha doğrusu koruyamamaktır.
Ehh bunların farkında olunmasına karşın neden her seferinde, gittikçe karmaşıklaşan ve her seferinde mükemmel kod aşkıyla çıktığımız yolda "çıkmaz sokak" sendromuna giriliyor?
Bence bunun en büyük sorunu bu işin Türkiye de tam olarak öğretilememesi. Yani Programlamaya ilişkin mühendislik bilgisinin çoğu programcı tarafından önemsenmemesinden kaynaklanıyor.
Mesala Delphi den bahsedecek olursak... Şuan 6 aylık ticari bir proje işini bitirmek üzereyim. Yazdığım toplam kod satırı 20.000 satıra yaklaşmış durumda. ( Proje : Delphi/Mysql ile Merkez ve Şube yönetimi... )
Öncelikle bu işe ilk başladığımda tam olarak delphiye hakim değildim. Yalnız delphi de anladığım en önemli nokta... ne yaparsan yap öncelikle değişkenlerini ve fonksiyonlarını tanımla oldu.
Delphi deki procedure leri birer class olarak düşünürsek ( procedure ler genelde eventlerde kullanılır ) her class ın altında o classa ait değişkenler tanımlamak ve işlem sırasında bu değişkenlere atama/gönderme yapıp işlemin sonucunu ortaya koymak oldukça iyi neticeler vermekte.
Buraya kadar her şey normal. Yalnız bir süre sonra gelişen ve uzayan kodlarda çıkan buglar veya programa kazandırdığınız yeni özelliklerin eskiyle olan adaptasyonu için eski kodlara dönülmesi gerçekten zor iş.
Bu noktada zaten bir çok programcı programını geliştirmektense programı rafa kaldırmayı veya yeniden yazmayı tercih ediyor.
Bense 1 senedir denediğim bir metodu kullanıyorum. Özellikle php ve delphide oldukça işime yaradığını sölemek istiyorum.
Öncelikle projemdeki her bir işlevi ( işlem değil ) kafamda tasarlamaya çalışıyorum. hatta 6 ay sonra aklıma yeni bir şey geldiğinde onun için bazı açık kapılar bırakıyorum.
Ör :
Diyelimki bir forum ve bir ziyaretçi defterinden oluşan bir web sayfası yapacam.
İlk yapacağım işlem; işin tamamı ile bitene kadar bütün kodlarımı yazacağım bir büyük kütüphane dosyası hazırlıyorum. Bu dosya içerisinde iki tane class tanımlıyorum. ( bu örnekte 2 module olduğunu düşünerek. ) Bu class lar c_forum ve c_gbook adında.
Ardından bu class ın içindeki tüm fonksiyonların kullanacağı genel değişkenleri tanımlıyorum. ( Pathler, heryerde kullanabileceğim zaman değişkenleri gibi... )
Bu noktadan sonra fonksiyonlarımı yazmaya başlıyorum. Yalnız buradaki en önemli nokta fonksiyonlarında yeniliklere açık olması.
Örneğin forumda bir konuya ait hit, cevap, oylama vs. gibi bilgileri verebilecek bir fonkyisonu aşağıdaki gibi yapıyorum.
( Php de... )
class c_forum {
....
function konu_bilgisi($gelen_object) {
if($gelen_object->konu_id <= 0 ) {
return array(False, 'Hata : Hatalı konu id si.');
}
else if($gelen_object->tip == 1) {
//--- toplam hit
//--- hesaplamalar
$hit_sayisi = $hesaplamalar_sonucu;
//--- hesaplamalar son
//--- toplam hit son
return array(True, $hit_sayisi);
}
else if($gelen_object->tip == 2) {
//--- toplam cevap
//--- hesaplamalar
$cevap_sayisi = $hesaplamalar_sonucu;
//--- hesaplamalar son
//--- toplam cevap son
return array(True, $cevap_sayisi);
}
}
....
}
Yukarıdanda anlaşılacağı gibi fonksiyona gönderilen object istenildiği gibi esnetilebiliyor. Göndereceğim object 'nin tip i 1 ise hit sayısını, 2 ise cevap sayısını döndürüyor. Böylece daha sonradan o konuda ( daha doğrusu fonksiyonu çağırdığım noktada ) yeni bilgilere ulaşmam gerektiğinde object 'de yeni değişkenler yolluyorum.
Mesala cevap sayısını öğrenmem gerektiğinde object ile muhtemel 2 argüman yolluyorsam ( konu_id ve tip ) , anket sonuçlarını öğrenmek istediğimde 3 argüman yolluyorum. ( konu_id, tip ve anket_id )
Eğer konuya bağlı anketleri öğrenmek istediğimde fonksiyona sadece konu_id ve tip bilgisini yollayıp, fonksyion içerisinde o konua bağlı anketler üzerinde işlem yapsa idim ozaman fonksiyonum esnekliğini yitirmeye başlıyacaktı...
Zira anket sonuçları için öncelikle o konuya bağlı anketleri tespit edecek daha sonra snuçlarını döndürecektim. Oysa benim zaten ileride hazırlayacağım ve mutlaka kullanmam gereken ; konulara bağlı anketler fonksiyonum olacaktı. Zaten az önce bahsettiğim 3. argümanı bu fonksiyondan yolluyor olacaktım.
Klasik sistemde ise fonksiyonlar aşağıdaki gibidir.
function konu_bilgisi($konu_id) {
//---hesaplamalar
//---
//---hesaplamalar son
return array(True, $toplam_hit, $toplam_cevap); vs. vs.
}
Yukarıdaki fonksiyona yeni bir özellik ekleseydik mesala fonksiyona gönderilecek argümanlara ek yapmak istediğimizde fonksiyonun çağrıldığı her yerde bu değişikliği yapmamız gerekecekti. Tabi gözden kaçan çağrılmaları düşündüğümüzde mutlaka yeni buglar ortaya çıkacaktı.
Oysa ilk örnekte olduğu gibi fonksyiona bir object yollarsak fonksiyonumuz daha esnek ve moduler olur.
Örneklemenin en başında anlattığım gibi bütün kodlarımızı yazdığımız o " baba " dosyayı işimiz bittikten sonra ayırdığımız classlardan include dosyalara parçalamak işin en kolay tarafı olacaktır.
Aslında bu dosyayı parçalamaya bile gerek yok gibi geliyor bazen. Zira classlar yaratılmadan performansta bir düşüklüğe pek neden olmazlar. ( Özellikle otomatik garbage control konusunda iyi bir programlama diline sahip iseniz. )
Parçalamanın amacı aynı projede çalışan insanların eş zamanlı çalışmasını sağlamak gibi geliyor bana. Ha birde source kodlar içerisinde scroll 'un mini minnacık kalmasına sinir olan arkadaşlar var :)
Sonuç olarak Hakkı Abi 'nin bahsettiği bir şeyden söz etmek istiyorum. " Dünyadaki tüm programlama dilleri ile ekrana " Merhaba Dünya " yazdırabilirsiniz. Önemli olan Programcının, kullandığı dile yatkınlığıdır. "
Saygı ve Selam ile...
öncelikle yazdığınız açıklayıcı cevap için teşekkürler. fakat ben programımda bu yapıyı kullanıyorum hemde bir çok yerde. bende scroll boyutundan rahatsız olan insanlardanım. eğer bütün projeyi bir dosyaya toplasam hiç olmaz. benim öğrenmek istediğim c++ için bunun dışında değişik yöntemler mevcut mu?
Bütün programlama dilleri için geçerli olan teknik küçük modüller kullanmaktır. 50, 100, 200, 10.000 modül olabilir. Ama her modülün işlevi farklı, adı farklıdır. Nerede ne arayacağını bulmak birkaç saniyenizi alır.
ansugo biraz daha detaylı anlatabilir misin?
Bunda detaylandıracak birşey yok aslında. Ama şöyle açıklayayım.
Şu an Windows kullanıyorum. ActiveState'in PERL dağıtımının son sürümü kurulu. Modüllerin olduğu iki dizin var. Biri site/lib ve diğeri lib.
site/lib dizininde 14.7 MB yer kaplayan 1260 dosya, 200 klasör var.
lib dizininde 22.7 MB yer kaplayan 1321 dosya 138 klasör var.
Örneğin internetten bir dosyayı sadece get($url) diyerek bir stringe atamak istiyorum. Ufak bir araştırma yapıyorum ve LWP::Simple modülünün işime yarayacağını görüyorum.
LWP::Simple modülü nerede? Ya site/lib dizinin ya da lib dizinin içinde, LWP alt klasörünün içinde Simple.pm diye bir dosya da...
LWP::Simple'ı kullanacaksam sadece başta use LWP::Simple; diyorum ve istediğim metoduna, komutuna, fonksiyonuna erişiyorum.
Ve ben bu dosyanın nerede olduğunu da en fazla üç saniye de bulup, içinde neler olduğunu inceleyebiliyorum.
Haa, eğer bu LWP::Simple daha genel modülleri kullanıyorsa, örneğin HTTP::Request, HTTP::Response gibi, onu da LWP::Simple'ın muhtemelen başında görebiliyorum.
use olmazda, include, require falan olur. Sonuç değişmez.
Volkan Uzun
25/07/2003, 09:31
birde moduler programlama yapakren soınucları hemen ilk projelerde almayı beklemeyin lütfen.
diğer projelere gectikce, daha önce yazdığınız classları kullanmak size avantaj sağlayacaktır
birincisi zaten daha önce çalışan, test edilmiş kodları kullanacaksınız, bu size bakımda, hata ayıklamada ve uml diyagramlarında kolayklık sağlayacaktır
iknci olarak aynı işleri yapan durumlarda hız kazanacaksınız.
irde benim tavsiyem, bir class ı yazdıktan sonra, ileriki bir projede kullanacağınızda, o proje uyum sağlaması için class i düzenlemeyin. onun yerine ondan türeyen başka class yazınkı ilk yazdığınız hemen hemen hep aynı kalsın
fatihhood
29/07/2003, 11:58
Selam ile
mascix...
Benim demek istediğim tam olarak şu idi...
Eğer bu işler kolay olsa idi herkes " Yazılım Geliştirici " olabilirdi. ( Programcı değil! )
Bir yazılımı geliştirmek ile o yazılımda geleceğe yönelik işlev manupulasyonlari ( daha doğrusu işlevleri bildiğin/kullandığın halde ek açıklama/geliştirme yatkınlıkları ) arasında elbette farklılık olabilir. ( Örnek : Php yi yazanlar ile php yi kullananlar)
Hakkı Abi 'nin dediği gibi... " her şeyin kendi bir dinanizmi vardır. Bir şey araç olarak başlar ama belli bir amaca dönüşebilir. "
Örneğin basit bir animasyon yapmak isteyen kullanıcı c++ ın gücünü gördükten sonra oyun yazmaya eğilebilir. Bu durumda mevcut yazılımın yapısını kullanmak ( daha doğrusu kullanılabilirliği ) önem kazanır.
Benim demek istediğimde bu noktada zaten. Yani önceki yazımda verdiğim teknik konuların fazla bir önemi yok. Önemli olan mantığa/mantığına uyumu.
Ben sadece kendi yöntemimi anlattım. Senin bu duruma kullanılabilirlik açısından bakman bizi kısır bir döngüye sokacaktır.
Zira ikimizde problemin ne olduğunu biliyoruz. " Öngörülmeyen şeyler. "
Bu iki açıdan sorun yaratıyor genelde. Birincisi daha sonradan çıkabilecek problemler. İkincisi ve önemlisi ise geleceğe yönelik yapılan şeylerde rotanın değişmesi ile işlevlerin eksik veya çok gevşek kalması.
Anlıyacağın bence önce mantığın üzerinde durman daha faydalı olacaktır. Zira her programcının alışkanlıkları farklıdır. Bence önce geçmişte ilk yazdığın programlar ile şu sıralar yazdığın programlar arasındaki farkı gözetle. Ne yönde bir değişim göstermişsin. Belki faydası olur.
Bu arada sanal_programci classlar hakkında sölediğin şeylere katılmadığımı bilmeni isterim. Eğer çalıştığım şirkette her programda yeni classlar üretirsem ve diğer çalışanlarda bunu yaparsa, o zaman her projemiz 2 katı zamanda oluşur ve dolayısıyla şirket batabilir :) Kaldıki dediğin şey şuan hiç bir esaslı programda yapılmıyor. Bir çok programlama dili ve programda hatta işletim sistemlerinde stable mevcut class lar korunmakta. Windows 2000 ve hatta XP de bir cok dll in , php, delphi, c++ gibi programlama dillerindeki dosyaların tarihlerine bakarsan ne demek istediğimi anlıyacaksın.
Sonuç olarak " Usta terzi dar kumaştan bol gömlek diker. "
Volkan Uzun
29/07/2003, 16:47
selam fatihhood,
sanırım tam demek istediğmi anlatamadım.
örnek olarak başlangıçta bir tasit classi yazdınız ve bunu bir projede kullandınız. daha sonraki projede bunu tekrar kullanmak istedinizi ama tasitin bir özelliği yetmediği için gidip tasityin özelliğini değiştirmeyin. tam tersine burdan yeni sınıf türetin.
bu cok kullanılır .
hatta tecrübe artikca bu sınıfları abstract class olarak yazarsınız . oob nin temellerinden biridir buda.
selam fatihhood ve diğer arkadaşlar.
benim bu soruyu sorarken ki hedefimde diğer programcıların kod yazarken izledikleri mantık idi. veya bir yerlerde varsa şu şekil yöntemler vardır idi. bu nedenle senin verdiğin yönteme direk cevap verdim. sakın bir kısır döngü anlaşılamsın sadece paylaşalım. insanlar nasıl kod yazıyor ne gibi mantıklar izliyor bunu öğrenmek istedim. çünkü insanın ara sıra diğerlerini izleyip kendine çeki düzen vermesi lazım.
hele birde büyük projelerle uğraşılıyorsa bunu yapmak bence şart çünkü ben basit ve kısa kod yazmaya o kadar alıştımki işlere büyük pencereden bakamıyorum. bu durumdada sanki 2 sayıyı toplayacakmış gibi işe başlayıp 1000 satırla işin içinden çıkıyorum. işin kötü yanı o ki o 1000 satıra ulaştığımdada şu değişken şu döngü gereksizmiş deyip onları elemeye başlıyorum. işte beni çileden çıkaranda o nokta çünkü 1000 satır oluyor sana çoban salata.
diğer insanlarıda görim dedim acaba izlenen farklı bir yöntem varmı diye özellikle c++ da. teşekkürler.
fatihhood
04/08/2003, 17:12
" Usta terzi dar kumaştan bol gömlek diker... "
Biraz konu dışı olacak ama şuan delphi ile bir IDv3 Tag editor ve C/C++ ile bir araba yarışı yazıyorum.
Bu konularda bana yardımcı olabilecek arkadaşlar varmı?
- Tag Editor : Bu uygulamada sadece fikirsel desteklere ihtiyacım var. Mesala aklımdan geçenler.... MP3 ve divx gibi IDv3 destekleyen dosyaların içine resim ve şarkı sözerlinin vs. gömülmesi... CDDB veya kullanıcılar tarafından oluşturulmuş buyuk bir databaseden yararlanarak online dosya bilgilerini drag drop ile update leme. Toplu şekilde dosya isimlerini değiştirme gibi... Bunun haricinde tag editorunde şunlar şunlar olsun diyenler varmı?
- Araba Yarışı : Özellikle model çiziminde yardımcı olabilecek arkadaşlar. Şöle Doğan görünümlü Şahin falam yapabilecek, abart egsoz konusunda deneyimli usta pardon :) model çizimcisi arkadaşlar varmı?
Saygı ve Selam ile...
valla benimde başımda 2 tane proje var 2 side beter durumda. belki 1 ekimden sonra olabilir.
Real Zee
20/09/2005, 18:07
Merhaba,
Sizin kadar değil, forumda ki pek çok kişi kadar programcı bile sayılmam. En fazla fonksiyon kullanan php scriptler yazdım ve yapmayı isteyipte yapamadığım şeyler bunlarla olmadı. Ve nesnelerden yararlanmadığım ( daha doğrusu onları bilmediğim ) için tıpkı burada tartıştığınız gibi öngörü problemi yaşamıştım. Ben de biraz daha akademik kaynak karıştırayım diye üniversite hocalarının sitelerini gezerken bir hocanın türkçe yazılım mühendsiliği kitabı okuttuğunu gördüm. Kitap karmaşıklık formülleri vs.. de içeriyordu. Gerçi ben pek anlamadım ve farklı şekillerde sorunlarımı hallettim. Ama öngörü probleminize bu formüller kuramsal açıdan yaklaşıp size yardım edebilir kanaatindeyim. SAS yayınlarının kitabına bir bakın derim.
Programlamaya baslamadan once model hazirliyormusunuz?
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.