Yapısal Programlama
Siz; bilgisayarcılar arasına yeni yeni katılan yeni bilgisayar sahipleri. Siz; bunun gururunu, coşkusunu taşıyan ve sorumluluklarınızın bilincinde olan yeni gönüllüler. Bilgisayara “merhaba” dediniz ve belki de kullanım kılavuzundan veya derginiz Commodore'dan ilk programınızı yazdınız. Daha ilk adımda hata yapmamak ve ilk RUN'ınızda sevimsiz bir hata mesajı görmemek için, programınızı büyük bir dikkat ve özenle, en küçük ayrıntısını bile birkaç kez kontrol ederek yüklediniz.
Tüm bu çabalarınıza rağmen, eğer programınız on satırdan uzunsa, büyük bir olasılıkla ilk denemenizde çalışmayacaktır. Olacak şey değil, programınız yapabileceği tüm yanlışlıkları yapıyor ve siz bunun nedenini bir türlü bulamıyorsunuz. Programınıza bir daha -belki de 101. kez- göz attığınızda onu bir tabak spagettiden daha karışık buluyorsunuz. Açıkçası programı düzeltme şansınız o kadar zayıf ki, fişi çekip yeniden başlama fikri bir anda çok cazip hale geliyor. Bilgisayarın başına oturduğunuz o heyecan dolu, coşku dolu ilk günlere dönerseniz herhalde yukarıdaki tablonun size de pek yabancı olmadığını göreceksiniz. Pek çoğumuz yaşadık o umutsuzluk dolu saatleri ve belki de yeni bir kavram kattık dağarcığımıza;
errorofobi. Çözümü yok muydu, cevapsız mıydı bu sorun? Elbette var; çözüm de sorun kadar önemli üstelik; disiplinli programlama daha doğru bir ifade ile programlarınıza disipline edilmiş bir yaklaşımla eğilmenizdir. Bilgisayarınızın tuşuna bastığınız ilk andan itibaren bu tekniği kullanmaya ve geliştirmeye çalışmalısınız. Profesyonel software yazarları -yazılımcılar- yapısal programlama tekniklerini kullanırlar.
Yazılımcılar ilk olarak çözmek zorunda oldukları problemlerin -fonksiyonel blokların- çözüm yollarını bulurlar ve tüm bu çalışmalar yapıldıktan sonra, işin nispeten kolay yanı olan aşamaya gelinir. Bu aşamada, ortaya çıkan program planı bilgisayarın işleyeceği şekle sokulur. Yani program bilgisayar dillerinden birine çevrilir. Bir amatörden tüm bu çalışmaları yapmasını beklemek belki biraz fazladır. Bir de buna amatörün mütevazı sayılabilecek amaçlarını eklerseniz, isteklerimin bir amatör için insafsız sayılabilecek kararlar olduğunu düşünebilirsiniz. Çünkü amatör, programlamanın getireceği nimetlerle ilgilenmez, onun için biçimsel ve yöntemsel kazançlar anlamsız birer kavram olmaktan ileri gidemezler. Amatörün tek istediği, programının sonucunu mümkün olduğu kadar kısa sürede ekranda görmektir. Bununla birlikte eğer bu tür bir disiplini programlarınızda biraz olsa bile kullanırsanız, programlarınızın daha kolay yazılır hale geldiğini görecek ve hepsinden önemlisi yanlışlarınızı daha kolay düzelttiğinizi fark edeceksiniz. Programınız için çizilecek birkaç akış diyagramı, size programınızın bir sonraki adımda ne yapacağını görme olanağını verir. Böylece programınızın bölümler arası koordinasyonunu sağlama olanağınız olacaktır. Şimdi sıra programın gerçek anlamda yazımına geldi. Madem bir süre sonra BASIC kullanıyor olacaksınız en azından onunla başlayacaksınız, öyleyse iyi kurulmuş bir BASIC programında neler olması gerekiyor bir de buna bakalım. Öncelikle alt programları gözden geçirelim. Programınızda her biri akış diyagramınızdaki bir kutuya karşılık gelen alt programlardan bir dizi olmalıdır. Bunun sonucunda program parçalarınız küçük bloklar haline gelecek ve böylece tüm alt programı ekrana aynı anda listeleyebileceksiniz. Her alt program açıkça tanımlanmış bir fonksiyonu yerine getirmeli ve ana programdan bağımsız olarak test edilebilmelidir. Bu testi gerçekleştirmek için sonuçlarını bildiğiniz test değerlerini alt programa girin ve alt programı çalıştırın, eğer çıkan sonuçlar sizin kendi sonuçlarınızla aynı ise, alt program, bu kez farklı değerlerle, çalıştığında çıkacak sonuçların kesinlikle doğru olacağından şüpheniz olmasın. Basit bir örnek ele alalım. Farz edin programınızda bir dairenin alanının hesaplanması gerekiyor. Bunu hesaplayacak alt program aşağıdakine benzer bir rutin olacaktır.
998 REM R YARIÇAPLI
99 REM DAİRENİN HESABI
1000 A — 77 xRxR
1010 RETURN
Bu rutin oldukça basit olmasına rağmen değindiğim prensibi gerçekleştirir niteliktedir. Çünkü rutin sadece bir işlevi yerine getiriyor ve kolayca test edilme olanağı var. Aşağıdaki satırı yazıp RETURN ederseniz, sonucun 28.274 veya buna yakın bir
R—3: GOSUB 1000:PRİNT A
sayı olduğunu göreceksiniz. Bu rutin, her ne kadar, görevini yukarıda saydığım prensiplere göre eksiksiz yapıyorsa da, mükemmel bir alt program sayılmaz. Çünkü bu işlemi bir kez yaptıktan sonra kullandığınız modülü (satır) unutabilirsiniz. Ayrıca; gerçi biraz ayrıntı sayılsa da, programınızda R değerinin belirli bir sınır içinde olup olmadığını kontrol eden daha derin bir detay olabilirdi. Bu yöntemle eğer R belirlenen sınır içinde değilse uygun bir hata mesajı basılabilir, böylece programın ana kısmı bir hata yapıldığından haberdar olabilirdi. Öyleyse daha düzgün, daha kullanışlı bir alt programın nasıl düzenlenmesi gerekiyor? Öncelikli programın doğrusal akışını korumanız gerekiyor. Mademki alt programın çağrıldığı satıra geri dönmesi için RETURN komutunu kullanmak zorundasınız, o zaman kontrol de düzgün bir şekilde ilk satırdan son satıra kadar akmalıdır. Bir alt programdan programın başka bir bölümüne hiçbir atlama olmamalıdır. Ancak bu genellemeye bir başka alt program girmez; yani alt-
programlar arası yolculuk serbesttir. Ayrıca bir alt programı tamamladığınızda, alt programda “gevşek son” olmaması gerekir. Gevşek son deyimi tamamlanmamış FOR-NEXT döngüleri için kullanılır. Bu basit kurallara uyulduğu takdirde, bir hata durumunda alt program ana programdan kolayca sökülebilir. BASIC çoğunlukla bilgisayarcıların ilk göz ağrısıdır. Ancak bu özel konumuna rağmen, disiplinli bir programlama tekniğinin geliştirilmesi için kullanılabilecek en iyi dil olduğunu söylemek zordur. Çünkü pek çok şeyi geçiştirmenize izin verir; FOR-NEXT döngüleri buna iyi bir örnektir. Bu döngüler genellikle programcı için bir sorun kaynağı olurlar. Örneğin alttaki rutin insana oldukça makul gözüküyor.
100 FOR TO 100
110 GET TB$
120 IF TB$ *” THEN 350
130 NEXT İ
Bu basit bir “reaksiyon testi” rutinidir. Oyuncuya herhangi bir tuşa basması için belirli bir süre tanır. Eğer oyuncu bir tuşa basarsa program hangi tuşa basıldığını bulmak için başka bir satıra atlar (350), eğer basılmazsa program alt programda devam eder -daha doğrusu döner de döner-. Hem alt program, hem de açıklaması makul gibi gözükse de, bir tuşa basmakla FOR-NEXT döngüsünden çıkmış oluyorsunuz, yani ikinci kuralımızı -gevşek son- ihlal ediyorsunuz. Bu alt programın işlevini bir REPEAT-UNTIL komutu ile çok daha iyi bir şekilde gerçekleştirebilirsiniz. Eğer bu komut BASIC komutlarımız arasında yoksa ve maalesef yok, yukarıdaki fonksiyonu aşağıdaki rutin ile yapmak zorunda kalacaksınız.
99 REM TUŞA BASILDI MI?
100 FOR I-TO 100
10 GET TB$
20 IF TB£
100:TB- 1
130 NEXT I
40 IF TB-1 THEN GOSUB
1000:REM TUŞA BASIM
ALTPROGRAMI
50 RETURN
(OLAR THEN I-
Satır 120'de I limit değerine (100) ayarlanıyor. I 100'e eriştiğinde bilgisayar TB'nin değerine bakarak döngüden çıkıyor ve o anda, bir tuşa basılıp basılmadığını görmek için TB'yi test ediyor. Eğer TB 1 ise bilgisayar tuşabasım alt programına atlıyor. Tabii bu rutinin her kullanımından önce TB değerinin 0'lanması gerekiyor. Bu örneğimizde tuşa basıldığında döngünün açık kalmaması için satır 120'de limit değerine ayarlandığını görüyoruz. Bu durumda rutinimiz bu kez ikinci kuralı ihlal etmekten kurtuluyor. Yapısal programlama tekniği demek sadece alt program yazmak değildir. Bu nedenle biraz da esas programımıza göz atalım. Esas program, yazdığınız tüm programın başında başlamalı, sonuna gitmeli ve orada bitmelidir. Kontrol ilk satırdan itibaren akmaya başlamalı ve sanki gidiyormuşçasına alt programları çağırarak, END komutunda sona ermelidir. Son olarak GO TO komutundan bir beladan sakınıyormuşçasına kaçınmanızı tavsiye ediyorum. Üst paragrafta söz edilen ve öğütlenen düzenlemenin ancak katı ve tekdüze bir program için geçerli olacağını düşünebilirsiniz. Öyle ya eğer programın akış yönünü değiştiremiyorsak, programa nasıl farklı işler yaptıracağız? Sorun ne kadar ciddi ise cevabı da o kadar basittir: Ana rutininiz alt programları duruma göre çağıracaktır. Yani farklı sonuç farklı alt programın çağırılması demektir. Yukarıda verdiğim tuşabasım örneğinde bu prensibin işleyişini kolaylıkla görebilirsiniz. Alt programların güzelliği istenildiği kadar uzun yazılabilmelerinden kaynaklanır. Alt programlar, her zaman için, kontrolden geçtikten sonra, kontrolü çağırılmış oldukları noktaya -satıra- geri gönderirler. Böylece programın doğrusal akışı korunmuş olur. En doğrusu tüm alt programların asıl programın arkasına, bir END komutu ile ayrılarak, yerleştirilmesidir. Bununla beraber, eminim siz de farkındasınız, BASIC derleyiciler satırları yukarıdan aşağıya doğru tararlar. Bu nedenle eğer programınızda hız önemli bir faktörse, en çok çağırılan alt programınız programınızın başlangıcında olmalıdır. Daha doğru bir yaklaşımla programınızın ilk satırında en çok çağırılan alt programınıza atlayacak ve ana programın işleyişini başlatacak olan bir GO TO komutu olmalıdır. Bu düzenleme pek sevimli olmasa da oldukça yararlı ve etkilidir. İyi programlama tekniği hakkında söylenebilecek daha pek çok şey var, bu makale bu tekniğin önemli odaklarından sadece biri olan ve programcıya programın akışını takip edebilme olanağını veren, disipline edilmiş yaklaşım tekniği üzerine kurulmuştur. Çünkü programcının, programı çalıştırdığında, programın kullanacağı yolu seçmiş olması ileriki adımlarda hayati önem taşır. Bu makalede yeterince vurgulanmayan tek bir nokta kaldı o da: Programlama tekniğinin öğrenilme ve geliştirilmesinin göründüğü kadar zor olmadığı, ancak bir makale okumakla da başarılamayacağıdır. Eğer koyduğum kurallara uymaz; canınızın istediği yerden sıçrar, gevşek sonları dikkate almaz, GO TO'larla istediğiniz gibi oynarsanız eninde sonunda çuvallarsınız. Programlarınız zamanla gelişecek ve daha karmaşık bir hal olacaktır; o zaman sözünü ettiğim bu problemler de gittikçe çözümü daha zor hale gelecektir. Bunun yanında programınızı büyütmek için yeni satırlar girmek istediğinizde, klavye başında güç saatler geçirebileceğinizi de unutmayın çünkü -eğer yarım saattir okuduğunuz tekniği kullanmazsanız- en fazla bir hafta sonra programınızda kullandığınız mantık zincirini unutabilirsiniz.
Bir süre sonra BASIC size dar gelmeye başlayacak ve büyük bir ihtimalle makine diline yöneleceksiniz. Orada karşılaşacağınız problemlerin BASIC'tekilerden tek farkı: çözümlerinin daha zor ve uzun oluşudur. Bu nedenle makine dilini de kullanırken BASIC'teki temel prensiplere başvurmanız gerekecek ve tabii iyi bir program için iyi bir program tekniğine (hangisine acaba?). Sonuç olarak; programlama düzeyiniz ne olursa olsun yapısal programlama tekniğini öğrenmeniz, geliştirmeniz ve basit, karmaşık demeden her programınızda kullanmanız gerekiyor. Bu yaklaşım, eğer iyi bir programcı olmak istiyorsanız, hem sizin hem de programlarınızın vazgeçilmez ögesi olmalıdır. Unutmayın; yanlış hesap Bağdat'tan döner örneği; temelsiz, akış diyagramsız, plansız bir program da ALU'dan (Aritmetik-Mantık Ünitesi) döner. ©