Membuat perangkat lunak

Seringkali beberapa algoritma atau implementasi dapat menyelesaikan tugas yang sama dengan benar. Kode yang Anda pilih mengomunikasikan desain. Pengembang dan agen pengodean yang membaca kode Anda menggunakan strukturnya untuk menyimpulkan niat Anda: apa yang dibutuhkan setiap operasi, tempatnya berada, dan kapan ia berjalan.

Tip

Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang mengetahui ekspresi, pernyataan, dan metode C# dasar. Jika Anda baru menggunakan pemrograman, mulailah dengan tutorial Memulai terlebih dahulu.

Bagian ini membandingkan pendekatan yang valid untuk algoritma dan menjelaskan perbedaan halus dalam perilakunya dan bagaimana pembaca menafsirkannya. Anda akan menggabungkan elemen bahasa yang familier, seperti jenis, ekspresi, pernyataan, dan metode, dan memilih bentuk yang mengomunikasikan desain yang Anda inginkan.

Perbandingan perilaku dan tujuan desain

Sebelum memilih implementasi, pertimbangkan bagaimana kode lain akan menggunakannya. Kode tersebut adalah pemanggil: ia menyediakan input, memanggil operasi Anda, dan menggunakan hasilnya. Apakah memerlukan hasil lengkap segera, atau dapat memproses nilai satu per satu? Apakah helper hanya bagian dari operasi ini saja, atau apakah operasi lain juga akan menggunakannya? Pertanyaan-pertanyaan ini membantu Anda membandingkan perilaku yang Anda butuhkan dan desain yang ditunjukkan oleh kode Anda.

Operasi sebaris singkat menunjukkan kepada pembaca langkah-langkah di titik penggunaan. Misalnya, Where(task => task.Priority > 3) membuat aturan pemfilteran segera terlihat. Helper bernama, seperti dalam Where(IsUrgent), menekankan tujuan aturan dan memungkinkan pembaca memeriksa detailnya secara terpisah. Pilih berdasarkan apakah langkah-langkah atau tujuannya paling baik menjelaskan kode di sekitarnya.

Tempat Anda mendeklarasikan helper menunjukkan cakupan yang dimaksud. Fungsi lokal di dalam ShowDashboard menunjukkan bahwa helper termasuk dalam operasi tersebut dan mencegah anggota lain memanggilnya. Metode privat pada tipe yang menaungi membuat metode bantu tersedia untuk anggota lain, menyarankan agar Anda mengharapkan penggunaan kembali di tempat lain dalam tipe tersebut. Keduanya dapat menyusun perhitungan yang sama, tetapi keduanya mengarahkan pembaca pada ekspektasi yang berbeda tentang perannya.

Cara Anda menyediakan input pembantu mengomunikasikan dependensinya. Meneruskan batas sebagai parameter, seperti IsUrgent(task, minimumPriority), membuat input tersebut terlihat di setiap panggilan. Fungsi lokal atau lambda dapat captureminimumPriority, menggunakan variabel dari cakupan sekitarnya tanpa menerimanya sebagai argumen. Capture menghubungkan pembantu ke konteks operasi induk; parameter eksplisit membuat data yang disediakan lebih mudah diidentifikasi. static Gunakan fungsi lokal atau lambda saat Anda ingin memastikan bahwa fungsi tersebut tidak menangkap state di sekitarnya.

Cara Anda mengembalikan hasil menunjukkan kapan pekerjaan berlangsung. Metode yang membangun dan mengembalikan koleksi menyelesaikan pekerjaan tersebut sebelum pemanggil menerima koleksi. Iterator menghasilkan elemen saat pemanggil memintanya, sehingga pemanggil dapat berhenti sebelum semua elemen diproduksi. Keduanya mungkin menghasilkan nilai yang sama, tetapi pemanggil perlu memahami apakah mereka menerima hasil yang telah selesai dihitung atau urutan yang komputasinya masih berada di depan.

Untuk setiap pilihan, pertama-tama identifikasi perilaku yang dibutuhkan kode yang memanggil. Kemudian pertimbangkan apa yang akan disimpulkan pengembang atau agen pengkodian lain dari nama, cakupan, input, dan hasilnya. Pilih bentuk yang membuat harapan tersebut sesuai dengan desain Anda, dan jelaskan perilaku penting yang tidak diungkapkan oleh bentuk kode saja. Tujuannya adalah untuk membuat pilihan yang disengaja antara alternatif yang valid, bukan menerapkan satu bentuk di mana-mana.

Baca pilihan desain dalam contoh

Contoh berikut menggambarkan bagaimana beberapa pilihan mengomunikasikan berbagai bagian desain. Ini menampilkan tugas yang mendesak dan siap untuk dimulai. ProjectTask berisi judul tugas, prioritas, dan status pemblokiran tugas.

var tasks = new[]
{
    new ProjectTask("Confirm venue", Priority: 3, IsBlocked: false),
    new ProjectTask("Print badges", Priority: 2, IsBlocked: true),
    new ProjectTask("Test microphones", Priority: 2, IsBlocked: false),
};

ShowDashboard("Community meetup", tasks, minimumPriority: 2);

static void ShowDashboard(
    string projectName,
    IEnumerable<ProjectTask> tasks,
    int minimumPriority)
{
    var urgentTasks = tasks.Where(
        task => task.Priority >= minimumPriority);

    foreach (ProjectTask task in ReadyTasks(urgentTasks))
    {
        Console.WriteLine(FormatTask(task));
    }

    string FormatTask(ProjectTask task) =>
        $"{projectName}: {task.Title}";
}

static IEnumerable<ProjectTask> ReadyTasks(
    IEnumerable<ProjectTask> tasks)
{
    foreach (ProjectTask task in tasks)
    {
        if (!task.IsBlocked)
        {
            yield return task;
        }
    }
}

record ProjectTask(string Title, int Priority, bool IsBlocked);

Setiap pilihan menjaga bagian yang berbeda dari pekerjaan tetap jelas:

  • Lambda yang diteruskan untuk Where menetapkan aturan prioritas pendek di samping operasi yang menggunakannya.
  • Fungsi lokal FormatTask menamai langkah pemformatan yang hanya berlaku untuk ShowDashboard.
  • Iterator ReadyTasks memungkinkan penelepon mengonsumsi tugas siap tanpa membuat koleksi perantara.
  • Perulangan foreach secara eksplisit melakukan tindakan akhir, yaitu menulis setiap hasil.

Sebagai perbandingan, Where(static task => !task.IsBlocked) dapat menggantikan ReadyTasks karena pengujian kesiapan ini adalah filter sederhana. Kedua bentuk menunda penerapan filter hingga enumerasi. Lambda menempatkan aturan di lokasi pemanggilan; ReadyTasks memberi nama pada aturan. Pilih di antara keduanya berdasarkan informasi mana yang membantu pembaca memahami penelepon.

Artikel yang mengikuti menggunakan perbandingan seperti ini untuk menjelaskan kapan setiap pendekatan cocok dan apa yang dapat disimpulkan pembaca dari pilihan Anda.

Langkah berikutnya