-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path10g-objectComposition.js
executable file
·184 lines (166 loc) · 6.25 KB
/
10g-objectComposition.js
1
2
3
4
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/**
* --Object Composition--
* fitur pewarisan pada class begitu memudahkan developer dalam memangkas
* - duplikasi kode. kita tidak perlu repetitif menuliskan kode yang sama ketika dua class
* - atau lebih memliki memampuan yang sama.
* namun apakah pewarisan di JS dapat memecahkan masalah apapun?
*
* di dunia nyata, ada banyak peran dari seorang developer dengan tiga peran penting yang
* familiar seperti frontend dev, backend dev dan devOps serta fullstack.
* semuanya masuk ke dalam kategori developer dan mampu menulis serta mengubah kode.
* selain itu, terdapat kemampuan yang spesifik dari mereka pada perannya masing2.
*
* frontend dev yang membangun antar muka( UI),
* backend dev membangun API
* devOps mendeploy aplikasi.
* fullstack adalah satu satunya peran yang mampu melakukan banyak hal. disamping menulis kode,
* dia juga mampu membangun antarmuka, membangun API dan mendeploy.
*
* jika kita gambarkan skenario diatas dalam konsep OOP maka developer merupakan superclass sedangkan
* frontend dev, backend dan devops merupakan subclass. struktur pewarisannya sbb:
*/
{
class Developer {
constructor(name){
this.name = name;
}
commitChanges (){
console.log(`#{this.name} is commiting changes ...`);
}
}
class frontEndDeveloper extends Developer {
buildUI(){
console.log(`${this.name} is building UI ...`);
}
}
class backEndDeveloper extends Developer {
buildAPI(){
console.log(`${this.name} is building API ...`);
}
}
class devOps extends Developer {
deployApp (){
console.log(`${this.name} is deploying app`)
}
}
}
// seluruh class terdefinisi dg baik tetapi kurang class fullStack Developer.
//karena sifat dari fullstack dev ada keseluruhan dari class di atas maka akan tidak efektif
// menuliskan kode seluruh metod class diatas(kelas sebelumnya) ke dalam milik fullstack. maka cara yang plg mudah adlh
// tidak menggunakan teknik inheritance tetapi menggunakan teknik object composition.
// maka dr itu dg object composition, kode distruktur berdasarkan kemampuan yang dilakukan
//sbb :
class Developer {
constructor (name){
this.name = name;
}
commitChanges(){
console.log(`${this.name} is committing ...`);
}
}
function canBuildUI(developer){
return {
buildUI: ()=>{
console.log(`${developer.name} is building UI ...`);
}
}
}
function canBuildAPI(developer){
return {
buildAPI: ()=> {
console.log(`${developer.name} is building API ...`)
}
}
}
function canDeployApp(developer){
return {
deployApp: ()=> {
console.log(`${developer.name} is deploying app ...`)
}
}
}
// dengan memecah kode berdasarkan kemampuan, kedepannya akan lebih mudah membuat objek dengan peran apapun
// tanpa ada kode yang repetitif
// agar lbh mudah membuat objek, kita buat fungsi sebagai object creator dg komposisi kemampuan yang dibutuhkan.
// lalu kita delegasikan kemampuan2 tsb ke objek dg method Object.assign()
function createFrontEndDeveloper(name){
const developer = new Developer(name);
return Object.assign(developer, canBuildUI(developer));
}
function createBackEndDeveloper(name){
const developer = new Developer(name);
return Object.assign(developer, canBuildAPI(developer));
}
function createDevOps(name){
const developer = new Developer(name);
return Object.assign(developer, canDeployApp);
}
function createFullStackDev(name){
const developer = new Developer(name);
return Object.assign(developer, canBuildAPI(developer), canBuildUI(developer), canDeployApp(developer));
}
// implementasi kode lengkapnya dibawah ini
{
class Developer {
constructor(name) {
this.name = name;
}
commitChanges() {
console.log(`${this.name} is committing changes...`);
}
}
function canBuildUI(developer) {
return {
buildUI: () => {
console.log(`${developer.name} is building UI...`);
}
}
}
function canBuildAPI(developer) {
return {
buildAPI: () => {
console.log(`${developer.name} is building API...`);
}
}
}
function canDeployApp(developer) {
return {
deployApp: () => {
console.log(`${developer.name} is deploying app...`);
}
}
}
function createFrontEndDeveloper(name) {
const developer = new Developer(name);
return Object.assign(developer, canBuildUI(developer));
}
function createBackEndDeveloper(name) {
const developer = new Developer(name);
return Object.assign(developer, canBuildAPI(developer));
}
function createDevOps(name) {
const developer = new Developer(name);
return Object.assign(developer, canDeployApp(developer));
}
function createFullStackDeveloper(name) {
const developer = new Developer(name);
return Object.assign(developer, canBuildUI(developer), canBuildAPI(developer), canDeployApp(developer));
}
const frontEndDeveloper = createFrontEndDeveloper('Fulan');
frontEndDeveloper.commitChanges();
frontEndDeveloper.buildUI();
console.log(`is ${frontEndDeveloper.name} developer? `, frontEndDeveloper instanceof Developer);
const backEndDeveloper = createBackEndDeveloper('Fulana');
backEndDeveloper.commitChanges();
backEndDeveloper.buildAPI();
console.log(`is ${backEndDeveloper.name} developer? `, backEndDeveloper instanceof Developer);
const devOpsDeveloper = createDevOps('Fulani');
devOpsDeveloper.commitChanges();
devOpsDeveloper.deployApp();
console.log(`is ${devOpsDeveloper.name} developer? `, devOpsDeveloper instanceof Developer);
const fullStackDeveloper = createFullStackDeveloper('Fulanah');
fullStackDeveloper.buildUI();
fullStackDeveloper.buildAPI();
fullStackDeveloper.deployApp();
console.log(`is ${fullStackDeveloper.name} developer? `, fullStackDeveloper instanceof Developer);
}