İçeriğe geç
academia.sh

Ders 15 / 18

Yapısal Programlama

Sıra, seçim ve yineleme ile program kurma; atlama deyiminin terk edilmesi ve yukarıdan aşağı ayrıştırma.

İçindekiler

Bu kurs boyunca kullanılan yapılar — sıralı deyimler, koşullu dallanma, döngüler ve fonksiyonlar — belirli bir düzenleme anlayışının parçasıdır. Bu anlayışın adı yapısal programlamadır ve bugün doğal görünmesi, tartışmasız kabul edildiği anlamına gelmez; bir tartışmanın sonucudur.

Bu konu üç düzenleme yaklaşımını karşılaştırır. Her yaklaşım, “bir programı hangi birimlere böleriz ve bu birimler nasıl konuşur” sorusuna farklı yanıt verir. Üçü de aynı problemi çözebilir; farkları, büyüyen programlarda ortaya çıkar.

Üç Yapı Yeterlidir

Yapısal programlamanın çekirdek iddiası şudur: her hesaplanabilir program, yalnızca üç denetim yapısı kullanılarak yazılabilir.

  • Sıra: Deyimlerin arka arkaya yürütülmesi.
  • Seçim: Koşula göre iki yoldan birinin izlenmesi.
  • Yineleme: Bir bloğun koşula bağlı olarak tekrarlanması.

Bu üçünün yeterli olduğu, biçimsel olarak kanıtlanmış bir sonuçtur. Pratik anlamı, dördüncü bir yapıya — özellikle programın herhangi bir noktasına atlayan bir deyime — ihtiyaç olmadığıdır.

Atlama Deyiminin Sorunu

Erken diller, programın istenen satırına doğrudan atlamayı sağlayan bir deyim içeriyordu. Donanım düzeyinde bu doğaldır: önceki kursta görüldüğü gibi dallanma komutu, program sayacına yeni bir adres yazmaktan ibarettir.

Sorun, okunabilirlikte ortaya çıkar. Serbest atlamalarla yazılmış bir programda, herhangi bir satıra hangi yollardan gelinebileceği metne bakılarak anlaşılamaz. Bir değişkenin o noktadaki değeri hakkında akıl yürütmek için, oraya varan tüm yolların incelenmesi gerekir. Yol sayısı, atlama sayısıyla birlikte hızla artar.

Yapısal denetim yapıları bu sorunu tanım gereği çözer: her yapının tek bir girişi ve tek bir çıkışı vardır. Bir bloğun içine yalnızca başından girilir, dışına yalnızca sonundan çıkılır. Bu kısıt, bir bloğun ne yaptığını bloğun kendisine bakarak anlamayı mümkün kılar.

Erken çıkış deyimleri — döngüden çıkma, fonksiyondan erken dönme — bu kısıtın denetimli gevşetilmesidir. Serbest atlamadan farkları, hedeflerinin sabit ve yapısal olmasıdır: çıkış her zaman içinde bulunulan yapının sonuna gider.

Yukarıdan Aşağı Ayrıştırma

Yapısal programlamanın ikinci bileşeni, problemin adım adım bölünmesidir. Süreç tepeden başlar: program, birkaç üst düzey adıma bölünür; her adım, kendi alt adımlarına bölünür; bölme, her parça doğrudan yazılabilecek kadar küçüldüğünde durur.

Sözde kod dersindeki ayrıştırma tam olarak bu yöntemdir. Ortak problem için:

özetle(ölçümler)
├── doğrula(ölçümler)        → boş mu, geçerli mi
├── topla(ölçümler)          → toplam
├── en_büyüğü_bul(ölçümler)  → en büyük
└── ortalama(toplam, sayı)   → ortalama

Her düğüm bir yordama karşılık gelir. Üst düzey yordam, alt düzeydekilerin ne yaptığını bilir; nasıl yaptıklarını bilmez. Bu bilgi saklama, değişikliğin yayılmasını sınırlar: en_büyüğü_bul yordamının içi değiştiğinde, çağıranı etkilenmez.

Ortak Problemin Yapısal Çözümü

def dogrula(olcumler: list[int]) -> None:
    """Ölçüm listesinin işlenebilir olduğunu denetler."""
    if not olcumler:
        raise ValueError("ölçüm listesi boş")


def topla(olcumler: list[int]) -> int:
    toplam = 0
    for olcum in olcumler:
        toplam += olcum
    return toplam


def en_buyugu_bul(olcumler: list[int]) -> int:
    en_buyuk = olcumler[0]
    for olcum in olcumler:
        if olcum > en_buyuk:
            en_buyuk = olcum
    return en_buyuk


def ozetle(olcumler: list[int]) -> tuple[float, int]:
    """Ortalama ve en büyük değeri döndürür."""
    dogrula(olcumler)
    return topla(olcumler) / len(olcumler), en_buyugu_bul(olcumler)


print(ozetle([12, 18, 7, 25, 14]))     # (15.2, 25)

Çözümün yapısı ayrıştırma ağacıyla birebir örtüşür. Her yordam tek bir iş yapar, kendi başına sınanabilir ve adı ne yaptığını söyler.

Yordamları Gruplamak

Ayrıştırma sürdükçe yordam sayısı artar ve düz bir liste hâline gelir. İkinci bir düzenleme katmanı gerekir: birbiriyle ilgili yordamlar aynı modülde toplanır.

Modül, kapsam dersinde tanımlanan ad alanının pratik karşılığıdır. Ölçüm verisiyle çalışan yordamlar bir modülde, raporlama yordamları başka bir modülde durur. Modül sınırı iki iş yapar: adları ayırır ve hangi yordamların birlikte değişeceğini belgeler.

Modülün de bir arayüzü vardır. Dışarıya açılan yordamlar ile yalnızca içeride kullanılan yardımcılar ayrılır; bu ayrım, önceki kursun bağlama dersindeki iç ve dış görünürlük kavramının aynısıdır. Dışarıya az sayıda yordam açmak, modülün içini değiştirmeyi kolaylaştırır.

Bu düzenleme, yapısal programlamanın büyük programlarda uygulanabilir kalmasını sağlayan şeydir: program, yordamlar hiyerarşisi olarak değil, modüller arası ilişki olarak okunur hâle gelir. Aynı fikrin ölçeklenmiş biçimi — bileşenler ve katmanlar — yazılım mimarisi müfredatının konusudur.

Veri ile Yordamın Ayrı Durması

Bu yaklaşımın ayırt edici özelliği, verinin ve onu işleyen yordamların ayrı tanımlanmasıdır. olcumler listesi bir veri yapısıdır; topla, en_buyugu_bul ise onun üzerinde çalışan bağımsız yordamlardır. Veri, yordamlara argüman olarak dolaşır.

Küçük programlarda bu düzen açıktır ve fazladan kavram gerektirmez. Program büyüdükçe iki zorluk belirir.

Birincisi, bir veri yapısının hangi yordamlarla kullanılabileceği kodun hiçbir yerinde yazılı değildir; ilişki yalnızca geleneğe dayanır. Aynı listeyi yanlış bir yordama vermek, dilin engellemediği bir hatadır.

İkincisi, veri yapısının kuralları — değişmezleri — dağınık biçimde korunur. “Ölçüm listesi boş olamaz” kuralı, listeyi kullanan her yordamda yeniden denetlenmek zorundadır; biri unuttuğunda kural sessizce çiğnenir.

Bu iki zorluk, sonraki dersin çıkış noktasıdır: veri ile onu işleyen davranışı tek bir birimde toplama fikri.

Sınanabilirlik Kazancı

Ayrıştırmanın az konuşulan ama belirleyici bir sonucu, sınanabilirliktir. Tek bir uzun yordam ancak baştan sona çalıştırılarak denenebilir; bölünmüş yordamların her biri bağımsız olarak sınanır.

Yukarıdaki çözümde en_buyugu_bul yordamı, dosya okumadan, ekrana yazmadan ve başka hiçbir adıma bağlı olmadan denenebilir: bir liste verilir, dönen değer beklenenle karşılaştırılır. Kenar durumlar — tek elemanlı liste, tümü eşit değerler — aynı kolaylıkla denenir.

Bu kazanç, yordamların saf olmasıyla artar: girdisi dışında bir şeye bakmayan ve dışarıda iz bırakmayan yordamın sınanması, hazırlık gerektirmez. Aynı gözlem bu konunun üçüncü dersinde bir paradigmanın çekirdek fikrine dönüşecektir.

Yapısal Programlama Nerede Durur

Yapısal programlama, sonraki paradigmalar tarafından geçersizleştirilmedi; onların üzerine kurulduğu zemin oldu. Nesneye dayalı bir sınıfın yöntemi de, fonksiyonel bir dilin fonksiyonu da içeride sıra, seçim ve yinelemeyle yazılır.

Bu nedenle “hangi paradigma” sorusu, denetim yapıları düzeyinde değil, program hangi birimlere bölünür düzeyinde sorulur. Yapısal yanıt, yordamdır.

Özet

  • Yapısal programlama, her programın sıra, seçim ve yineleme ile yazılabileceğini savunur; bu üçü yeterlidir.
  • Serbest atlama deyimi, bir noktaya hangi yollardan gelindiğini izlenemez kılar; yapısal denetim yapılarının tek girişi ve tek çıkışı vardır.
  • Erken çıkış deyimleri, hedefi sabit olduğu için bu kısıtın denetimli gevşetilmesidir.
  • Yukarıdan aşağı ayrıştırma, problemi yordamlara böler; üst düzey yordam alt düzeyin ne yaptığını bilir, nasıl yaptığını bilmez.
  • Veri ile yordamların ayrı durması küçük programlarda sade, büyük programlarda ise ilişkinin ve değişmezlerin korunmasını zorlaştıran bir düzendir.
  • Bölünmüş yordamlar bağımsız sınanabilir; ilgili yordamlar modüllerde gruplanarak ad ayrımı ve değişim sınırı kurulur.

Sonraki Adım

Veri ile onu işleyen yordamları aynı birimde toplamak, bu dersin sonunda beliren iki zorluğa doğrudan yanıt verir. Sonraki ders, nesneye dayalı yaklaşımın temel kavramlarını tanıtacak ve aynı problemi bu kez bir nesne üzerinden çözecek.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat