Apa nama teknik pemrograman ini?


13

Saya menemukan teknik pemrograman ini saat melakukan pemrograman berpasangan dalam sebuah wawancara dan tidak dapat menemukan namanya di google.

Idenya adalah Anda pertama-tama menulis ekspresi yang menggunakan variabel dan kemudian Anda menulis kode yang menghitung variabel di kemudian hari.

Untuk menggunakan beberapa kode contoh di sini:

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;
}

Saat menulis fungsi ini menggunakan teknik yang saya sebutkan, Anda pertama-tama akan menulis baris terakhir return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;dan kemudian menulis 3 baris yang mendahuluinya.

Teknik terdekat yang bisa saya temukan adalah "angan-angan" dan itu dari SICP tapi itu berkaitan dengan fungsi panggilan yang akan Anda implementasikan nanti daripada menggunakan variabel yang akan Anda inisialisasi nanti.


8
Saya percaya ini hanya bentuk desain top-down .
Vincent Savard

1
Saya tidak tahu nama spesifik untuk itu, tetapi saya sudah sering melihat ini ketika satu set kondisi yang kompleks perlu diperiksa. Teknik ini membuatnya lebih mudah untuk membaca dan memahami kondisi yang rumit.
FrustratedWithFormsDesigner

Saya sudah melakukan ini. Anda menggunakan kode untuk membuat sketsa ide tanpa berkeringat detail pada awalnya. Setelah itu IDE mengeluh bahwa ada sesuatu yang tidak ada sehingga Anda membuatnya ada. Ini membantu ketika Anda memiliki tes yang akan gagal sampai Anda menyelesaikan sampai selesai.
candied_orange

Jika ini didahului oleh unit test maka itu akan menjadi Test Driven Development. Saat menggunakan TDD saya tahu hasil yang saya harapkan dan saya bekerja mundur dari perilaku yang diharapkan.
Martin Spamer

Saya akan menyebutnya "menulis kondisi kompleks dengan sehat".
Jimmy Breck-McKye

Jawaban:


13

Itu hanya variasi pada komposisi fungsional.

Saksi:

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;
}

Satu-satunya perbedaan nyata adalah bahwa versi Anda menggabungkan hasil yang dihitung dari fungsi yang lebih kecil ke dalam cakupan fungsional tunggal, yang adalah apa yang Anda inginkan kecuali ekspresi fungsional yang lebih kecil dimaksudkan untuk digunakan kembali di tempat lain.


9

Ini bisa saja saran dari Clean Code (buku), untuk digunakan ketika Dekomposisi Fungsional (seperti yang dijelaskan Robert) tidak berlaku karena fungsi yang dihasilkan tidak dapat digunakan kembali sendiri.

Namun, jika Anda ingin mendapatkan teknis tentang hal itu, buku Pola Implementasi , oleh Kent Beck, menamai teknik ini sebagai Menjelaskan Variabel Lokal (penekanan tambang):

Variabel Lokal

Variabel lokal hanya dapat diakses dari titik deklarasi hingga akhir ruang lingkupnya. Mengikuti prinsip bahwa informasi harus menyebar sesedikit mungkin, deklarasikan variabel lokal sesaat sebelum mereka digunakan dan dalam ruang lingkup yang paling dalam.

Ada beberapa peran umum untuk variabel lokal:

  • Kolektor: variabel yang mengumpulkan informasi untuk digunakan nanti. Seringkali isi kolektor dikembalikan sebagai nilai fungsi. Ketika seorang kolektor akan dikembalikan, beri nama itu hasil atau hasil.

  • Count: seorang kolektor khusus yang mengumpulkan jumlah beberapa objek lain.

  • Menjelaskan: jika Anda memiliki ekspresi yang rumit, menetapkan bit ekspresi ke variabel lokal dapat membantu pembaca menavigasi kompleksitas:

    int top = ...;

    int left = ...;

    int tinggi = ...;

    int bottom = ...;

    mengembalikan Rectangle baru (atas, kiri, tinggi, lebar);

    Meskipun tidak diperlukan secara komputasi, variabel-variabel lokal yang menjelaskan membantu apa yang seharusnya menjadi ekspresi yang panjang dan rumit.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.