Fakultas Ilmu Komputer UI

2019-04-16-minimizing-function-on-adapter-pattern.md 3.7 KB
Newer Older
1
2
3
---
layout: post
title: Minimizing Function on Adapter Pattern
4
date: 2019-04-16 08.12.10 +0700
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
author: ragil
---

Clean Code merupakan hal wajib yang dilakukan oleh seorang programmer untuk
dapat menulis kode yang berkualitas. Dari seorang penulis di Medium, beberapa
syarat Clean Code adalah:

<!--more-->

1. It should be elegant — Clean code should be pleasing to read. Reading it should make you smile the way a well-crafted music box or well-designed car would.
2. Clean code is focused —Each function, each class, each module exposes a single-minded attitude that remains entirely undistracted, and unpolluted, by the surrounding details.
3. Clean code is taken care of. Someone has taken the time to keep it simple and orderly. They have paid appropriate attention to details. They have cared.
4. Runs all the tests
5. Contains no duplication
6. Minimize the number of entities such as classes, methods, functions, and the like.

Salah satu hal yang saya ingin fokuskan di sini adalah poin nomor 5 dan 6. Dalam implementasinya
saya diharuskan untuk membuat sebuah adapter pattern yang menyambungkan elastic dan app tim kami.
Kenapa harus melalui app? Karena elastic tidak punya skema otentikasi sendiri, sehingga semua orang
bisa mengakses, karenanya diperlukan sebuah gerbang untuk hal itu. Kodenya dapat dilihat di
[sini.](https://gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2019/PPLC7/blob/development/backend/services/elasticsearch.py)

Dalam kode tersebut saya bertujuan untuk mem-filter data dari frontend ke elastic dengan berbagai
perbedaan nama variabel. Hal ini bertujuan untuk memudahkan frontend. Dalam eksekusi-nya
bisa saja untuk membuat tiap fungsi yang bertujuan untuk melakukan filter khusus, namun hal ini
hanya akan menghasilkan banyak duplikasi kode. Karena hal tersebut, kode yang dibuat diusahakan
se-generic mungkin, contoh:
```py
for k, v in kwargs.items():
    if k in args_mapping.keys():
        mapping = args_mapping[k]
        path = mapping["path"]
        func = mapping["func"]
        others = mapping["others"]

        now = {}
        current = now
        for key in path[:-1]:
            current[key] = {}
            current = current[key]
        current[path[-1]] = func(v)

        for ko, vo in others.items():
            current[ko] = vo

        field.append(now)

for path, v in additional:
    now = {}
    current = now
    for key in path[:-1]:
        if key not in current:
            current[key] = {}
        current = current[key]

    current[path[-1]] = v
    field.append(now)

body["query"]["bool"]["filter"] = field
return cls.fetch(body)

```

Lalu bagaimana membedakan perlakuan tiap variable? Hanya perlu membuat mapping
fungsi-fungsi untuk memperlakukan variable tersebut.
```py
args_mapping = {
    "source_ip": {
        "path": ["term", "IP.src.keyword"],
        "func": lambda x: x,
        "others": {},
    },
    "destination_ip": {
        "path": ["term", "IP.dst.keyword"],
        "func": lambda x: x,
        "others": {},
    },
    "attack_type": {
        "path": ["term", "class.keyword"],
        "func": lambda x: x,
        "others": {},
    },
    "id": {"path": ["term", "_id"], "func": lambda x: x, "others": {}},
    "start_timestamp": {
        "path": ["range", "@timestamp", "gte"],
        "func": lambda time: time.strftime("%Y-%m-%dT%H:%M:%S"),
        "others": {"format": "yyyy-MM-dd'T'HH:mm:ss"},
    },
    "end_timestamp": {
        "path": ["range", "@timestamp", "lte"],
        "func": lambda time: time.strftime("%Y-%m-%dT%H:%M:%S"),
        "others": {"format": "yyyy-MM-dd'T'HH:mm:ss"},
    },
}

```

Dalam kode tersebut juga diimplementasikan Adapter Pattern, salah satu Design Pattern.
Ada banyak lagi Design Pattern, seperti Singleton, Decorator, Factory dan sebagainya.