Code Clone Analysis Feature In Visual Studio 2012

Visual Studio , Posted at : Sep/18/2013  
2200 Views   0 Comments

Seringkali sebagai seorang programmer melakukan copy paste kode program dari satu file ke file lain atau dari satu project ke project lainnya. Salah satu efek negatif dari aktivitas copy paste kode yaitu kode tidak menjadi “reusable” dalam arti apabila terjadi perubahan kode dalam business logic nya maka kita harus mencari semua kode tersebut yang memiliki fungsionalitas yang sama di beberapa file atau di beberapa project.

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.

Public Class Employee
    Public Property ID As Integer
    Public Property Name As String
End Class

Public Class Customer
    Public Property ID As Integer
    Public Property Name As String
End Class

Public Class Supplier
    Public Property ID As Integer
    Public Property Name As String
End Class

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 :)


[Comments]

[Write your comment]
Name (required)
Email (required-will not published)
 
Comment

JSFC
Input code above below (Case Sensitive) :
About Me 
Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Microsoft Certified Trainer | IT Trainer at Native Enterprise | IT Consultant | Software Developer | MCAD | MCPD | MOS | Bandung, West Java, Indonesia.
[Read More...]
Top Download 
Mapping Hak Akses User Pada MenuStrip Sampai Control Button : Downloaded 6083 times  
Bagaimana caranya menginstal database ketika deploying sebuah aplikasi? : Downloaded 4689 times  
Simple Voice Engine Application With Sound Player Class... : Downloaded 3554 times  
Change Group,Sort Order, Filtering By Date in Crystal Reports : Downloaded 3324 times  
WinForms DataGrid Paging With SqlDataAdapter : Downloaded 2706 times  
Links 
Certifications 
MOS 2007
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench
Native Enterprise 
Follow Me 
Facebook   LinkedIn   Twitter
Syndication 
Hosted By 
Native Enterprise News 
© Copyright 2006-2016   Rully Yulian MF   All rights reserved.