CODE REENGINEERING
Kelompok 3
REFACTORING
Maxsimus Ernest
DEFINISI DAN MANFAAT REFACTORING
1. Definisi Refactoring
Refactoring adalah perubahan yang dibuat pada struktur internal sebuah software menjadi lebih mudah untuk dipahami
dan lebih murah untuk dimodifikasi tanpa mengubah behavior yang dapat diamati oleh pengguna akhir secara langsung.
2. Manfaat Refactoring
Secara garis besar, manfaat refactoring dibagi menjadi 4 sebagai berikut:
- Refactoring meningkatkan rancangan aplikasi
- Refactoring mempermudah dalam memahami aplikasi
- Refactoring membantu dalam mencari sumber bugs
- Refactoring membantu dalam membuat program lebih cepat
DEFINISI BAD CODE SMELL DAN DESIGN SMELL
Bad Code Smell adalah karakteristik dari source code sebuah program yang dapat
mengindikasikan masalah (yang lebih dalam) pada sebuah aplikasi. Sedangkan Design
Smell adalah struktur perancangan yang mengindikasikan pelanggaran pada prinsip-prinsip
perancangan sehingga memperburuk kualitas perancangan software. dan Design Smell Bad
Code Smell adalah karakteristik dari source code sebuah program yang dapat
mengindikasikan masalah (yang lebih dalam) pada sebuah aplikasi. Sedangkan Design
Smell adalah struktur perancangan yang mengindikasikan pelanggaran pada prinsip-prinsip
perancangan sehingga memperburuk kualitas perancangan software.
JENIS-JENIS BAD CODE SMELL
a. The Bloater
The bloater menunjukan sesuatu yang berkembang terlalu besar sehingga tidak dapat
ditangani secara efisien.
b. The Object Orientation Abuser
Penentu umum dari “smell” pada Object Orientation Abuser adalah penerapan konsep
object oriented yang tidak diterapkan secara penuh.
JENIS-JENIS BAD CODE SMELL
c. The Change Preventer
Changer Preventer merupakan smell yang mencegah/mempersulit terjadinya perubahan
pada aplikasi atau untuk kebutuhan perubahan dimasa yang akan datang.
d. The dispensable
Hal umum yang ada pada semua dispensable smell adalah seluruhnya menunjukkan adanya
sesuatu yang tidak dibutuhkan dan seharusnya dapat dihapus dari source code.
JENIS-JENIS BAD CODE SMELL
e. The Coupler
The coupler merupakan kondisi dimana terdapat pelanggaran terhadap prinsip coupling.
Coupling merupakan ukuran keterikatan sebuah module dengan module lainnya.
THE BLOATER
Maxsimus Ernest
PENGERTIAN
The bloater menunjukan sesuatu yang berkembang terlalu besar sehingga tidak
dapat ditangani secara efisien. Sesuatu tersebut dapat berupa metode yang
terlalu panjang, kelas yang terlalu besar, daftar parameter yang terlalu banyak,
penggunaan data primitive yang berlebihan, ataupun penggunaan data clumps.
Berikut adalah jenis-jenis smell code dari kelompok The Bloater:
-Long Method
- Large Class
- Primitive Obsession
- Long Parameter List
- Data Clumps
Long Method
Smell ini terjadi ketika ada sebuah method yang terlalu panjang. Method yang
terlalu panjang.
Beberapa cara yang dapat dilakukan untuk memperbaiki kondisi metode yang sudah
terlalu panjang adalah:
1. Mengektraksi metod menjadi metode lain.
2. Mengganti temp dengan query.
3. Memperkenalkan object parameter ketika beberapa metode memiliki sekelompok
parameter yang sama.
4. Preserved the whole object.
5. Memindahkan conditional operator dan perulangan menjadi metode terpisah.
Large Class
Large class merupakan kelas yang berisi banyak fields, metode, atau baris
code. Ukuran kelas pada saat awal dideklarasikan biasanya kecil, namun
seiring berjalannya waktu kelas menjadi besar dengan penambahan-
penambahan kebutuhan aplikasi. Beberapa hal yang dapat dilakukan untuk
mengatasi masalah kelas yang besar adalah:
1. Extract class.
2. Extract Interface.
3. Duplicate Observed data.
Primitive Obsession
Primitive data type biasanya digunakan untuk
- object-object kecil yang menjalankan tugas sederhana, seperti mata uang, telepon, dst.
- Konstanta untuk informasi code, seperti konstanta dari USER_ROLE.
- Konstanta String sebagai nama field yang digunakan untuk data array
Beberapa refactoring yang dapat dilakukan untuk memperbaiki penggunaan primitive data
type secara berlebihan:
1. Mengganti nilai data dengan object
2. Mengganti tipe kode dengan subclass
3. Mengganti array dengan object
4. Mengganti tipe kode dengan state/strategy
5. Mengganti tipe kode dengan class
Long Parameters List
Penggunaan parameter yang terlalu banyak adalah lebih dari 2 atau 3
parameter. Kondisi ini merupakan salah satu indikasi bad code smell dari
kategori Bloater. Daftar parameter yang terlalu panjang dapat diperbaiki
dengan cara mengganti parameter dengan memanggil metode.
Data Clumps
Masalah Data clumps sering kali disebabkan oleh struktur program yang jelek
atau “copypasta programming”. Salah satu cara memastikan apakah sekumpulan
data merupakan data clumps atau bukan adalah dengan menghapus salah satu
nilai data dan mengecek apakah nilai lainnya masih valid. Jika tidak, maka
kemungkinan terjadi data clumps sangat tinggi. Beberapa cara untuk
memperbaiki kondisi data clumps adalah:
1. Ekstraksi kelas
2. Menggunakan parameter object
3. Preserve the whole object
Object
Oriented
Abuser
Muhammad Arifudin
Switch Refused
Statement Bequest
Alternative
Temporary Classes with
Field Different
Interfaces
Switch Statement
Penggunaan operator switch
atau if untuk menggantikan
polymorphism.
Melanggar konsep
polymorphism.
Contoh Switch Statement
Tugas CFO
Tugas CMO
Refactoring Switch Statement
Tugas CFO
Tugas CMO
Solusi:
Replace type code with subclasses
Refused
Switch
Bequest
Statement
Object
Oriented
Abuser
Alternative
Temporary Classes with
Field Different
Interfaces
Refused Bequest
Pewarisan dari superclass ke subclass yang dilakukan hanya karena subclass memiliki
beberapa fungsional yang sama dengan superclass. dimana karakteristik subclass dan
superclass sangat berbeda
Melanggar konsep Inheritance
Contoh:
Class Chair menjadi subclass Animal
hanya karena sama-sama memiliki Legs.
Contoh Refused Bequest
Marketing di perusahaan
merupakan tugas CMO.
Namun, ketika CTO diberi
tugas tambahan untuk
memamerkan (marketing)
teknologi terkini yang sedang
dikembangkan perusahaannya,
bukan berarti class CTO
menjadi subclass dari class
CMO.
Refactoring Refused Bequest
Solusi:
Replace inheritance with delegation
Refactoring Refused
Bequest
Refused
Switch
Bequest
Statement
Object
Oriented
Abuser Alternative
Temporary Classes with
Field Different
Interfaces
Temporary Field
Field yang dibutuhkan atau berisi data pada keadaan tertentu saja, pada
keadaan lain field tersebut kosong
Contoh
● Field username, password, email, dan foto
merupakan Temporary Field, karena field
tersebut berisi data hanya ketika user telah
mengisi data-data register.
● Solusi : Field-field tersebut sebaiknya
dijadikan local variable.
Refused
Switch
Bequest
Statement
Object
Oriented
Abuser Alternative
Temporary Classes with
Field Different
Interfaces
Alternative Classes with Different Interfaces
Dua atau beberapa class yang melakukan fungsional yang sama, namun
dengan method yang berbeda.
Contoh
Car
Refactoring Alternative Classes with Different Interfaces
Solusi:
Extract Superclass
Refactoring Alternative Classes with Different Interfaces
Code Smells: Change Preventer
Muhammad Arifudin
Parallel
Inheritance
Hierarchies
Divergent Change
Change Preventer
Arrow Anti Shotgun
Pattern Surgery
Divergent Change
Perubahan pada satu method menyebabkan perubahan pada banyak method
lain dalam satu class.
Refactoring Divergent Change
Code Smells: Change Preventer
Parallel
Inheritance
Hierarchies
Divergent Change
Change Preventer
Arrow Anti Shotgun
Pattern Surgery
Shotgun Surgery
Satu perubahan yang dilakukan
pada banyak class secara
bersamaan.
Contoh Shotgun Surgery
Code Smells: Change Preventer
Parallel
Inheritance
Hierarchies
Divergent
Change
Arrow Anti
Pattern
Parallel Inheritance Hierarchies
Ketika terjadi penambahan subclass
pada suatu class, perlu dilakukan
penambahan subclass juga untuk
class lain.
Contoh
Superclass Jabatan berisi fungsional tugas yang dilakukan karyawan.
Superclass Milestone berisi fungsional pelaporan tugas harian karyawan
Refactoring
Code Smells: Change Preventer
Dispensable Couplers
Change
Bloaters
Preventer
Object
Oriented
Abuser
Contoh
Arrow Anti Pattern
(Nested Conditional)
Refactoring
Contoh Arrow Anti Pattern
(Nested Conditional)
Solusi:
Flatten Conditional;
Replace w/ Guard Clause
Guard clause:
inverting the if-clause expression and exiting the code block if the new expression is
satisfied.
Replace Nested Conditional with Guard Clause is available if there's an if statement
that lasts until the end of the method body. If applied, this refactoring reverses the
condition and exits the method if it's true. As the result, the entire body of the
previous if clause is unindented.
Code Smells: Dispensable
Dimas Rafi Ramaharmuzi
Dispensable
Dead
Code
Duplicate
Comments
Code
Data Lazy
Class Class
Speculative
Generality
Comments
Terdapat banyak komentar pada
method akibat penamaan variabel,
method, dll yang tidak meaningful.
Penamaan class, variabel, method, dll
dalam code harus jelas dan
meaningful agar tercipta Self
Documenting Code.
Kapan comments
diperbolehkan:
1. Menjelaskan
alasan dari sesuatu
2. Menjelaskan alur
suatu algoritma
kompleks
Contoh Comments
Refactoring Comments
Solusi:
Penamaan ulang
Contoh Penggunaan Comments untuk Menjelaskan Algoritma
Duplicate Code
Beberapa code yang hampir sama atau identik.
Suatu code termasuk Duplicate Code apabila melakukan fungsional yang
sama, walaupun algoritmanya berbeda.
Contoh Duplicate Code
Apabila terdapat dua fungsional dengan algoritma yang berbeda, pilih algoritma
yang paling optimal.
Solusi:
Substitute algorithm
Lazy Class
Class yang tidak melakukan banyak fungsional atau hampir tidak terpakai.
Contoh
Sebuah startup yang baru berdiri
dengan kantor yang kecil tidak
memerlukan seorang Cleaning
Service hanya untuk mengerjakan
tugas membersihkan ruangan.
Tugas tersebut bisa ditambahkan
ke jobdesk tiap karyawan
Refactoring Lazy Class
Tugas membersihkan ruangan bisa ditambahkan ke jobdesc tiap karyawan.
Solusi:
Inline class
Data Class
Contoh
Class yang fungsionalnya hanya
menyimpan data.
Data class menjadi class yang hanya
menampung data-data yang dipakai
oleh class lain.
Refactoring Data Class
Solusi:
Encapsulate Field
Dead Code
Variabel, parameter, field, method,
atau class yang tidak lagi digunakan Penyebab:
(karena sudah usang). 1. Tidak dilakukan pembersihan pada
code-code yang lama, ketika terjadi
perubahan atau pembenahan pada
code
2. Ketika ada suatu percabangan yang
tidak pernah tercapai pada operasi
kondisional yang kompleks.
Contoh Dead Code
Solusi:
Hapus code yang sudah tidak digunakan
Speculative Generality
Adanya suatu class, method, variabel,
dan parameter yang tidak berguna
karena programmer terlalu jauh
memikirkan pengembangan aplikasi
tersebut di masa depan (Analysis
Paralysis)
Analysis Paralysis:
Suatu keadaan over-analisis situasi sehingga keputusan atau tindakan
tidak pernah dilakukan
Contoh Speculative Generality Contoh:
Sebuah startup memiliki beberapa tahap
pendanaan hingga akhirnya sampai pada
tahap pendanaan IPO (Initial Public
Offering). Tapi untuk sampai pada tahap
itu, diperlukan waktu 5-10 tahun.
Pada code di samping, terdapat
Speculative Generality karena
programmer menyiapkan fungsi yang
tidak digunakan saat ini.
Solusi:
Inline Method
Code Smells: Couplers
Dimas Rafi Ramaharmuzi
Couplers
Inappropriate
Intimacy
Feature Message
Envy Chain
Middle
Man
Coupling
Coupling adalah tingkat
interdependensi antar modul. Low
coupling (loose atau weak)
menunjukkan struktur dan desain yang
baik.
Efek Tight Coupling
1. Perubahan pada satu modul
menyebabkan modul lainnya berubah
(Ripple Effect)
2. Penggabungan modul membutuhkan
usaha lebih karena interdependensi
antar modul
3. Modul sulit di-reuse karena dependen
dengan modul lain (modul yang
dependen harus disertakan)
Feature Envy
Method yang banyak mengakses data dari objek
lain daripada class dari method itu sendiri.
Contoh
CMO mempunyai tugas untuk
mempromosikan produk-produk dari
startup tempat dia bekerja.
Suatu hari, dia harus mempromosikan
engine dan framework yang
dikembangkan oleh startupnya untuk
menarik investor.
Untuk mengetahui teknologi
tersebut,maka CMO harus bertanya
kepada CTO.
Contoh Feature Envy
Refactoring Feature Envy
Refactoring Feature Envy
Inappropriate Intimacy
Class yang mengakses internal field dan method dari class lain.
Inappropriate Intimacy melanggar konsep Encapsulation dan Information
Hiding.
Refactoring Inappropriate Intimacy
Solusi:
Hide Delegate
Message Chains
Rangkaian code yang membentuk pola $a->b()->c()->d( ).
Melanggar Law of Demeter.
Contoh
Contoh Message Chains
Contoh Message Chains
Contoh Message Chains
Contoh Message Chains
Refactoring Message Chains
Refactoring Message Chains
Refactoring Message Chains
Middle Man
Class yang tugasnya hanya mendelegasikan fungsi ke class lain.
Solusi:
Remove Middle Man
Modularization Code Smell
MUHAMMAD ADITYA HASRY
What is Modularization ?
Modularization is the process of dividing a software
system into multiple independent modules where
each module works independently.
Modularization Principle
- Localize related data and methods
- Decompose abstractions to manageable size
- Create acyclic dependencies
- Limit dependencies
Modularization Smell
- Broken Modularization
- Insufficient Modularization
- Cyclically-dependent Modularization
- Hub-Like Modularization
Broken Modularization
This smell arises when data and/or methods that ideally should have been localized into a single abstraction
are separated and spread across multiple abstractions.
Broken Modularization Example
How to fix it?
Insufficient Modularization
This smell arises when an abstraction exists that has not been completely decomposed, and a further
decomposition could reduce its size, implementation complexity, or both.
Insufficient Modularization Example
How to fix it?
Cyclically-dependent Modularization
This smell arises when two or more abstractions depend on each other directly or indirectly (creating a
tight coupling between the abstractions).
Cyclically-dependent Modularization Example
How to fix it?
Hub-Like Modularization
This smell arises when an abstraction has dependencies (both incoming and outgoing) with a large number
of other abstractions.
Hub-Like Modularization Example
How to fix it?
WHAT IS HIERARCHY ?
Hierarchy Smells
Muhammad Aditya Hasry
WHAT IS HIERARCHY ?
Hierarchy in software engineering means concept of separating
concern into several layers that differentiate by level
HIERARCHY PRINCIPLE
Apply meaningful generalization
Ensure substitutability
Avoid redundant paths
Ensure proper ordering
HIERARCHY SMELL
Missing Hierarch
Unnecessary Hierarchy
Unfactored Hierarchy
Wide Hierarchy
Speculative Hierarchy
Deep Hierarchy
Rebellious Hierarchy
MISSING HIERARCH
This smell arises when a code segment uses conditional logic (typically in conjunction with “tagged types”) to explicitly
manage variation in behavior where a hierarchy could have been created and used to encapsulate those variations.
MISSING HIERARCHY EXAMPLE
HOW TO FIX IT ?
UNNECESSARY HIERARCHY
This smell arises when the whole inheritance hierarchy is unnecessary, indicating that inheritance has been applied
needlessly for the particular design context.
UNNECESSARY HIERARCHY EXAMPLE
HOW TO FIX IT ?
UNFACTORED HIERARCHY
This smell arises when there is unnecessary duplication among types in a hierarchy
UNFACTORED HIERARCHY EXAMPLE
HOW TO FIX IT ?
WIDE HIERARCHY
This smell arises when an inheritance hierarchy is “too” wide indicating that intermediate types may be missing
WIDE HIERARCHY EXAMPLE
HOW TO FIX IT ?
SPECULATIVE HIERARCHY
This smell arises when one or more types in a hierarchy are provided speculatively
(i.e., based on imagined needs rather than real requirements).
SPECULATIVE HIERARCHY EXAMPLE
HOW TO FIX IT ?
DEEP HIERARCHY
This smell arises when an inheritance hierarchy is “excessively” deep
DEEP HIERARCHY EXAMPLE
HOW TO FIX IT ?
REBELLIOUS HIERARCHY
This smell arises when a subtype rejects the methods provided by its supertype(s).
In this smell, a supertype and its subtypes conceptually share an IS-A relationship, but some methods defined in
subtypes violate this relationship
REBELLIOUS HIERARCHY EXAMPLE
HOW TO FIX IT ?