- Published on
ComponentBase
- Authors
๐งฑ Modul 4 โ ComponentBase
- ๐งญ Prolog Modul: Posisi dan Peran Modul 4
- ๐ง Konteks Pengetahuan: Relasi Antar Modul
- ๐ฏ Tujuan Modul (Learning Objectives)
- ๐งฉ Masalah yang Diselesaikan Modul Ini
- ๐๏ธ Konsep Inti yang Diperkenalkan
- ๐ ๏ธ Desain Teknis & Arsitektur
- ๐งช Implementasi Bertahap (High-Level)
- 1. Mengidentifikasi Perilaku Umum Seluruh Komponen
- 2. Mendesain
ComponentBasesebagai Abstract Class - 3. Mendefinisikan Method Virtual (
begin(),update()) - 4. Menurunkan Class LED dari
ComponentBase - 5. Mengelola Komponen melalui Pointer Base Class
- 6. Menyederhanakan Logika
firmware.ino - ๐งพ Checklist Validasi (WAJIB LULUS)
- Catatan keras (dan penting)
- ๐งพ Validasi dan Pengujian
- ๐ Refleksi dan Keterkaitan ke Modul Lain
- ๐งญ Navigasi Modul
- ๐ Penutup Analitis
๐งญ Prolog Modul: Posisi dan Peran Modul 4
Modul 4 merupakan tulang punggung arsitektural dari seluruh rangkaian pengembangan firmware IoT modular berbasis ESP dan OOP. Modul ini ditempatkan secara strategis setelah firmware mampu membuat object secara runtime (Modul 3), namun sebelum sistem diperluas untuk menangani sensor, actuator, dan komunikasi jaringan.
Pada tahap ini, firmware telah memiliki sejumlah object yang berfungsi dengan baik, tetapi masih berdiri sendiri tanpa struktur pengikat yang seragam. Setiap komponen memiliki lifecycle dan antarmuka masing-masing, sehingga pengelolaan sistem secara keseluruhan mulai menjadi tidak efisien dan sulit dikembangkan.
Modul 4 menjawab permasalahan tersebut dengan memperkenalkan ComponentBase, sebuah base class yang mendefinisikan kontrak perilaku minimum bagi seluruh komponen firmware. Melalui kontrak ini, setiap komponen memiliki pola lifecycle yang konsisten dan dapat dikelola secara seragam.
Tanpa keberadaan Modul 4, firmware akan berkembang secara ad-hoc dan sulit diskalakan. Oleh karena itu, modul ini menjadi fondasi struktural wajib bagi Modul 5 hingga Modul 9, tempat kompleksitas sistem meningkat secara signifikan namun tetap terkendali.
๐ง Konteks Pengetahuan: Relasi Antar Modul
Modul 4 tidak memperkenalkan fitur baru, tetapi menyusun ulang cara firmware dikelola. Pemahaman dari modul sebelumnya bersifat wajib, bukan opsional.
๐ Prasyarat Konseptual
Modul 2 โ LED Modular dengan Class Wajib memahami:
- class sebagai abstraksi perangkat keras
- constructor sebagai titik inisialisasi
- pemisahan logika hardware dari
firmware.ino
Modul 3 โ Object dari JSON Wajib memahami:
- object dibuat saat runtime
- konfigurasi berasal dari data
firmware.inoberperan sebagai orchestrator sementara
Tanpa dua modul ini, konsep base class tidak bermakna secara praktis.
๐ Digunakan Kembali di Modul Selanjutnya
ComponentBase yang diperkenalkan di Modul 4 akan menjadi parent class langsung bagi hampir seluruh komponen firmware pada modul berikutnya:
- Modul 5 โ Interrupt dan Tombol
- Modul 6 โ Sensor Modular
- Modul 7 โ Actuator Modular
- Modul 8 โ MQTT Integration
- Modul 9 โ Final Project
Artinya: keputusan desain di Modul 4 mengikat seluruh arsitektur ke depan.
๐ฏ Tujuan Modul (Learning Objectives)
Setelah menyelesaikan Modul 4, pembaca harus mampu melakukan hal-hal berikut secara konkret:
- Mengidentifikasi kebutuhan base class ketika jumlah komponen bertambah
- Mendesain abstract class sebagai fondasi arsitektur firmware
- Mendefinisikan kontrak perilaku minimum (
begin(),update()) - Menggunakan inheritance secara terbatas dan terkontrol
- Mengelola berbagai komponen tanpa mengetahui tipe konkretnya
Jika tujuan ini tidak tercapai, firmware akan kembali jatuh ke pola ad-hoc.
๐งฉ Masalah yang Diselesaikan Modul Ini
Setelah Modul 3, firmware memang mampu membuat object secara dinamis, namun masih memiliki masalah struktural serius:
Setiap class memiliki antarmuka berbeda
Tidak ada cara umum untuk:
- memulai komponen
- memperbarui komponen
- mengiterasi komponen
firmware.inomulai mengandung:- logika spesifik komponen
- percabangan berbasis tipe
Sistem sulit dikembangkan tanpa menyentuh banyak bagian kode
Modul 4 menyelesaikan masalah ini dengan pendekatan berikut:
Mendefinisikan antarmuka umum untuk seluruh komponen
Menjadikan
firmware.inohanya bergantung pada base classMengubah firmware dari:
kumpulan object menjadi sistem komponen
๐๏ธ Konsep Inti yang Diperkenalkan
Konsep Utama
Modul ini memperkenalkan konsep yang langsung berdampak ke struktur kode:
Base class dan inheritance Digunakan untuk menyatukan antarmuka, bukan untuk pewarisan perilaku kompleks.
Abstract class dan virtual method Digunakan untuk mendefinisikan kontrak, bukan implementasi.
Kontrak perilaku komponen Setiap komponen wajib memiliki lifecycle yang sama.
Component-based architecture pada firmware Firmware dikelola sebagai kumpulan komponen dengan antarmuka seragam.
Konsep yang Tidak Dibahas di Modul Ini
Secara eksplisit tidak dibahas:
- Interrupt dan ISR
- Sensor spesifik
- Actuator spesifik
- MQTT dan komunikasi jaringan
Pembatasan ini disengaja agar fokus 100% pada arsitektur, bukan fitur.
๐ ๏ธ Desain Teknis & Arsitektur
Setelah Modul 4, firmware diperlakukan sebagai:
- Sekumpulan komponen dengan antarmuka yang sama
- Implementasi internal yang boleh berbeda
Peran ComponentBase:
- Mendefinisikan lifecycle komponen
- Menentukan method wajib yang harus diimplementasikan
- Menjadi satu-satunya tipe yang dikenal oleh
firmware.ino
Implikasi langsung:
firmware.inotidak tahu apakah komponen adalah LED, sensor, atau actuatorfirmware.inohanya memanggil method berdasarkan kontrak yang sama- Penambahan komponen tidak mengubah struktur utama firmware
Ini adalah titik di mana firmware resmi naik kelas secara arsitektural.
๐งช Implementasi Bertahap (High-Level)
Sub-bab ini menunjukkan transisi konkret dari firmware berbasis object bebas (Modul 3) menjadi firmware berbasis komponen dengan kontrak umum menggunakan ComponentBase.
1. Mengidentifikasi Perilaku Umum Seluruh Komponen
Perilaku minimum yang wajib dimiliki semua komponen firmware:
- Inisialisasi saat startup
- Update berkala di
loop()
Kontrak yang disepakati:
begin() โ dipanggil sekali di setup()
update() โ dipanggil berulang di loop()
2. Mendesain ComponentBase sebagai Abstract Class
ComponentBase.h
#ifndef COMPONENT_BASE_H
#define COMPONENT_BASE_H
class ComponentBase {
public:
virtual void begin() = 0;
virtual void update() = 0;
virtual ~ComponentBase() {}
};
#endif
Catatan teknis:
= 0โ abstract class- Destructor virtual โ aman untuk polymorphic delete
- Tidak ada logic
- Tidak ada dependensi Arduino
3. Mendefinisikan Method Virtual (begin(), update())
Kontrak final:
| Method | Dipanggil | Tujuan |
|---|---|---|
begin() | setup() | Inisialisasi komponen |
update() | loop() | Eksekusi berulang |
Tidak ada method lain. Kontrak minimal dan mengikat.
4. Menurunkan Class LED dari ComponentBase
LedController.h(REVISI)
#ifndef LED_CONTROLLER_H
#define LED_CONTROLLER_H
#include <Arduino.h>
#include "ComponentBase.h"
class LedController : public ComponentBase {
private:
uint8_t _pin;
bool _state;
public:
LedController(uint8_t pin);
void begin() override;
void update() override;
void on();
void off();
};
#endif
LedController.cpp(REVISI)
#include "LedController.h"
LedController::LedController(uint8_t pin)
: _pin(pin), _state(false) {}
void LedController::begin() {
pinMode(_pin, OUTPUT);
digitalWrite(_pin, LOW);
}
void LedController::update() {
_state = !_state;
digitalWrite(_pin, _state ? HIGH : LOW);
delay(1000);
}
void LedController::on() {
_state = true;
digitalWrite(_pin, HIGH);
}
void LedController::off() {
_state = false;
digitalWrite(_pin, LOW);
}
Perubahan penting:
- Lifecycle pindah ke
begin()/update() - LED sekarang komponen, bukan object bebas
5. Mengelola Komponen melalui Pointer Base Class
firmware.ino(REVISI TOTAL)
#include "ComponentBase.h"
#include "LedController.h"
ComponentBase* components[1];
void setup() {
components[0] = new LedController(2);
for (int i = 0; i < 1; i++) {
components[i]->begin();
}
}
void loop() {
for (int i = 0; i < 1; i++) {
components[i]->update();
}
}
Catatan teknis:
firmware.inotidak tahu jenis komponen- Tidak ada
digitalWrite - Tidak ada logika LED
- Semua berbasis kontrak
6. Menyederhanakan Logika firmware.ino
Hasil akhir:
firmware.ino:- hanya loop array komponen
- hanya panggil
begin()danupdate()
Penambahan komponen baru:
components[1] = new ButtonComponent(...);
Tidak ada perubahan struktur.
๐งพ Checklist Validasi (WAJIB LULUS)
- Firmware compile tanpa error
- LED tetap berkedip
-
firmware.inotidak menyebutLedControllerdi logic - Semua komponen diperlakukan sebagai
ComponentBase* - Penambahan komponen tidak mengubah loop utama
Jika satu poin gagal โ desain tidak sah.
Catatan keras (dan penting)
Setelah Modul 4:
- Tidak boleh lagi logic komponen di
firmware.ino - Semua modul berikutnya HARUS tunduk ke
ComponentBase
Jika aturan ini dilanggar, seluruh arsitektur runtuh.
๐งพ Validasi dan Pengujian
Validasi Modul 4 difokuskan pada pembuktian bahwa ComponentBase benar-benar berfungsi sebagai kontrak arsitektural, bukan sekadar konsep OOP.
1. Validasi Fungsional Dasar
LED tetap berfungsi setelah diturunkan dari
ComponentBaseFirmware harus tetap:- berhasil dikompilasi
- mengeksekusi
begin()danupdate() - menyalakan/mematikan LED sesuai implementasi
update()
Tidak ada perubahan perilaku hardware yang diizinkan.
2. Validasi Polimorfisme
firmware.inomenangani komponen melalui base class
Verifikasi langsung pada kode:
firmware.inohanya menyimpanComponentBase*- Tidak ada pemanggilan method spesifik
LedController - Tidak ada
#includeclass konkret selain saat instansiasi
Jika firmware.ino memerlukan cast โ validasi gagal.
3. Validasi Multi-Komponen
Tambahkan minimal satu komponen tambahan (contoh LED kedua):
components[0] = new LedController(2);
components[1] = new LedController(4);
Validasi lulus jika:
- Keduanya diinisialisasi melalui loop
begin() - Keduanya dieksekusi melalui loop
update() - Tidak ada percabangan berbasis tipe
4. Validasi Ketergantungan
Audit firmware.ino:
Tidak ada:
digitalWritepinMode- logika hardware
- dependensi ke class konkret
Satu-satunya ketergantungan yang sah:
ComponentBase*
5. Kriteria Lulus Modul 4
Modul 4 dinyatakan lulus apabila:
- Firmware berjalan stabil
- Komponen dapat ditambah tanpa mengubah struktur utama
firmware.inoberfungsi sebagai orchestrator murni- Seluruh interaksi berbasis kontrak
ComponentBase
Jika satu kriteria gagal โ arsitektur belum naik kelas.
๐ Refleksi dan Keterkaitan ke Modul Lain
Kondisi firmware setelah Modul 4:
- Seluruh komponen mematuhi kontrak yang sama (
begin(),update()) firmware.inotidak bergantung pada implementasi konkret- Penambahan komponen tidak mengubah struktur eksekusi utama
Implikasi langsung:
- Firmware dapat diskalakan tanpa merusak arsitektur
- Lifecycle komponen dapat dikontrol secara terpusat
- Sistem siap diuji dengan beban dan kompleksitas yang lebih tinggi
Struktur ini digunakan langsung pada Modul 5, saat firmware mulai menangani:
- event asinkron
- interrupt
- kondisi real-time yang tidak deterministik
๐งญ Navigasi Modul
โฌ ๏ธ Modul sebelumnya โ Modul 3: Object dari JSON Fokus pada pembuatan object berbasis konfigurasi runtime.
โก๏ธ Modul selanjutnya โ Modul 5: Interrupt dan Tombol Fokus pada event-driven execution dan integrasi interrupt ke dalam arsitektur komponen.
๐ Penutup Analitis
Modul 4 menandai peralihan dari firmware berbasis object menjadi firmware berbasis sistem. Setelah titik ini, setiap penambahan fitur wajib tunduk pada kontrak arsitektur, bukan sebaliknya.
Firmware tidak lagi berkembang secara ad-hoc, tetapi melalui ekstensi yang terkontrol, memungkinkan kompleksitas meningkat tanpa kehilangan keteraturan.
Catatan Penyusunan Artikel ini disusun sebagai materi edukasi dan referensi umum berdasarkan berbagai sumber pustaka, praktik lapangan, serta bantuan alat penulisan. Pembaca disarankan untuk melakukan verifikasi lanjutan dan penyesuaian sesuai dengan kondisi serta kebutuhan masing-masing sistem.