Skip to content

Commit

Permalink
fix: beberapa code style
Browse files Browse the repository at this point in the history
  • Loading branch information
Berigoo committed Jan 5, 2025
1 parent b872480 commit 119bc4d
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 16 deletions.
27 changes: 23 additions & 4 deletions design_patterns/readme.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,38 @@
# Design patterns
Seiring waktu yang terus berjalan, software pun akan terus mengalami pengembangan, agar komunikasi antar *objects*, pembuatan *objects*, dan struktur atau relasi antar *classes* dalam aplikasi tersebut berjalan lancar, *elegant*, dan mudah di-*track*, maka ada yang dinamakan **Design Patterns**.

Seiring waktu yang terus berjalan, software pun akan terus mengalami
pengembangan, agar komunikasi antar *objects*, pembuatan *objects*,
dan struktur atau relasi antar *classes* dalam aplikasi tersebut
berjalan lancar, *elegant*, dan mudah di-*track*, maka ada yang
dinamakan **Design Patterns**.

## Apa itu Design patterns
Adalah sebuah solusi agar saat kamu mengemmbangkan sebuah software, *code* software tersebut mudah dipahami, mudah dikelola, dan memiliki skalabilitas yang tinggi, bisa buat jaga-jaga jika kamu ingin serius dengan pengembangan software tersebut. **Design patterns** bukanlah sebuah *code* yang bisa kamu *plek-ketiplek* salin layaknya algoritma, melainkan sebuah *template* yang bisa kamu gunakan sebagai acuan saat mengembangkan software-mu.

Adalah sebuah solusi agar saat kamu mengemmbangkan sebuah software,
*code* software tersebut mudah dipahami, mudah dikelola, dan memiliki
skalabilitas yang tinggi, bisa buat jaga-jaga jika kamu ingin serius
dengan pengembangan software tersebut. **Design patterns** bukanlah
sebuah *code* yang bisa kamu *plek-ketiplek* salin layaknya algoritma,
melainkan sebuah *template* yang bisa kamu gunakan sebagai acuan saat
mengembangkan software-mu.

## Kategori Design patterns
Sebenarnya banyak sekali *patterns* yang digunakan saat proses pengembangan software, namun ada 23 jenis *patterns* yang umumnya digunakan sebagai pondasi dari *patterns* lainnya, 23 *patterns* itulah yang umum disebut dengan istilah **The Gang of Four (GoF)**, **GoF** memiliki 3 kategori, yaitu:

Sebenarnya banyak sekali *patterns* yang digunakan saat proses pengembangan
software, namun ada 23 jenis *patterns* yang umumnya digunakan sebagai pondasi
dari *patterns* lainnya, 23 *patterns* itulah yang umum disebut dengan istilah
**The Gang of Four (GoF)**, **GoF** memiliki 3 kategori, yaitu:

- *Creational*, adalah bagaimana cara *objects* dibuat.
- [Singleton](singleton/)
- *... TODO*
- *Structural*, adalah bagaimana cara menyusun dan hubungan dari *class-class* mu.
- *... TODO*
- *Behavioral*, adalah bagaimana cara komunikasi antar *objects*.
- *... TODO*
Bagus dan buruknya *patterns* bersifat *relative* terhadap sesuatu yang kamu ingin buat atau apa yang ingin kamu selesaikan.

Bagus dan buruknya *patterns* bersifat *relative* terhadap sesuatu yang kamu
ingin buat atau apa yang ingin kamu selesaikan.

> [!NOTE]
> disarankan lihat terlebih dahulu [OOP](../object_oriented_programming/)
57 changes: 47 additions & 10 deletions design_patterns/singleton/readme.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,53 @@
# Singleton
Adalah salah satu **Design Pattern** di kategori *Creational*. Sederhananya *pattern* ini hanya membolehkan sebuah *class* memiliki **hanya satu instance**, dan *instance* tesebut *Global Accessible* (artinya *instance* atau *object* tersebut dapat diakses oleh *unit* lain, atau katakanlah file `.cpp` lain dalam *projelt* yang sama). Terlepas dari baik dan buruknya *pattern* ini bisa dibilang banyak digunakan karena kesederhaannya dan kemudahannya dalam pengaplikasiannya.

Adalah salah satu **Design Pattern** di kategori *Creational*. Sederhananya
*pattern* ini hanya membolehkan sebuah *class* memiliki
**hanya satu instance**, dan *instance* tesebut *Global Accessible*
(artinya *instance* atau *object* tersebut dapat diakses oleh *unit* lain,
atau katakanlah file `.cpp` lain dalam *project* yang sama). Terlepas
dari baik dan buruknya *pattern* ini bisa dibilang banyak digunakan
karena kesederhaannya dan kemudahannya dalam pengaplikasiannya.

## Kapan menggunakan Singleton ?
Saat kamu ingin suatu *object* dapat diakses secara global, dan tidak ada duplikasi dari *object* tersebut.

Saat kamu ingin suatu *object* dapat diakses secara global,
dan tidak ada duplikasi dari *object* tersebut.

## Cara kerja Singleton
Singleton memiliki `contructor` yang bersifat `private` atau `protected`, hal ini mencegah *class* tersebut dapat di-insialisasi (dibuat object) secara biasa (`Class objek;`), lalu bagaimana cara mengakses *object* atau *instance* dari *class* tersebut ?. Umumnya setiap Singleton memiliki 1 *function* public `static` dengan return datatype class nya sendiri. [contoh code](singleton_basic.cpp)

Singleton memiliki `contructor` yang bersifat `private` atau `protected`,
hal ini mencegah *class* tersebut dapat di-insialisasi (dibuat object) secara biasa
(`Class objek;`), lalu bagaimana cara mengakses *object* atau *instance* dari
*class* tersebut ?. Umumnya setiap Singleton memiliki 1 *function* public `static`
dengan return datatype class nya sendiri. [contoh code](singleton_basic.cpp)

### mengenai `static` keyword
dalam CPP terdapat 3 kondisi `static` keyword, setiap kondisi dia bertingkah berbeda baik itu untuk variable ataupun untuk fingsi.
1. ketika digunakan di *file scope*, maka variable tersebut global namun hanya sebatas dalam file dimana ia di-deklarasikan. [contoh kode](static_file_scope/)
2. ketika digunakan di *function scope*, maka variable tersebut global, namun hanya bisa diakses oleh atau melalui fungsi tersebut saja. Contohnya seperti yang [awal-awal](singleton_basic.cpp)

dalam CPP terdapat 3 kondisi `static` keyword, setiap kondisi dia bertingkah
berbeda baik itu untuk variable ataupun untuk fingsi.
1. ketika digunakan di *file scope*, maka variable tersebut global namun
hanya sebatas dalam file dimana ia di-deklarasikan. [contoh kode](static_file_scope/)
2. ketika digunakan di *function scope*, maka variable tersebut global,
namun hanya bisa diakses oleh atau melalui fungsi tersebut saja. Contohnya
seperti yang [awal-awal](singleton_basic.cpp)
> [!NOTE]
> - variable tersebut belum akan di inisialisasi sampai fungsi tersebut dipanggil pertama kali. (bagus untuk menghemat resources, namun eksekusi task kamu akan butuh extra waktu saat eksekusi pertama kali)
> - variable tersebut belum akan di inisialisasi sampai fungsi tersebut
dipanggil pertama kali. (bagus untuk menghemat resources, namun eksekusi
task kamu akan butuh extra waktu saat eksekusi pertama kali)
> - tidak ada inisialisasi ulang, meskipun fungsi dipanggil beberapa kali
3. ketika digunakan di *struct* atau *class scope*, maka variable tersebut bukan sembarang member, melainkan member yang global, dapat diakses meskipun belum dibuat *object*-nya (tergantung level visibilitas), dan setiap *object* mendapatkan *share* akan variable tersebut (jika *object* kesatu mengubah nilai variable tersebut maka *object* kedua pun merasakan perubahannya). Sederhananya variable tersebut milik *class* dan bukan milik *object* [contoh code](static_class_scope.cpp)
3. ketika digunakan di *struct* atau *class scope*, maka variable tersebut
bukan sembarang member, melainkan member yang global, dapat diakses meskipun
belum dibuat *object*-nya (tergantung level visibilitas), dan setiap *object*
mendapatkan *share* akan variable tersebut (jika *object* kesatu mengubah
nilai variable tersebut maka *object* kedua pun merasakan perubahannya).
Sederhananya variable tersebut milik *class* dan bukan milik *object*
[contoh code](static_class_scope.cpp)

## Catatan
Hindari penggunaan Singleton secara berlebihan, contoh saat kamu ingin cek apakah *Plane* yang dibuat itu memiliki bentuk *square*:

Hindari penggunaan Singleton secara berlebihan, contoh saat kamu
ingin cek apakah *Plane* yang dibuat itu memiliki bentuk *square*:

```cpp
class Plane {
public:
Expand Down Expand Up @@ -48,7 +78,9 @@ class PlaneManager {
}
};
```
bagaiman kalau begini
```cpp
class Plane {
public:
Expand All @@ -65,12 +97,17 @@ class Plane {
}
};
```
lalu insialisasi objek dengan cara yang biasa, lebih simple dan masalah terselesaikan.

lalu insialisasi objek dengan cara yang biasa, lebih simple
dan masalah terselesaikan.

## Contoh kode

- [basic singleton](singleton_basic.cpp)
- [basic singleton 2](singleton_another_example.cpp)

---

- static
- [static di file scope](static_class_scope/)
- [static di function scope](singleton_basic.cpp)
Expand Down
4 changes: 3 additions & 1 deletion design_patterns/singleton/static_class_scope.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ int main () {
std::cout << "Akses langsung nilai variable melalui object\n";
std::cout << "\tNilai: " << obj1.sharedVar << '\n';

std::cout << "\nObject 1 mengubah nilai variable-nya\n";
obj1.sharedVar = 10;
std::cout << "\nObject 1 mengubah nilai variable-nya, menjadi: ";
std::cout << obj1.sharedVar << '\n';

std::cout << "Maka object 2 pun merasakan perubahannya\n";
std::cout << "\tNilai: " << obj2.sharedVar << '\n';
}
4 changes: 3 additions & 1 deletion design_patterns/singleton/static_file_scope/readme.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# Kompilasi

Compile dengan menjalankan perintah

```shell
g++ *.cpp -o nama_executable
./nama_executable
```

atau

```shell
Expand Down

0 comments on commit 119bc4d

Please sign in to comment.