Pemrograman Modular

Pemrograman modular adalah cara bagaimana kita memecah kode kita yang sebelumnya dalam sebuah file besar menjadi kumpulan file-file kecil. Berikut contoh program transaksi saldo sederhana :

# april.nim

type 
  StatusTransaksi = enum 
    menungguPembayar | dibatalkan | berhasil

  Saldo = object
    id: string
    saldo: int

  Transaksi = object
    bcId: string # pengirim 
    ccId: string # penerima
    nominal: int # jumlah yang diterima
    status: StatusTransaksi
    deskripsi: string

var saldoNasabah : []Saldo = [
  Saldo(id: "Anya", saldo: 10000),
  Saldo(id: "Elisabet", saldo: 5000)
]

proc efekSaldo(transfer: Transaksi) =
  for nasabah in saldoNasabah:
    if nasabah.id == transfer.bcId:
      nasabah.saldo -= transfer.nominal
    elif nasabah.id == transfer.ccId:
      nasabah.id += transfer.nominal

proc cekSaldo(id: string) =
  for saldo in saldoNasabah:
    if saldo.id == id:
      echo "-- Akun ditemukan --"
      echo "Nama : " & saldo.id
      echo "Saldo : " & saldo.saldo

proc transaksiBaru(pbcid: string, pccId: string,pnominal:int ,pdeskripsi: string) : Transaksi =
  return Transaksi(
    bcid:pid,
    ccId:pccId,
    deskripsi:pdeskripsi,
    nominal: pnominal,
    status: StatusTransaksi.menungguPembayar)

# aksi untuk membatalkan transaksi
proc batalkanTransaksi(self:Transaksi) =
  if self.status != berhasil:
    self.status = StatusTransaksi.dibatalkan
    echo "Transaksi " & self.deskripsi & " dibatalkan "
  else:
    echo "Transaksi yang berhasil tidak bisa dibatalkan"

# aksi untuk membayar transaksi
proc bayar(self: Transaksi) =
  if self.status != dibatalkan:
    efekSaldo(self)
    self.status = StatusTransksi
    echo "Berhasil membayar untuk " & self.deskripsi
  else:
    echo "Transaksi yang dibatalkan tidak bisa berhasil"

when isMainModule:
  cekSaldo("Anya")
  cekSaldo("Elisabet")

  var transferTeman = transaksiBaru("Anya","Elisabet",5000,"Subrek OnlyFans Elisabet")
  transferTeman.berhasil()

  cekSaldo("Anya")
  cekSaldo("Elisabet")

Sekarang kita akan membagi kode diatas sesuai dengan kegunaanya masing-masing (transaksi.nim,saldo.nim dan april.nim):

# transaksi.nim

import ./saldo

type 
  StatusTransaksi = enum 
    menungguPembayar | dibatalkan | berhasil

  Transaksi = object
    bcId: string # pengirim 
    ccId: string # penerima
    nominal: int # jumlah yang diterima
    status: StatusTransaksi
    deskripsi: string


proc transaksiBaru(pbcid: string, pccId: string,pnominal:int ,pdeskripsi: string) : Transaksi =
  return Transaksi(
    bcid:pid,
    ccId:pccId,
    deskripsi:pdeskripsi,
    nominal: pnominal,
    status: StatusTransaksi.menungguPembayar)

# aksi untuk membatalkan transaksi
proc batalkanTransaksi(self:Transaksi) =
  if self.status != berhasil:
    self.status = StatusTransaksi.dibatalkan
    echo "Transaksi " & self.deskripsi & " dibatalkan "
  else:
    echo "Transaksi yang berhasil tidak bisa dibatalkan"

# aksi untuk membayar transaksi
proc bayar(self: Transaksi) =
  if self.status != dibatalkan:
    efekSaldo(self)
    self.status = StatusTransksi
    echo "Berhasil membayar untuk " & self.deskripsi
  else:
    echo "Transaksi yang dibatalkan tidak bisa berhasil"


# saldo.nim

type
  Saldo = object
    id: string
    saldo: int

var saldoNasabah : []Saldo = [
  Saldo(id: "Anya", saldo: 10000),
  Saldo(id: "Elisabet", saldo: 5000)
]

proc efekSaldo(transfer: Transaksi) =
  for nasabah in saldoNasabah:
    if nasabah.id == transfer.bcId:
      nasabah.saldo -= transfer.nominal
    elif nasabah.id == transfer.ccId:
      nasabah.id += transfer.nominal

proc cekSaldo(id: string) =
  for saldo in saldoNasabah:
    if saldo.id == id:
      echo "-- Akun ditemukan --"
      echo "Nama : " & saldo.id
      echo "Saldo : " & saldo.saldo

#april.nim

import ./transaksi
import ./saldo


when isMainModule:
  cekSaldo("Anya")
  cekSaldo("Elisabet")

  var transferTeman = transaksiBaru("Anya","Elisabet",5000,"Subrek OnlyFans Elisabet")
  transferTeman.berhasil()

  cekSaldo("Anya")
  cekSaldo("Elisabet")

Bentuk folder kita sekarang:

+-[src]
|-- april.nim
|-- saldo.nim
|-- transaksi.nim
+- april.nimble

Pada file transaksi.nim dan april.nim kita mempunyai kata kunci import, import (atau sebutanya mengimpor) berguna untuk memanggil sebuah file lokal atau pustaka untuk isinya diguankan di program kita.

File transaksi.nim kita mengimpor file ./saldo (saldo.nim untuk import .nim tidak perlu ditulis, ./ berarti lokasi script yang mengimpor) karena didalam file transaksi kita menggunakan fungsi efekSaldo dari saldo.nim begitu juga di dalam file april.nim mengimpor file transaksi.nim dan saldo.nim.

Bagian ini sudah keluar dari pemahasan Nim dasar dan masuk pembahasan fitur khusus yang dimiliki Nim, jadi bagian buku setelah pembahasan ini sudah memasuki bagian khusus Nim, bila pernasaran bila melangkah ke bab lain.