Bu programlama tekniğine ne denir?


13

Bir röportajda çift programlama yaparken bu programlama tekniğiyle karşılaştım ve onun adını google'da bulamadım.

Buradaki fikir, önce değişkenleri kullanan ifadeyi ve daha sonra değişkenleri hesaplayan kodu yazmanızdır.

Burada bazı örnek kodlar kullanmak için:

private bool ValidPolicyNumber(string policyNumber) 
{
    var hasExpectedPrefix = policyNumber.Substring(0,5) == "POLIC";
    var followedBy7Digits = Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$");
    var hasLengthOf12 = policyNumber.Length == 12;

    return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;
}

Bahsettiğim tekniği kullanarak bu işlevi yazarken, önce son satırı return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;ve ardından ondan önceki 3 satırı yazardınız.

Bulabildiğim en yakın teknik "arzulu düşünme" dir ve bu SICP'den gelir, ancak daha sonra başlatacağınız değişkenleri kullanmak yerine daha sonra uygulayacağınız çağrı işlevleri ile ilgilidir.


8
Bunun sadece yukarıdan aşağıya bir tasarım biçimi olduğuna inanıyorum .
Vincent Savard

1
Bunun için belirli bir isim bilmiyorum, ancak karmaşık bir dizi koşulun kontrol edilmesi gerektiğinde bunu sık sık gördüm. Bu teknik karmaşık koşulları okumayı ve anlamayı çok daha kolay hale getirir.
FrustratedWithFormsDesigner

Bunu ben yaptım. İlk önce ayrıntıları terlemeden bir fikir çizmek için kodu kullanırsınız. Daha sonra IDE bir şeyin mevcut olmadığından şikayet eder, böylece siz onu var edebilirsiniz. Bitirene kadar başarısız olacak bir testiniz olduğunda yardımcı olur.
candied_orange

Bundan önce bir birim testi olsaydı, Test Odaklı Geliştirme olurdu. TDD kullanırken beklenen sonucumu biliyorum ve bu beklenen davranıştan geriye doğru çalışıyorum.
Martin Spamer

Ben buna "karmaşık koşulları akılcı şekilde yazmak" derdim.
Jimmy Breck-McKye

Yanıtlar:


13

Bu sadece fonksiyonel kompozisyonun bir varyasyonu .

Tanık:

private bool ValidPolicyNumber(string policyNumber) 
{
    return hasExpectedPrefix(policyNumber) 
        && followedBy7Digits(policyNumber) 
        && hasLengthOf12(policyNumber);
}

private bool hasExpectedPrefix(string policyNumber)
{
    return policyNumber.Substring(0,5) == "POLIC";
}

private bool followedBy7Digits
{
    return Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$");
}

private bool hasLengthOf12
{
    return policyNumber.Length == 12;
}

Tek gerçek fark, sürümünüzün daha küçük işlevlerin hesaplanan sonuçlarını tek bir işlevsel kapsamda birleştirmesidir; bu, daha küçük işlevsel ifadelerin başka bir yerde yeniden kullanılması amaçlanmadığı sürece istediğiniz şeydir.


9

Bu, Temiz Kod'dan (kitap), İşlevsel Ayrışma (Robert'in açıkladığı gibi) kendi başlarına tekrar kullanılamadığı için geçerli olmadığında kullanılacak bir öneri olabilir.

Bununla birlikte, bu konuda teknik bilgi almak istiyorsanız , Kent Beck'in Uygulama Desenleri kitabı bu tekniği Yerel Değişkenleri Açıklamak (benimki vurgu) olarak adlandırır:

Yerel değişken

Yerel değişkenlere yalnızca bildirim noktalarından kapsamlarının sonuna kadar erişilebilir. Bilginin mümkün olduğunca az yayılması gerektiği ilkesini izleyerek, yerel değişkenleri kullanılmadan hemen önce ve mümkün olan en geniş kapsamda beyan edin.

Yerel değişkenler için birkaç ortak rol vardır:

  • Toplayıcı: daha sonra kullanmak üzere bilgi toplayan bir değişkendir. Genellikle toplayıcıların içeriği bir işlevin değeri olarak döndürülür. Bir koleksiyoncu iade edildiğinde, sonuca veya sonuçlara bir ad verin.

  • Count: diğer bazı nesnelerin sayısını toplayan özel bir toplayıcı.

  • Açıklama: Karmaşık bir ifadeniz varsa, ifadenin bitlerini yerel değişkenlere atamak, okuyucuların karmaşıklıkta gezinmesine yardımcı olabilir:

    int top = ...;

    int sol = ...;

    int yükseklik = ...;

    int alt = ...;

    yeni Dikdörtgen döndür (üst, sol, yükseklik, genişlik);

    Hesaplamalı olarak gerekli olmasa da, yerel değişkenlerin açıklanması, aksi takdirde uzun ve karmaşık bir ifadenin ne olacağına yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.