Salah satu fitur baru yang terdapat di Visual Studio 2012 yaitu Code Clone Analysis. Dengan fitur tersebut visual studio dapat mencari kode-kode program yang mirip secara struktur maupun secara logika. Kode-kode program yang mirip dapat ditemukan di beberapa project dalam satu solution. Kegunaan dari fitur tersebut yaitu untuk melakukan refactoring atau melakukan update kode program di beberapa file atau project apabila memang tidak dilakukan refactoring. Terdapat dua teknik untuk menggunakan fitur tersebut yaitu dengan memilih menu Analyze –> Analyze Solution For Code Clones (1), atau dengan melakukan seleksi pada beberapa baris kode program kemudian dengan melakukan klik kanan maka akan ditemukan menu Find Matching Clones in Solutions (2).
Cara pertama dilakukan untuk menganalisa semua kode program dengan jumlah baris kemiripan lebih dari 10 statement. Apabila jumlah baris kode yang mirip kurang dari 10 statement maka dilakukan cara yang kedua.
Fitur ini tidak berlaku untuk menganalisa deklarasi tipe data seperti deklarasi field, nama method atau nama properti yang sama. Analisa dilakukan hanya untuk statement kode program yang terdapat dalam sebuah properti atau method. Selain itu file yang digunakan untuk menyimpan auto generated code seperti file .designer.vb atau .designer.cs juga tidak akan dianalisa oleh fitur ini.
Bagaimana caranya apabila kita ingin melakukan pembatasan terhadap file, namespace, class, dan method yang akan dianalisa? Jawabannya yaitu dengan membuat file xml dengan ekstensi .codeclonesettings ke dalam sebuah project. Di dalam file tersebut di deklarasikan object-object yang tidak akan dianalisa. Berikut ini saya demo kan penggunaan fitur Code Cone Analysis.
1. Buat sebuah project di Visual Studio 2012. Project yang digunakan dapat untuk jenis project apapun. Beri nama project tersebut CodeCloneChecking.
2. Buat sebuah class dan berikan nama Models.
3. Ketikkan kode berikut ini di file Models.vb.
4. Buat sebuah class dan berikan nama EmployeeDAL.vb dan ketikkan kode berikut ini :
Public Class EmployeeDAL
Public Shared Function AddNewEmployee(ByVal NewEmployee As Employee) As Integer
Using sqlConn As New SqlClient.SqlConnection("YourConnectionString")
Using sqlCmd As New SqlClient.SqlCommand
Dim intRet As Integer
With sqlCmd
.CommandType = CommandType.Text
.Connection = sqlConn
.CommandText = String.Format(
"Insert Into Employee Values ({0},'{1}')",
NewEmployee.ID, NewEmployee.Name)
Try
sqlConn.Open()
intRet = .ExecuteNonQuery
Catch ex As SqlClient.SqlException
Throw New Exception(ex.Message, ex)
Finally
sqlConn.Dispose()
End Try
End With
Return intRet
End Using
End Using
End Function
End Class
5. Tambahkan class lainnya dan berikan nama CustomerDAL.vb dan ketikkan kode berikut ini :
Public Class CustomerDAL
Public Shared Function AddNewCustomer(ByVal NewCustomer As Customer) As Integer
Dim Conn As New SqlClient.SqlConnection("YourConnectionString")
Using Cmd As New SqlClient.SqlCommand
Dim intRetVal As Integer = 0
With Cmd
.CommandType = CommandType.Text
.Connection = Conn
.CommandText = String.Format(
"Insert Into Customer Values ({0},'{1}')",
NewCustomer.ID, NewCustomer.Name)
Try
Conn.Open()
intRetVal = .ExecuteNonQuery
Catch ex As SqlClient.SqlException
Throw New Exception(ex.Message, ex)
Finally
Conn.Dispose()
End Try
End With
Return intRetVal
End Using
End Function
End Class
Secara struktur dan logika kode program di atas sama / mirip dengan mengubah nama variabel, input parameter, dan penggantian penggunaan keyword Using, inilah yang dijadikan target oleh fitur tersebut untuk dianalisa.
6. Klik menu Analyze –> Analyze Solution For Code Clones dan hasilnya dapat dilihat pada gambar dibawah ini :

Di dalam panel Clone Group terdapat keterangan Weak Match untuk dua file beserta keterangan nama class dan nomor baris kode nya. Apabila salah satu baris tersebut di double klik maka visual studio akan melakukan seleksi terhadap kode program yang dianalisa memiliki kemiripan struktur dan logika yang sama / mirip.
7. Klik kanan Weak Match di panel Clone Group dan pilih menu Compare :
Hasilnya adalah sebagai berikut :

Dengan melakukan compare kita dapat melihat secara visualisasi hasil analisanya. Fitur compare ini mirip dengan fitur compare di TFS 2012 untuk melakukan pengecekan code pada saat akan melakukan Merging. Fitur analisa tersebut diatas dapat dilihat hasilnya karena statement yang mirip atau sama berjumlah lebih dari 10 statement. Apabila jumlahnya kurang dari 10 maka hasilnya tidak akan kita dapatkan. Lalu bagaimana caranya? Berikut ini adalah contohnya :
8. Buat dua buah class dan beri nama MyMath1.vb dan MyMath2.vb dan ketikkan kode berikut ini di masing-masing class nya :
Public Class MyMath1
Public Shared Function AddPositiveNumber(ByVal Num1 As Integer,
ByVal Num2 As Integer) As Integer
If Num1 < 0 Then
Throw New ArgumentOutOfRangeException("Num1",
"Please input positive number")
End If
If Num2 < 0 Then
Throw New ArgumentOutOfRangeException("Num2",
"Please input positive number")
End If
Dim intRes As Integer = Num1 + Num2
Return intRes
End Function
End Class
Public Class MyMath2
Public Shared Function SumPositiveNumber(ByVal Number1 As Integer,
ByVal Number2 As Integer) As Integer
If Number1 < 0 Then
Throw New ArgumentOutOfRangeException("Number1",
"Please input positive number")
End If
If Number2 < 0 Then
Throw New ArgumentOutOfRangeException("Number2",
"Please input positive number")
End If
Return Number1 + Number2
End Function
End Class
Jika kita melakukan analisa dengan cara seperti pada langkah nomor 6 maka hasilnya tidak akan didapat karena kode yang mirip atau sama kurang dari 10 statement. Jadi lakukan langkah berikut ini untuk menganalisanya :
9. Sorot kode yang ada di MyMath1.vb mulai dari “If Num1 < 0” sampai dengan “Return intRes” dan pilih menu Find Matching Clones in Solutions. Berikut adalah hasilnya :

Selanjutnya saya akan memberikan contoh penggunaan file .codeclonesettings yang digunakan untuk membatasi object-object yang akan dianalisa. Berikut langkah-langkahnya :
1. Buat class SupplierDAL.vb dan lakukan copy paste kode program yang terdapat di dalam class EmployeeDAL.
2. Copy paste file CustomerDAL ke dalam project yang sama, kemudian rename file tersebut menjadi AnotherCustomerDAL.vb.
3. Copy paste file EmployeeDAL ke dalam project yang sama, kemudian rename file tersebut menjadi AnotherEmployeeDAL.vb.
4. Buat sebuah folder di project tersebut dan berikan nama MyOwnCode dan copy paste file SupplierDAL.vb ke dalam folder tersebut, kemudian rename file tersebut menjadi AnotherSupplierDAL.vb.
5. Tambahkan item baru berupa file xml kedalam project dan ubah ekstensinya menjadi .codeclonesettings. Berikut hasil lengkapnya :

6. Ketikkan elemen-elemen berikut ini kedalam file MyCodeClone.codeclonesettings :
1: <?xml version="1.0" encoding="utf-8" ?>
2: <CodeCloneSettings>
3: <Exclusions>
4:
5: <File>*CustomerDAL.vb</File>
6: <File>*EmployeeDAL.vb</File>
7:
8: <File>SupplierDAL.vb</File>
9:
10: <File>MyOwnCode\*.vb</File>
11:
12: <Type>CodeCloneChecking.AnotherCustomerDAL</Type>
13: <FunctionName>CodeCloneChecking.AnotherEmployeeDAL.AddNewEmployee</FunctionName>
14:
15: </Exclusions>
16: </CodeCloneSettings>
Baris ke-5 dan ke-6 digunakan untuk exclude file yang berakhiran CustomerDAL.vb dan EmployeeDAL.vb (AnotherCustomerDAL.vb dan AnotherEmployeeDAL.vb, teknik ini menggunakan wildcard.
Baris ke-8 digunakan untuk exclude file SupplierDAL.vb.
Baris ke-10 digunakan untuk exclude semua file yang memiliki ekstensi .vb yang terdapat di dalam folder MyOwnCode.
Baris ke-12 digunakan untuk exclude type (class) yang memiliki nama AnotherCustomerDAL. Untuk Type ini harus ditulis lengkap dengan namespacenya.
Baris ke-13 digunakan untuk exclude sebuah method yang memiliki nama AddNewEmployee. Untuk FunctionName elemen ini juga sama dengan Type elemen, harus ditulis lengkap dengan namespacenya dan tambahan nama class.
Apabila kita lakukan Code Clone Analysis maka hasilnya tidak akan didapatkan karena adanya exclude object-object di file xml tersebut.
7. Lakukan commenting di file xml untuk baris ke-5 dan ke-6, lakukan analisa kembali. Berikut hasilnya :

Semua object yang sudah exclude dan tidak dilakukan commenting di file xml tersebut tidak akan dianalisa.
8. Tambahkan commenting untuk elemen di baris ke-8. Berikut hasilnya :

File SupplierDAL.vb termasuk ke dalam file yang dianalisa.
9. Tambahkan commenting untuk elemen di baris ke-10. Berikut hasilnya :

File dengan ekstensi .vb yang terdapat di dalam folder MyOwnCode termasuk ke dalam file yang dianalisa oleh visual studio.
10. Tambahkan commenting untuk elemen di baris ke-12. Berikut hasilnya :

Terdapat dua file memiliki kode program yang identik sama seperti yang dapat dilihat di Exact Match group.
11. Tambahkan commenting untuk elemen di baris ke-13. Berikut hasilnya :

Terdapat penambahan Exact Match file group sebagai hasil dari commenting elemen di file xml. Dari fitur tersebut dapat kita lihat beberapa kegunaan Code Clone Analysis sebagai tools untuk menganalisa kode program untuk melakukan refactoring atau melakukan update kode program di beberapa file sekaligus. Selain itu dapat juga digunakan untuk mengecek apakah kode program yang akan dibuat sudah tersedia atau belum. Semoga bermanfaat :)