Gömülü C – 9 : Gömülü C: Koşullamalar 2

Koşullamalar yazısında if-else yapıları ile ilgili söylenebilecek güzel bir takım şeyleri, lisan-ı münasiple konuşmuştuk. O yazı çok tutunca, devamını çekmek farz oldu.

Bu arada dostlar, yazılarımdaki temalarla ilgili yorumlarda insanların ağzından bal damlıyor. Bu vesileyle bu yazının teması bal oluyor 🙂

Malumunuz if-else yapısı, dertlere derman, kararsızlığa düşman. İşin şakası, verilecek bir kararı olan herkesi if-else kullanmaya davet etsek yeri midir diye düşünmüyor değilim. Bir karar verilecekse hiç düşünmeden if-else kullanırdım. Ama biraz düşünsem, her yerde if-else kullanmazdım 🙂 İşte bu yazının özü de bu olacak. Haydi bakalım, koşullamaları sıksak içinden ne çıkacak!

 

1. if-else Nedir, Nerelerde Kullanılır

Bir önceki yazımızda, if-else koşullamalarının nasıl kullanılması gerektiğine ve nasıl kullanılmaması gerektiğine haddince, hatta belki haddinden bir tutam fazla değindik. Şimdi tutup da, onca felsefi ve uhrevi bilginin ardından tekrar bu kadar temel sorularla karşınıza çıkınca, ben de garip hissetmiyor değilim. Haydi bakalım hayırlısı.

Sevgili okuyucu, if – else yapıları adı üzerinde eğer öyleyse şöyle yap, eğer böyleyse böyle yap türünde olan, dolayısıyla yapıyı anlamak için bütün koşul bloğunu anlamamızı, okumamızı gerektiren yapılardır. Bu yapıları okumak, sinemada film izlemeye benzer. Başı çok anlamsız olan bir film sonunda kendini övdürebilir, başta güzel giden film sonunda sövdürebilir, kimisiyse insana kendini dövdürebilir. Bir başka örnek ile anlatmak gerekirse, ileriden gelen uçan böceğin, afedersiniz eşek arısı mı bal arısı mı olduğu anlamak için yaklaşmasını beklemek zorunda kalmaya benzer bu süreç.  Ve her bir koşulun geleceği, her an başka bir koşul tarafından bertaraf edilebilir. Bu da çoğu zaman sirke tadı verir. Bu ibretlik tespiti, lütfen aklınızdan çıkarmayınız. if-else’de her bir koşulun kaderi, diğer koşullara çok çok bağlıdır.

Mesela asagıdaki kodda, 18 yasindan kucuk arac kullananlara ceza kesilmiş. Yani 18 yaş ve üzerini göndermiş polis amcalar.

Öyle ya, burası Türkiye. Bir torba yasa ile bu kanun değişti diyelim. 20 yaşından küçüklere stajer sürücülük süresi var. Bu süreçte de tek kullanmak yasaklandı. Yukarıdaki kodu yazan arkadaş ister istemez sabah gidip kodu güncelleyecek. Ne yazsa beğenirsin…

Adam kodu çiçek gibi yazmış, koşulunu araya eklemiş. Ama en alttaki else artık bizim bildiğimiz else değil. Biz çam balı diye aldık, reçel çıktı. Önceden else koşulu 18> yaşların tamamını desteklerken, bir gece uyuduk uyandık bir baktık ki, tek satırını değiştirmediğimiz else bloğu gitmiş yerine 20> yaş için geçerli else bloğu gelmiş. Tek satırını bile değiştirmediğiniz bir kod alanının, kimyasındaki bu değişiklik, hepimizi ziyadesiyle paranoyak eder artık kod yazarken 🙂

Aynı zamanda koşullar çok uzun olursa, yani; “öyle olursa şöyle yap ama öyle olmaz da böyle olursa, ya da şöyle olmazsa böyle yap” filan gibi bitmek bilmeyen, gelişimini çoktan tamamlamış, dünyanın en akıllı ırklarından olan bir insanın dahi beyninin tek hamlede saklamayacağı koşullamaları bu yapılarla tutmamakta fayda var. Zira her bir koşul, ister istemez diğerini etkiler ve koşul sayısı arttıkça halis bildiğimiz balın dibinde şeker tabakası birikmeye başlar. O bal da kaymakla bile tad vermez. Bu gibi nedenlerledir ki, uzun if-else blokları da çok can sıkar, çok can yakar muhteremler. Tıpkı kullanmasını bilmeden kullanmaya kalktığımız her şey gibi, bunun da sonu mutlak hüsran olur. Çözüm, gereksiz uzun if-else’leri traşlamaktan geçiyor. Aşırı uçları temizleyelim. Bunu yapmanın en iyi yolu, durum indirgemesi yapmak. Nasıl yapacağız, misal Karnaugh ile yapacağız. Durum indirgemelerini dostlar, lojik yazısnda aktarmıştım, tekrara düşmemek adına burada artık söz edip geçiyorum.

Ama if-else’in çok güzel bir yanı da vardır ki, bu yapı bize, aralık ölçeklemesi yapma şansı verir. Yani bu kovanda 100’den az arı varsa, ben bu bala çökerim önermesini, çok net if-else ile yapmak mümkündür hatta mübahtır.  Demek ki aralıklar ile bir ölçekleme yapacaksak, if-else kullanmakta faydalar varmış. Ehliyet kontrolü yapacağız diye tüm yaşları ayrı ayrı analiz etmedik misal.

Peki bu if’in onca zaafiyeti var biz napalım kullanmayalım mı bunu? Hayır efendim, nerede nasıl kullanacağımızı anladık. Çiçek balı gibi yapılar kurulabilir if-else ile. Ama unutmayın ki, tek bal çeşidi çiçek balı değildir. Pekala da çam balı da vardır!

2. switch-case Nedir, Nerelerde Kullanılır

İşte bizim çam balı: switch-case. Seç beğen al usulu hem de, tam isabet sevenlere. if-else için koşulların geleceği birbirine çok bağlı demiştik, bu amansız derdin dermanı switch case yapısı. Zira switch case’de her seferinde (aslında genelde), durumlardan biri çalıştırılır. Ve yine doğru kullanımda, koşullar yani durumlar birbirlerini etkilemez. Bu nedenledir ki, durum makinaları   switch case ile gerçeklenir. Öyleyse ibret yükleme moduna geçiyoruz: switch case nokta atışı için, if-else ise aralık ölçeklemesi için kullanıldığında çiçek olur. Bu vesiyleyse if kardeşimizin de iade-i itibarını yapmış bulunduk.

Şimdi switch case ile durum analizine bir örnek verelim.

Yukarıdaki yapı çiçek gibi bir durum makinesi olaraktan tariflenebilir. Gördüğünüz her bir case, bir ve yalnızca bir duruma karşılık düştüğünden, if’deki karmaşa burada asla yaşanmaz. Ayrıca enum ile switch-case’in bal kaymak misali bir uyumu vardır. İkisinde de araya birşeyler eklemeniz, diğerlerinin keyfini hiç mi hiç bozmaz. Bu söylediğimi, enum’u anlatacağım yazıda daha güzel aktarabileceğim çünkü bulmacanın parçaları bir araya gelmiş olacak.

Switch case uzun dahi olsa, her bir durum kendi içinde bir cumhuriyet olduğundan, okuması hiç zor olmaz. Ancak tabi ki unutmamak gerekir ki if’lerde olduğu gibi,  iç içe çok sayıda switch yapısı kullanmak, ortaçağda insanlara uygulanan işkence çeşitlerinden birisidir. Hak yolu varken bu yollara hiç gerek yok.

Peki bu koşullamalar sadece if-else ile mi yapılır? İşte şimdi karadenizin doruklarından deli balı huzurlarınıza geliyor!

3. Koşullamasız Durum Makinası

Basit bir durum makinası düşünelim. 4 tane durum olsun. Başlangıç durumumuz 1 yani 1. durum olsun. Sistemde her zaman durum akşışı şöyle olsun: 1->3, 3->2, 2->4, 4->1. Bunu nasıl modelleriz? Misal şöyle modelleriz:

Peki bu çam balı gib halis munis yapı, daha basit, daha sanatsal bir şekilde kurulamaz mı? Switch case’i ortadan nasıl kaldırırız? if else ile diyenleri duyar gibiyim ama bu başlığın ibreti ve vizyonu biraz daha büyük. Karabüyü ile harmanladığımız deli balı ile bu yapıyı gerçekleyelim.

Yukarıdaki kodu çalıştırdığınızda konsol çıktısı şöyle oluyor:

State1
State3
State2
State4
State1
State3
State2
State4
State1
State3

Yani, durum makinamız, durumları koşulları kullanmadan gerçeklenmiş oldu. Bu kodun hikmetini anlayanlar vardır anlamayanlar vardır. Anlamayan üzülmesin çünkü işaretçiler başlığında bunları da anlatacağım. Burada OOP’dan da polymorphism’i ucundan kulağından çarpmış olduk. Bir yapısal programlama dili ile çalışmamız bunu değiştiremedi 😉

Dilerim her üç balın da tadı hoşunuza gitmiştir. Bu balları yiyen şişman yemeyen pişman 😀

Arayı fazla açmadan yazılara devam etmeye çalışacağım.

Unutmadan; yazıları beğendiyseniz eğer,  faydalanabilecek arkadaşlarınızla da paylaşabilirseniz sevinirim.

Şimdi devam…

Önceki Sayfa   Sonraki Sayfa

 

 

8 thoughts on “Gömülü C – 9 : Gömülü C: Koşullamalar 2

      1. Has anyone discovered what MMMSSS.Pelosi done to get excommunicated from the Catholic Church? I think that I already know but need to confirm my suspicions before I say what I think.

  1. birol

    Merhaba Özen bey,
    yazılarınızı beyenerek okudum, bilgi ve tecrübelerinizi paylaştığınız için teşekkür ederim. Çok eğlenceli bir üslupla anlatmışsınız, çok önemli noktalara dikkat çekmişsiniz gerçekten. Durum makinaları ve event driven programming mevzularıyla alakalıda yazacağınız umuyorum. bu konularla alakalı tavsiye edebileceğiniz güzel kaynaklarda varsa sevinirim.

    1. Merhaba Birol bey,

      Öncelikle geri bildiriminiz için çok teşekkür ederim. Fayda üretebilme umudu her zaman için yazıların en büyük motivasyon kaynağı oldu.
      Durum makinaları ile ilgili önemli yöntemler (switch case ile durum modellemesi, durum tablosu yöntemi ve fonksiyon işaretçileri ile durum makinası örnekleri) bu yazıda anlatılıyor.
      Uygulamada, gömülü sistemler için durum makinaları ile ilgili yapılan implementasyonların bir çoğu, bu yazıdaki örnek tasarım kalıpları ile yapılmakta.

      Event driven programlama ise, gömülü sistemlerde 2 farklı yol ile yapılıyor. Bunlardan birincisi function pointer ve bu konu “İşaretçiler 2” başlıklı yazıda anlatılmakta: http://ozenozkaya.com/blog/?p=305
      Gömülü sistemlerde, event driven bir yapı da doğası itibariyle kesmeler ile yapılıyor. Kesmelere ilişkin örnekleri de “PIC Programlama” yazı dizisinde detaylı olarak bulabilirsiniz.

      Yine de eksiklik hissederseniz size “Making Embedded System” kitabını ve POSA (Pattern-Oriented Software Architecture) serisi mimari kitaplarını öneririm.

      Uygulama spesifik mimari tasarım kararları için ise dilediğiniz zaman fikir alışverişi yapabiliriz.

Leave a Reply to birol Cancel reply