lifelong learner — urip iku urup, currently working on accenture.

3 Langkah Cara Membuat Kode Tersusun Rapi dan Terkonfigurasi dengan Baik

0
Degananda.com -
configurable
membuat kode terkonfigurasi dan terstruktur dengan baik.

Seorang developer yang baik dan telah berpengalaman akan memastikan bahwa kode yang dibuat memiliki variabel-variabel yang dapat dikonfigurasi dengan mudah. Terutama apabila kode tersebut memiliki depedency (ketergantungan) dengan environment maupun class lainnya.

pastikan tidak ada konfigurasi yang di hardcode (ditulis secara manual) pada baris kode. Karena ini dapat membuat kekacauan pada saat proses staging deployment.

Konfigurasi tidak hanya sebatas memasukan variabel-variabel environment pada suatu file, tetapi tata cara penulisan kode dalam pembuatan class yang akan dikonsumsi oleh class lain juga harus diperhatikan. Sehingga harus dipastikan bahwa class yang ditulis terkonfigurasi dengan baik.

3 Langkah Cara Membuat Kode Tersusun Rapi yang Dapat di Konfigurasi

Langkah 1 – Mengkonversi penulisan if else menjadi bentuk mapping

Pada class Person terdapat proses untuk mengkategorikan jenis kegiatan / activity berdasarkan dari umur orang (person).

class Person {
  name ?: string | null;
  age ?: number | null;
  constructor(name : string, age : number){
    this.name = name;
    this.age = age;
  }
  getActivity(age : number){
    if(age <= 17 && age >= 12){
      return 'outdoor activity';
    } else if(age > 17 && age <= 63){ return 'office work activity'; } else if(age > 63){
      return 'rest'
    }
  }
}
const dega = new Person('degananda', 26);
console.log(dega.getActivity(Number(dega.age)));

penulisan kode diatas sepintas tidak memiliki kekurangan.

snippet_typescript_tslint_ok_semua.JPG
dari 19 baris kode, tidak ada yang tidak sesuai dengan kaidah penulisan typescript berdasarkan ts.lint

Berdasarkan inspeksi ts-lint (program untuk melakukan cek standarisasi atas syntax yang dituliskan pada typescript) pun tidak ada baris kode yang dituls dengan kaidah yang salah.

namun, sesungguhnya penulisan if-else seperti diatas akan membuat masalah dikemudian hari apabila akan membuat jenis aktivitas baru atau mengubah case aktivitas yang sudah ada.

Contohnya seperti merge conflict apabila terdapat developer lain yang mengubah class/file yang sama.

Kode diatas sangat tidak fleksible, untuk menambahkan case aktivitas baru maka perlu menuliskan kembali syntax “else if beserta bracket serta tanda kurung

Mengubah penulisan else if menjadi single liner

perubahan pertama yang harus dilakukan agar kode diatas menjadi lebih terstruktur dan terkonfigurasi adalah dengan menggubah penulisan if else menjadi single liner. Artinnya, setiap case akan dituliskan hanya dalam satu baris.

class Person {
  name ?: string | null;
  age ?: number | null;
  constructor(name : string, age : number){
    this.name = name;
    this.age = age;
  }
  getActivity(age : number){
    const actvity =
    (age <= 17 && age >= 12) ? 'outdoor activity'
    : (age > 17 && age <= 63) ? 'office work activity' : (age > 17 && age <= 63) ? 'rest' : 'other activity';
    return actvity;
    }
  }
const dega = new Person('degananda', 26);
console.log(dega.getActivity(Number(dega.age)));

hal ini akan mengurangi jumlah syntax yang harus dituliskan oleh developer. Tidak perlu lagi untuk menuliskan “else”, “if” pada setiap case.

Langkah 2 – Memastikan kode dapat mengakomodasi penambahan aktivitas dimasa mendatang

kode diatas hanya dapat mengakomodasi satu jenis aktivtas atau activity berdasarkan dari umurnya. Lalu bagaimana apabila, dimasa mendatang terdapat kebutuhan bisnis untuk mengakmodasi beberapa aktivitas.

Sehingga sangat penting untuk memastikan bahwa kode yang ditulis dapat mengakomodasi lebih dari satu output. Untuk kebutuhan dimasa mendatang sehingga tidak perlu melakukan refactoring.

maka yang perlu dilakukan yakni kode harus dapat mengembalikan suatu array dari activity dan mengubah nama fungsi getActivity menjadi getActivitiesByAge (plural) serta ditambahkan jenis dari filternya. pada kasus ini filter berdasarkan umur dari orang tersebut.

class Person {
  name ?: string | null;
  age ?: number | null;
  activity ?: Array<String>  = ['outdoor', 'office work', 'rest'];
  constructor(name : string, age : number){
    this.name = name;
    this.age = age;
  }
  getActivitiesByAge(age : number){
    const activities =
    (age <= 17 && age >= 12) ? this.getActivities('1')
    : (age > 17 && age <= 63) ? this.getActivities('0,1') : (age > 17 && age <= 63) ? this.getActivities('2') : 'other activity'; return activities; } getActivities(activityIndexes : String){ const activities = activityIndexes.split(',').map((val) => {
    return typeof(this.activity) !== "undefined" && Number(val) <= this.activity.length ? this.activity[Number(val)] : null;
    });
    return activities;
  }
}
const dega = new Person('degananda', 26);
console.log(dega.getActivitiesByAge(Number(dega.age)));

kode diatas akan menghasilkan output sebagai berikut ini

[ 'outdoor', 'office work' ]

Langkah 3 – Membuat setiap proses memiliki class yang representable.

setiap aktivitas tentunnya dapat memiliki proses nya masing-masing. Sebagai contoh, aktitivas outdoor akan meliputi memanjat gunung, berkemah dan berkebun.

class Person {
	doActivity(age : number){
		(age <= 17 && age >= 12) ? { /*proses hiking, berkemah berkebun*/}
		: (age > 17 && age <= 63) ? { /*proses bekerja di kantor, bekerja di rumah */ } : (age > 17 && age <= 63) ? { /*proses istirahat dirumah */ } : /*proses aktivitas lain */;
	}
}

penulisan aktivitas-aktivitas detail dimasing-masing kondisi sangatlah salah. Ingat bahwa proses aktivitas tersebut berada di class Person. Sehingga menuliskan detail aktivitas pada kelas tersebut sangat tidak relevan. Setiap proses aktivitas harus memiliki kelasnya masing-masing.

pendetailan aktivitas di kelas yang baru akan membuat kode menjadi lebih mudah untuk dikonfigurasi dan terstruktur. Serta kelas person akan lebih terfokuskan hanya untuk hal-hal terkait person/orang.

Sehingga, berikut adalah cara penulisan detial aktivitas yang baik dengan cara menggunakan kelas-kelas tersendiri.

class Person {
  name ?: string | null;
  age ?: number | null;
  activity ?: Array<String>  = ['outdoor', 'office work', 'rest'];
  constructor(name : string, age : number){
    this.name = name;
    this.age = age;
  }
  doActivities(activityIndexes : String){
  activityIndexes.split(',').map((val) => {
      if(typeof(this.activity) !== "undefined" && Number(val) <= this.activity.length){
        switch(this.activity[Number(val)]){
          case 'outdoor':
            const outDoor : OutdoorActivity = new OutdoorActivity()
          break;
          case 'office ork':
            const officeWork : OfficeworkActivity = new OfficeworkActivity()
          break;
          case 'rest':
            const restActivity : RestActivity = new RestActivity()
          break;
          default:
        }
      }
    });
  }
}
class OutdoorActivity { }
class OfficeworkActivity { }
class RestActivity { }

sampai pada langkah 3, baris kode yang telah dituliskan telah terstruktur dengan baik untuk dilakukan unit testing dimasing-masing fungsi. Tidak perlu melakukan unit testing hingga 3x untuk mengakomodasi seluruh case karena fungsi doActivities menerima suatu string indexses.

selamat ber-koding ria !!

(Visited 18 times, 1 visits today)
Please follow and like us:

Leave a Reply