D Programlama Dili - Çözümler

Sözleşmeli Programlama

Birim testlerinin yazımına main'deki kodlar kopyalanarak başlanabilir. Aşağıdaki programa yalnızca ikinci takımın kazandığı durumun testi eklenmiş:

int puanEkle(int goller1, int goller2,
             ref int puan1, ref int puan2)
in {
    assert(goller1 >= 0);
    assert(goller2 >= 0);
    assert(puan1 >= 0);
    assert(puan2 >= 0);

} out (sonuç) {
    assert((sonuç >= 0) && (sonuç <= 2));

} do {
    int kazanan;

    if (goller1 > goller2) {
        puan1 += 3;
        kazanan = 1;

    } else if (goller1 < goller2) {
        puan2 += 3;
        kazanan = 2;

    } else {
        ++puan1;
        ++puan2;
        kazanan = 0;
    }

    return kazanan;
}

unittest {
    int birincininPuanı = 10;
    int ikincininPuanı = 7;
    int kazananTaraf;

    // Birinci takım kazanır
    kazananTaraf =
        puanEkle(3, 1, birincininPuanı, ikincininPuanı);
    assert(birincininPuanı == 13);
    assert(ikincininPuanı == 7);
    assert(kazananTaraf == 1);

    // Berabere
    kazananTaraf =
        puanEkle(2, 2, birincininPuanı, ikincininPuanı);
    assert(birincininPuanı == 14);
    assert(ikincininPuanı == 8);
    assert(kazananTaraf == 0);

    // İkinci takım kazanır
    kazananTaraf =
        puanEkle(0, 1, birincininPuanı, ikincininPuanı);
    assert(birincininPuanı == 14);
    assert(ikincininPuanı == 11);
    assert(kazananTaraf == 2);
}

void main() {
    // ...
}

Bu işlevde de sözleşme ifadelerinden yararlanılabilir:

int puanEkle(int goller1, int goller2,
             ref int puan1, ref int puan2)
in (goller1 >= 0)
in (goller2 >= 0)
in (puan1 >= 0)
in (puan2 >= 0)
out (sonuç; (sonuç >= 0) && (sonuç <= 2)) {
    // ...
}