Refactor kode untuk menggunakan fitur bahasa C# baru

.NET Tools How-To’s

Modernisasi, atau migrasi ke fitur bahasa modern dalam bahasa apa pun dapat membantu membuat kode lebih mudah dibaca, efisien, dan aman. Dalam posting blog ini, kita akan melihat cara untuk memodernisasi kode agar lebih baik dari sebelumnya.

Manfaatkan fitur bahasa modern

Mengapa kode refactor hanya untuk memodernkannya? Mengapa memperbaikinya jika tidak rusak? Terkadang, ada alasan bagus untuk meningkatkan atau bermigrasi ke versi platform atau bahasa yang lebih baru. Misalnya, bahasa berkembang untuk menambahkan fitur yang memanfaatkan fitur sistem operasi, kemampuan perangkat dan browser, atau cloud atau teknologi lainnya. Demikian juga, pembaruan bahasa berisi perbaikan bug, sintaksis yang lebih bersih dan gula sintaksis, dan cara yang lebih efisien untuk bekerja dengan objek dan data.

Refactoring yang memodernisasi kode dapat secara drastis meningkatkan kualitasnya dengan meningkatkan keterbacaan, dan pemeliharaan. Ini karena seiring dengan perkembangan bahasa, sintaksis yang baru ditambahkan cenderung mendukung lebih sedikit baris kode dan kode yang lebih sederhana yang harus Anda tulis.

Alat seperti ReSharper dan Rider dapat membantu memodernisasi basis kode Anda. Mereka up-to-date dengan fitur-fitur baru dalam bahasa .NET, dan dapat menyarankan peluang untuk memanfaatkannya sebaik mungkin. Sebagai manfaat tambahan, saran ini membantu menjaga keterampilan C# tim Anda tetap mutakhir.

Pernyataan tingkat atas

Pernyataan tingkat atas, yang diperkenalkan di C# 9, memungkinkan Anda untuk segera mulai menulis kode tanpa harus mendefinisikan ruang nama atau kelas secara eksplisit. Sebelum pernyataan tingkat atas, bahkan aplikasi paling dasar yang mencetak satu pesan gaya “Hello World” hadir dengan tiga tingkat kurung bersarang untuk mendukung satu baris kode yang sedang berjalan. Itu banyak kode boilerplate yang tidak perlu. Apakah kita benar-benar membutuhkannya?

using System;

namespace HelloWorld

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine("Hello, modernized world!");
        
    

Tidak! Kami tidak membutuhkan semua kode tambahan itu sama sekali. Dengan pernyataan tingkat atas, kita dapat menghapus setiap baris kode di aplikasi Hello World kecuali satu baris kode yang benar-benar melakukan sesuatu.

System.Console.WriteLine("Hello, modernized world!");

Bagi yang ingin menggunakan nama pendek, kodenya terlihat seperti ini:

using static System.Console;
WriteLine("Hello, modernized world!");

Menggunakan template proyek baru (Berkas | Proyek baru) menggunakan pernyataan tingkat atas secara default. Untuk memigrasikan kode Anda untuk menggunakan pernyataan tingkat atas, hapus ruang nama dan deklarasi kelas serta fungsi utama. Tinggalkan hanya tubuh fungsi utama. Sangat menyenangkan untuk menghapus kode tetapi mudah untuk melewatkan tanda kurung, jadi gunakan Alt+Enter di kelas yang berisi Main dan pilih Konversikan ke kode tingkat atas. Voila! Semuanya diperbarui.

Gunakan pernyataan tingkat atas di C#

Pernyataan Top-Level pertama kali diperkenalkan di C# 9.

Ruang Nama Cakupan File

Ruang nama adalah cara yang bagus untuk memberi nama, mengatur, dan mengakses objek, tetapi mereka tidak harus selalu ada di depan Anda. Pola organisasi file yang umum di .NET adalah menggunakan satu kelas per file tetapi apakah benar-benar perlu menyertakan satu kelas dalam namespace? Di sinilah ruang nama lingkup file berguna. Sama seperti dengan pernyataan tingkat atas, Anda akan memiliki satu tingkat lekukan yang lebih sedikit untuk dikhawatirkan. Untuk sintaks: Deklarasikan namespace di bagian atas file dan segera akhiri dengan titik koma dan selesai. Tidak ada kurung kurawal! Seperti:

namespace MealPlanner.Menu;

Dan itu saja. Satu baris kode ini memberi tahu kompiler untuk memasukkan semua yang ada di file sebagai bagian dari MealPlanner.Menu ruang nama. Mengonversi ke ruang nama lingkup file menggunakan Rider adalah masalah mendesak Alt+Enter pada deklarasi namespace dan memilih Untuk ruang nama lingkup file. Pilih apakah ruang nama cakupan file hanya berlaku untuk file ini atau tingkatkan seluruh solusi.

Ruang nama Cakupan File memulai debutnya ke C# di versi 10.

Init-only setter dan pengindeks

Ada kalanya Anda ingin membuat instance objek, tetapi datanya harus tidak dapat diubah (tidak dapat diubah). Mungkin Anda memiliki DTO atau objek yang mewakili tabel dalam database. Objek seperti ini mungkin berisi nama tabel dan bidang, dan oleh karena itu objek harus tidak dapat diubah. Tidak ada cara untuk menginisialisasi data read-only semacam ini dari luar konstruktor. Jadi di versi C# sebelumnya, Anda akan mendeklarasikan dan menginisialisasi objek di konstruktor dan membuat properti hanya-baca dengan membuat hanya pengambil tanpa penyetel, mirip dengan kode berikut:

class Column

    public Column(string ColumnName, 
string DataType, string IsPrimaryKey)
    
        ColumnName = "Column1";
        DataType = "varchar(20)";
        IsPrimaryKey = false;
    
    public string ColumnName  get; 
    public string DataType  get;  
    public bool IsPrimaryKey  get;  


var c = new Column();

Namun, cara klasik untuk membuat instance dan menginisialisasi berarti bahwa data harus diatur dari dalam kelas, dan konstruktor adalah satu-satunya tempat. Seringkali, data perlu diatur dari luar kelas, terutama jika menggunakan objek yang mewakili struktur database seperti dalam contoh ini. Properti init-only memungkinkan kita untuk membuat objek dengan properti read-only yang diinisialisasi oleh kode panggilan. Ini lebih fleksibel dari sebelumnya.

Untuk memodernisasi kode agar menggunakan setter init-only, buat properti dengan pengambil dan gunakan init kata kunci, bukan set untuk setter (atau hapus set pernyataan seluruhnya). Kemungkinan besar, Anda ingin memutakhirkan ini secara massal – jadi tekan Alt+Enter dan pilih Untuk memulai pengakses, lalu pilih cakupan: file, proyek, atau solusi. Kemudian, konsumen harus menginisialisasi kelas ketika membuat turunannya atau menghadapi kesalahan kompiler. Perhatikan pengurangan baris kode. Dalam animasi berikut, kode berwarna abu-abu sebagai indikasi bahwa kode dapat dihapus dengan aman. Itu tidak lagi dibutuhkan atau digunakan.

Rider Mengonversi setter menjadi properti init saja
class Column

    public string ColumnName  get; init; 
    public string DataType  get; init; 
    public bool IsPrimaryKey  get; init; 


var c = new Column

    ColumnName = "First_Name"
;

C# 9 adalah versi di mana properti Init-only diperkenalkan.

Rekaman dan Struktur Rekaman

Rekaman adalah cara untuk membuat seluruh objek tidak dapat diubah sebagai lawan dari properti individual yang ditemukan di properti init-only. Catatan berbeda dari kelas karena jenis catatan menggunakan kesetaraan berbasis nilai. Oleh karena itu, objek yang membutuhkan perbandingan nilai untuk semua properti umumnya bermigrasi dengan baik ke record atau struct record. Biasanya, masalah dengan tipe yang dapat diubah muncul di program dengan konkurensi tinggi dan data bersama.

Deklarasi rekaman hampir identik secara sintaksis dengan kelas – hanya kata kuncinya yang berbeda. Untuk memperbarui kode lama, ganti class kata kunci dengan record, hapus konstruktor, dan inisialisasi properti sebaris. Semua ini dapat dilakukan dengan satu penekanan tombol: Alt+Enter (pastikan tanda sisipan ada pada nama kelas). Pilih Untuk merekam. Rider melakukan konversi lengkap. Sekarang kelas tersebut di-refactored sebagai recordperhatikan bahwa konstruktor berwarna abu-abu sehingga dapat dikonversi menjadi konstruktor utama (berikutnya).

Mengonversi kelas menjadi catatan

C# 9 membawakan kita record, dan C# 10 record struct.

Konstruktor Utama

Saat C# berkembang, lebih sedikit kode yang dibutuhkan untuk menyelesaikan tugas yang sama seperti sebelumnya. Ini berarti ada banyak kode boilerplate yang tidak perlu yang diabstraksikan, tidak terlihat dan tidak terpikirkan. Ini bagus karena kode semacam itu cenderung menghalangi dan tidak menambah banyak nilai bisnis.

Setelah Anda pindah dari kelas ke rekor dengan mengubah kata kunci class ke record (atau sama dengan struct ke record struct), konstruktor dan setter tidak lagi diperlukan. Pada titik ini Anda bisa menghapusnya. Tetapi jika Anda perlu mengatur nilai-nilai itu, gunakan konstruktor utama.

Untuk bermigrasi ke konstruktor utama, letakkan tanda sisipan pada konstruktor yang ada, tekan Alt+Enter dan pilih yang sesuai Konversikan ke konstruktor utama tindakan. Pilih apa yang ingin Anda perbarui: objek saat ini, file saat ini, proyek, atau solusi.

Konversikan ke konstruktor utama

Konstruktor utama masuk dalam C# di versi 9.

Ekspresi Beralih Modern

Beralih pernyataan mengevaluasi ekspresi dari daftar nilai. Jenis seperti: string, intdan enum sering jenis yang digunakan dalam evaluasi dan mereka cenderung sederhana. Namun, ekspresi sakelar mengevaluasi ekspresi dari daftar ekspresi kandidat berdasarkan kecocokan pola. Itu dapat mengevaluasi lebih banyak ekspresi dengan cara yang berbeda (misalnya, menggunakan lambdas) dan lebih fleksibel dari sebelumnya. Tidak semua pernyataan sakelar paling cocok untuk menjadi ekspresi sakelar, tetapi beberapa pengembang hanya menikmati sintaks yang lebih pendek dan ringkas untuk menjamin peningkatan.

Ubah pernyataan sakelar menjadi ekspresi sakelar dengan menekan Alt+Enter sementara tanda sisipan ada di switch kata kunci dan pilih opsi untuk mengonversi.

Tingkatkan dari pernyataan beralih ke ekspresi beralih

C# 8 adalah versi yang mengubah arah untuk memberi kita ekspresi peralihan.

Jenis referensi nullable

Dalam banyak bahasa termasuk versi C# sebelumnya, Anda akan menulis cek nol dalam kode Anda. Di banyak kalangan, dengan patuh memeriksa nol dianggap “kode defensif yang baik”. Tapi kegiatan ini bisa diabstraksikan. Kompiler dan alat dapat dengan mudah melakukan pemeriksaan ini untuk kami sekarang pada tahun 2022. Tema umum mengenai pengembangan aplikasi adalah bahwa bahasa pemrograman harus memungkinkan pengembang untuk fokus pada pemecahan masalah bisnis. Jika tidak, mereka menghabiskan sebagian besar waktu mereka untuk membuat ulang atau memperbaiki skenario teknis umum: dalam hal ini, pemeriksaan nol.

Meskipun ada banyak pertimbangan mengenai nullability saat memperbarui kode, ada beberapa perbaikan cepat yang seharusnya tidak merepotkan dan membantu Anda memulai. Misalnya, mungkin selama refactoring Anda telah menerapkan ? karakter ke argumen dalam konstruktor untuk menunjukkan nullability, tetapi lupa menerapkannya ke properti yang sesuai. Jangan khawatir, Anda akan melihat indikator yang mengingatkan Anda tentang pembaruan yang diperlukan di editor. Tekan Alt+Enter untuk memilih tindakan yang akan diambil. Dalam contoh ini, properti diatur ke nullable untuk membuat argumen konstruktor.

Pernyataan tingkat atas

Sementara itu, baca selengkapnya tentang migrasi ke tipe referensi nullable, cara kerjanya, dan cara memutakhirkan kode Anda untuk menggunakan tipe referensi nullable.

Jenis referensi nullable memulainya di C# 9.

Kesimpulan

Posting blog ini telah menunjukkan kepada Anda cara memfaktorkan ulang kode untuk modernisasi dengan bantuan alat seperti ReSharper dan Rider. Tidak perlu selalu menggunakan versi bahasa terbaru, tetapi penting untuk memfaktorkan ulang kode agar lebih mudah dibaca dan efisien. Pada titik tertentu, itu berarti pembaruan. Alat yang baik dapat memberikan bantuan dengan pemfaktoran ulang dan pembaruan kode lama, migrasi, dan modernisasi basis kode. Lihat alat .NET kami dan beri tahu kami bagaimana Anda berencana untuk memodernisasi kode Anda.

Pemrograman