Apa Itu Decorator ?

Secara sederhana Decorator adalah sebuah fungsi yang membungkus fungsi yang lain. Decorator digunakan dalam kondisi di mana sebuah objek memiliki responsibility yang didapatkan dari objek yang lain. Responsibility ini menyebabkan adanya nilai tambah pada objek tersebut.

Apa Keuntungan Penggunaan Decorator ?

Dengan Decorator Pattern, didapatkak keuntungan-keuntungan sebagai berikut :

  1. More flexibility then static inheritance. Decorator Pattern fleksibel dalam menambahan responsibilitas pada objek dibandingkan dengan memiliki banyak inheritance di dalam objek ConcreteComponent. Dengan decorator, responsibilitas dapat ditambahkan maupun dikurangi dengan cara yang sederhana (dengan attach dan detach). Jika dengan cara biasa, kita harus membuat multiple inheritance pada objek secara manual.
  2. Avoids feature-laden classes high up in the hierarchy. Decorator Pattern menawarkan cara yang adil dalam memberikan responsibilitas. Pada kasus yang lebih kompleks, kita dapat dengan mudah menambahkan responsibilitas tanpa harus meng-inheritance objek fitur sebelum ditambahkan. Konsep Decorator Pattern dapat dianalogikan kita membeli apa yang kita gunakan. Dengan konsep ini, objek ConcreteDecorator dapat berdiri tanpa harus dependent ke objek ConcreteComponent.
  3. A decorator and its component aren’t identical. Objek Decorator bertindak layaknya objek transparant, di mana saat ditambahkan, ConcreteComponent tidak perlu menginisiasi objek ConcreteDecorator secara jelas. Ini akan meningkatkan fleksibilitas dalam penulisan inheritance objek.
  4. Lots of little objects. Dengan konsep Decorator Pattern, memungkinkan akan menghasilkan banyak objek spesifik. Masing-masing fitur direpresentasikan pada objek ConcreteDecorator yang berbeda-beda. Ini memberikan keleluasaan untuk memodifikasi fitur yang ada di dalamnya. Untuk itu, dibutuhkan dokumentasi teknis agar kita dapat memahami peran masing-masing objek.

Baca Juga : Bekerja lebih produktif dengan docker

Bagaimana Penggunaan Decorator Pada Bahasa Python ?

penggunaan dan pembuatan decorator pada bahasa cukup simple dan sederhana, perhatikan kode dibawah ini :

def decorateMyFunction(originalFunction):
    '''Decorates a function by wrapping its return value in a pair of HTML paragraph tags.'''
    def addAdditionalText():
        obtain string returned by original function
        add text to the string
        return new string
    return addAdditionalText
 
 
@decorateMyFunction
def functionToBeDecorated():
	return True

Studi Kasus

Buat sebuah decorator untuk memvalidasi user login dengan status email verified = True

Perhatikan struktur table auth_user dan account_emailaddress dibawah ini :

CREATE TABLE auth_user (
	id serial NOT NULL,
	last_login timestamptz NULL,
	username varchar(150) NOT NULL,
	first_name varchar(30) NOT NULL,
	last_name varchar(150) NOT NULL,
	email varchar(254) NOT NULL,
	is_staff bool NOT NULL,
	is_active bool NOT NULL,
	date_joined timestamptz NOT NULL
);
 
 
CREATE TABLE account_emailaddress (
	id serial NOT NULL,
	email varchar(254) NOT NULL,
	verified bool NOT NULL,
	"primary" bool NOT NULL,
	user_id int4 NOT NULL
);

Method Decorator

Kita akan membuat validasi menggunakan decorator, dengan kondisi jika user login dengan email belum terverifikasi maka sistem akan memberikan informasi “Email Anda Belum Terverifikasi”, perhatikan kode dibawah ini :

from allauth.account.models import EmailAddress
 
def email_verified(function):
    def wrapper(request, *args, **kw):
        user=request.user
        chek_user = EmailAddress.objects.filter(user_id=user.id)
        if chek_user:
            chek_user = chek_user.first()
            if chek_user.verified is False :
                return HttpResponseRedirect('/users/no-email-verification')
            else:                
                return function(request, *args, **kw)
        else:
            return HttpResponseRedirect('/')
    return wrapper

Implementasi Method Decorator

seperti yang telah kita jelaskan diatas, implementasi Decorator pada bahasa python cukup sederhana, pehatikan kode dibawah ini :

 

from apps.utils import email_verified
 
 
class DashboardTemplateView(TemplateView):
    template_name = 'home/index.html'
 
    @method_decorator(email_verified)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

 

 

Baca artikel lainya :