[S]esuai namanya extension yang berarti tambahan, pada C# kita bisa menambahkan method baru pada sebuah kelas tanpa harus mengubah source code dari kelas yang bersangkutan. Terdengar musthail eh? atau justru terdengar amazing dan keren? hehe.. .Hal ini tidak mustahil dilakukan karena C# mendukung fitur yang namanya extension method.
Pada kasus normal, misal kita punya kelas seperti ini pada file Foo.cs
1 2 3 4 5 6 7 |
public class Foo { public string GetBar() { return "Bar"; } } |
Ketika ingin menambahkan method baru dengan nama GetBarHi maka yang kita lakukan adalah mengedit file Foo.cs di atas menjadi seperti ini
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Foo { public string GetBar() { return "Bar"; } public string GetBarHi(string name) { return "Hi Bar "+name; } } |
Lain cerita kalau kita menggunakan extension method. Menggunakan fitur ini maka yang terjadi adalah kita buat sebuah kelas baru yang methodnya merupakan sebuah extension method. Perhatikan kode di bawah.
file : FooExtension.cs
1 2 3 4 5 6 7 |
public static class FooExtension { public static string GetBarHi(this Foo foo,string name) { return "Hi Bar " + name; } } |
Perhatikan parameternya, this Foo foo menandakan kalau method ini adalah extension method yang ditambahkan pada kelas Foo, nantinya ketika kelas ini digunakan dia bisa memanggil extension method layaknya method biasa
1 2 3 |
Foo foo=new Foo(); string fooBar=foo.GetBar(); string fooBarHi=foo.GetBarHi("Agung"); //extension method |
Another Example
Kalau pembaca memiliki analisis yang tajam pasti akan bertanya dengan pertanyaan yang kurang lebih seperti ini.
Buat apa bikin extension method, kan tinggal menambahkan method pada source code kelas juga bisa, tidak perlu membuat kelas baru yang berisi extension method.
Iya bener, tapi untuk kasus tertentu kita tidak bisa melakukannya misal kita mau menambahkan method ReverseIT yang berguna untuk membalik sebuah string pada kelas string yang dimiliki oleh .NET framework. Bisakah kita menambahkan sendiri method itu ke dalam source code kelas string? Saya jawab tidak bisa. Alternatifnya ya tentu saja menggunakan extension method. Perhatikan kode di bawah
file : ReverseString.cs
1 2 3 4 5 6 7 8 9 |
public static class ReverseString { public static string ReverseIt(this string stringParam) { char[] strings = stringParam.ToCharArray(); Array.Reverse(strings); return new string(strings); } } |
Unit Test
Untuk memastikan 2 extension method pada 2 kelas berbeda yang telah kita buat di atas tadi bekerja dengan benar, kita perlukan sebuah Unit Test untuk mengujinya. Lihat kode UT di bawah ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using ExtensionMethod; //Namespace tempat kelas berisi ext method jangan lupa dipanggil namespace ExtensionMethodTest { [TestClass] public class ReverseStringUnitTest { [TestMethod] public void TestReverseString() { string name = "Agung Setiawan"; string expectedValue = "nawaiteS gnugA"; string actualValue = name.ReverseIt(); Assert.AreEqual(expectedValue, actualValue); } [TestMethod] public void TestGetBarHi() { Foo foo=new Foo(); string expectedValue = "Hi Bar Agung"; string actualValue = foo.GetBarHi("Agung"); Assert.AreEqual(expectedValue, actualValue); } } } |
Jalankan pengujian dan enjoy the green check 🙂