Metode penyuluhan tidak menyediakan sesuatu yang tidak bisa dilakukan dengan cara lain. Mereka adalah gula sintaksis untuk membuat pengembangan lebih baik, tanpa memberikan manfaat teknis yang sebenarnya.
Metode penyuluhan relatif baru. Standar dan konvensi biasanya diputuskan oleh pendapat umum (ditambah beberapa pengalaman jangka panjang tentang apa yang akhirnya menjadi ide yang buruk), dan saya tidak berpikir kita pada titik di mana kita dapat menarik garis definitif yang disepakati semua orang.
Namun, saya dapat melihat beberapa argumen, berdasarkan pada hal-hal yang saya dengar dari rekan kerja.
1. Mereka biasanya mengganti metode statis.
Metode ekstensi paling umum didasarkan pada hal-hal yang seharusnya metode statis, bukan metode kelas. Mereka terlihat seperti metode kelas, tetapi sebenarnya tidak.
Metode penyuluhan seharusnya tidak dianggap sebagai alternatif untuk metode kelas; melainkan sebagai cara untuk memberikan tampilan dan nuansa "metodis" yang statis dan sintaksis .
2. Ketika metode yang Anda maksud adalah khusus untuk proyek konsumsi tetapi tidak perpustakaan sumber.
Hanya karena Anda mengembangkan perpustakaan dan konsumen tidak berarti Anda bersedia untuk menempatkan logika di tempat yang cocok.
Sebagai contoh:
- Anda memiliki
PersonDto
kelas yang berasal dari DataLayer
proyek Anda .
WebUI
Proyek Anda ingin dapat mengonversi a PersonDto
ke PersonViewModel
.
Anda tidak dapat (dan tidak ingin) menambahkan metode konversi ini ke DataLayer
proyek Anda . Karena metode ini termasuk dalam WebUI
proyek, ia harus hidup di dalam proyek itu.
Metode ekstensi memungkinkan Anda memiliki metode ini dapat diakses secara global di dalam proyek Anda (dan kemungkinan konsumen proyek Anda), tanpa memerlukan DataLayer
perpustakaan untuk mengimplementasikannya.
3. Jika menurut Anda kelas data hanya boleh berisi data.
Misalnya, Person
kelas Anda berisi properti untuk seseorang. Tetapi Anda ingin dapat memiliki beberapa metode yang memformat beberapa data:
public class Person
{
//The properties...
public SecurityQuestionAnswers GetSecurityAnswers()
{
return new SecurityQuestionAnswers()
{
MothersMaidenName = this.Mother.MaidenName,
FirstPetsName = this.Pets.OrderbyDescending(x => x.Date).FirstOrDefault()?.Name
};
}
}
Saya telah melihat banyak rekan kerja yang membenci gagasan mencampur data dan logika di kelas. Saya tidak begitu setuju dengan hal-hal sederhana seperti memformat data, tetapi saya mengakui bahwa dalam contoh di atas, rasanya kotor karena Person
harus bergantung pada SecurityQuestionAnswers
.
Menempatkan metode ini dalam metode ekstensi mencegah pengotoran kelas data yang dinyatakan murni.
Perhatikan bahwa argumen ini adalah salah satu gaya. Ini mirip dengan kelas parsial. Ada sedikit atau tidak ada manfaat teknis untuk melakukannya, tetapi memungkinkan Anda untuk memisahkan kode menjadi beberapa file jika Anda menganggapnya lebih bersih (misalnya jika banyak orang menggunakan kelas tetapi tidak peduli tentang metode kustom tambahan Anda).
4. Metode pembantu
Dalam sebagian besar proyek, saya cenderung berakhir dengan kelas pembantu. Ini adalah kelas statis yang biasanya menyediakan beberapa kumpulan metode untuk pemformatan yang mudah.
Misalnya, satu perusahaan tempat saya bekerja memiliki format datetime tertentu yang ingin mereka gunakan. Daripada harus menempelkan string format ke semua tempat, atau menjadikan string format menjadi variabel global, saya memilih metode ekstensi DateTime:
public static string ToCompanyFormat(this DateTime dt)
{
return dt.ToString("...");
}
Apakah itu lebih baik daripada metode pembantu statis normal? Aku pikir begitu. Itu membersihkan sintaks. Dari pada
DateTimeHelper.ToCompanyFormat(myObj.CreatedOn);
Saya bisa melakukan:
myObj.CreatedOn.ToCompanyFormat();
Ini mirip dengan versi lancar dari sintaks yang sama. Saya lebih menyukainya, meskipun tidak ada manfaat teknis dari memiliki satu di atas yang lain.
Semua argumen ini subyektif. Tak satu pun dari mereka yang membahas kasus yang kalau tidak bisa ditutup.
- Setiap metode ekstensi dapat dengan mudah ditulis ulang menjadi metode statis normal.
- Kode dapat dipisahkan dalam file menggunakan kelas parsial, bahkan jika metode ekstensi tidak ada.
Tetapi sekali lagi, kami dapat mengambil pernyataan Anda bahwa mereka tidak pernah perlu sampai ekstrem:
- Mengapa kita memerlukan metode kelas, jika kita selalu dapat membuat metode statis dengan nama yang jelas menunjukkan bahwa itu untuk kelas tertentu?
Jawaban untuk pertanyaan ini, dan pertanyaan Anda, tetap sama:
- Sintaks yang lebih bagus
- Peningkatan keterbacaan dan kurang pedantri kode (kode akan langsung ke titik dalam lebih sedikit karakter)
- Intellisense memberikan hasil yang bermakna secara kontekstual (metode ekstensi hanya ditampilkan pada jenis yang benar. Kelas statis dapat digunakan di mana saja).
Satu tambahan menyebutkan:
- Metode ekstensi memungkinkan metode chaining gaya pengkodean; yang telah menjadi lebih populer akhir-akhir ini, tidak seperti sintaks pembungkus metode vanilla. Preferensi sintaksis yang serupa dapat dilihat dalam sintaksis metode LINQ.
- Sedangkan metode chaining dapat dilakukan dengan menggunakan metode kelas juga; perlu diingat bahwa ini tidak cukup berlaku untuk metode statis. Metode ekstensi paling umum didasarkan pada hal-hal yang seharusnya metode statis, bukan metode kelas.