Python-Refactoring: 101

Hello guys! Menurut kalian apasih refactoring itu? Refactoring itu bukan hanya sekedar menulis ulang kode supaya lebih cantik, namun refactoring merupakan proses incremental dalam meningkatkan kualitas kode dengan melakukan perubahan pada bagian-bagian yang kecil.

Pada umumnya, setiap kali kita menulis kode pemrograman, dalam python maupun bahasa lain, kita memulai dari mencari bagaimana solusi dalam menyelesaikan masalah. Pada masa ini, mencari solusi yang memiliki kualitas yang terbaik sangatlah sulit untuk langsung didapatkan. Solusi juga beraneka ragam sehingga bukanlah tidak mungkin jika solusi yang kita temui adalah solusi yang buruk, lambat, dan sulit untuk dimengerti.

Pada TDD penggunaan metode refactoring terletak setelah tes lulus. Ketika tes telah lulus, pengembang akan berfokus pada 'refactoring' dimana memperbaiki kode untuk menjadi lebih cepat, mudah dibaca, dan mengikuti best practices.

Refactoring pada dasarnya juga dibutuhkan pada kode-kode yang tergolong tua (dibuat sudah lama) untuk dapat diubah menjadi baris yang lebih modern dan standar, membolehkan fungsionalitas yang awalnya tidak ada.

https://usercontent2.hubstatic.com/8530569.gif


Menentukan Tujuan

Sebelum berusaha melakukan refactor pada kode python kita, sangatlah dianjurkan untuk memiliki gambaran yang jelas dari tujuan yang ingin dicapai dengan melakukan refractoring. Secara umum mungkin dapat dibagi menjadi 4 tujuan utama:

1. Membuat kode mudah dibaca oleh diri sendiri dan orang lain.
2. Membuat kode yang reusable, mudah ditambahkan fungsi lain ataupun digunakan dengan fungsi lain.
3. Mengurangi lamanya kode dalam memproses karena ketidakefektifan.
4. Mengurangi memori yang dibutuhkan dalam memproses.

Kadangkala ditemukan juga konflik diantara tujuan-tujuan tersebut. Sebagai contoh dalam python rekursif membutuhkan penulisan kode yang sangat sedikit dibandingkan dengan menggunakan fungsi loop, namun mungkin saja tidak dianjurkan karena performanya yang cenderung lebih buruk.

Alloca-refactor

Dengan mengacu pada beberapa panduan dan contoh dalam bahasa Ruby oleh Martin Fowler pada websitenya, kami berusaha mengimplementasikan proses refractoring pada aplikasi berbahasa Python kami.

MVC

Pada implementasi proyek kami, kami menggunakan framework yaitu Flask yang membantu kita untuk membangun sebuah backend menggunakan python. Framework itu sendiri merupakan sebuah MVC (Model-View-Controller) dan merupakan bagian dari design pattern. MVC termasuk ke dalam behavioral patern yang mengidentifikasi kesamaan cara komunikasi antar objek. MVC memisahkan komponen-komponen implementasi sebuah Model, View, dan Controller.

Model

Model mewakili struktur data yang berisi fungsi-fungsi yang membantu seseorang dalam pengelolaan basis data seperti memasukkan data, pembaruan, dan lainnya.

View

View merupakan bagian yang mengatur tampilan kepada pengguan.

Controller

Controller merupakan bagian yang menjembatani model dan view. Berfungsi sebagai 'kontrol' yaitu menyimpan proses-proses yang dapat dilakukan dalam mengolah data dari model dan memberikannya kepada view yang tepat.

Explicit code

Walaupun banyak hal ajaib yang dapat dilakukan oleh Python, yang sering kita sebut dengan black magic, namun cara yang paling explisit lebih diutamakan karena mudah dimengerti. Contoh:

Ubah:
def make_complex(*args):
x, y = args
return dict(**locals())
Menjadi:
def make_complex(x, y):
return {'x': x, 'y': y}
1 Statement Per-Baris

Merupakan bad practice untuk menumpuk pernyataan pada satu baris kode. Contoh:

Ubah:
print 'one'; print 'two'
if x == 1: print 'one'
if <complex comparison> and <other complex comparison>:
# do something
Menjadi:
print 'one'
print 'two'
if x == 1:
print 'one'
cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
# do something
Jangan Pakai Jalan Pintas

Python merupakah bahasa yang sangat fleksibel dan memiliki banyak trik untuk dapat menyelesaikan masalah. Namun, sangat disarankan untuk menghindari:
1. Merubah cara objek dibuat.
2. Merubah cara interpreter python mengubah modul.
3. Meng-embed kode C dalam Python.

Flake8

Flake8 merupakan linter yang menjaga kita untuk dapat menuliskan kode dengan rapih dan best practice sehingga guideline dalam menuliskan kode dalam tim dapat teratur.

Manipulasi List


Beberapa cara yang baik dan buruk untuk memanipulasi list:


Buruk:
a = [3, 4, 5]
b = []
for i in a:
if i > 4:
b.append(i)
Baik:
a = [3, 4, 5]
b = [i for i in a if i > 4]
# Or:
b = filter(lambda x: x > 4, a)
Buruk:
a = [3, 4, 5]
for i in range(len(a)):
a[i] += 3
Baik:
a = [3, 4, 5]
a = [i + 3 for i in a]
# Or:
a = map(lambda i: i + 3, a)
Gunakan enumerate untuk mengingat indeks pada loop:
a = [3, 4, 5]
for i, item in enumerate(a):
print i, item
# prints
# 0 3
# 1 4
# 2 5
Enumerate sangat optimal terhadap iterator dan mempermudah cara membaca.

Membuka File

Gunakan 'with open' agar file tidak lupa ditutup walaupun terdapat exception di tengah blok.

Baik:
f = open('file.txt')
a = f.read()
print a
f.close()
Baik:
with open('file.txt') as f:
for line in f:
print line

Demikian beberapa ilmu refactoring yang dapat kami bagikan kepada kalian selama pengembangan perangkat lunak kami, semoga bermanfaat ya!

0 komentar:

Post a Comment