Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Menambahkan materi basic Object Oriented Programing #106

Merged
merged 8 commits into from
Nov 27, 2021
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/content/basics/14_oop_dasar/2-oop.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 48 additions & 0 deletions basics/14_oop_dasar/1_prosedural_dan_oop.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace Basic\OOP;

//OOP
class Contoh
{
private $param = array();

public function set($nama, $nilai)
{
$this->param[$nama] = $nilai;
}

public function get($nama)
{
return isset($this->param[$nama]) ? $this->param[$nama] : null;
}
}

//driven
$test = new Contoh('nama', 'Bellshade');
echo $test->get('nama');

//.End of OOP

//Prosedural
function newContoh()
{
return array();
}

function setContoh(&$param, $nama, $nilai)
{
return $param[$nama] = $nilai;
}

function getContoh($param, $nama)
{
return isset($param[$nama]) ? $param[$nama] : null;
}

//penggunaan prosedural
$test = newContoh();
setContoh($test, 'nama', 'Bellshade');
echo getContoh($test, 'nama');

//.Prosedural
60 changes: 60 additions & 0 deletions basics/14_oop_dasar/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<p align="center">
<img width="30%" src="../../assets/images/bellshade-inline.png" />
<h1 align="center">Object Oriented Programing (OOP)</h1>
</p>

Object Oriented Programing atau pemrograman berorientasi terhadap objek lebih sering disebut sebagai OOP adalah salah satu paradigma dalam pemrograman untuk memudahkan pengembangan sebuah aplikasi. Pada materi kali ini kita akan coba mempelajari mengenai paradigma OOP dan implementasinya menggunakan bahasa pemrograman PHP.

## Daftar isi

- [Pengenalan Pemrograman Berorientasi Objek (OOP)](#1-pengenalan-pemrograman-berorientasi-objek-oop)
- [Apa itu?](#apa-itu)
- [Perbedaannya OOP dengan metode prosedural biasa](#perbedaannya-oop-dengan-metode-prosedural-biasa)


## 1. Pengenalan Pemrograman Berorientasi Objek (OOP)

Pada materi sebelumnya kita sudah mencoba membuat contoh-contoh baris kode yang kebanyakan merupakan pola kerja pemrograman prosedural atau pemrograman terstruktur. Dalam pemrograman ada yang disebut sebagai paradigma Pemrograman yang artinya sudut padang seorang programmer dalam menyelesaikan suatu kasus atau masalah dengan cara pemrograman. Hal ini penting bagi seorang programmer untuk mengidentifikasi permasalahan dan menyusun sebuah solusi dalam bentuk pemrograman.

Ada beberapa paradigma pemrograman sebagai contoh paradigma prosedural yang sudah sering kita gunakan dalam materi sebelumnya, dan paradigma _object oriented programing_ (OOP) atau Pemrograman Berorientasi Objek.

### Apa itu?

OOP singkatan dari _Object Oriented Programming_. OOP bukan hanya sekedar tentang merubah cara menuliskan baris kode, tapi juga mempermudah dalam pengembangan aplikasi kita. OOP adalah model pemrograman yang mengolah desain software menggunakan data dan objek daripada menggunakan fungsi dan logika prosedural.

Pada dasarnya paradigma pemrograman berorientasi objek adalah metode pemrograman yang memecah bagian-bagian dari aplikasi menjadi 1 bagian yang memiliki 1 fungsionalitas utama. Dari bagian-bagian ini dihubungkan satu sama lain berdasarkan fungsinya masing-masing sehingga membentuk aplikasi yang utuh. Akibatnya, sebuah aplikasi dapat terdiri dari bagian-bagian yang rapi terstruktur, _scalable_ dan _reusable_ sehingga paradigma ini bagus sekali untuk diterapkan pada project berskala besar.

Jika kita analogikan pada kehidupan sehari-hari, bayangkan ada sebuah restoran makanan. Agar pelayanan pada restoran tersebut dapat berjalan dengan efisien, semua aktifitas dalam restoran tersebut dibagi menjadi beberapa bagian. Ada yang jadi pelayan, ada yang di kasir, ada yang memasak di dapur,dsb. Jika kamu perhatikan, pecahan bagian-bagian ini mempunyai tugasnya sendiri-sendiri dan memiliki prosedur masing-masing. Akan tetapi satu bagian harus tetap berhubungan dengan bagian-bagian lainnya agar restoran bisa berjalan dengan lancar dan efisien.
<br/>
<br/>

### Perbedaannya OOP dengan metode prosedural biasa

Pemrograman dengan paradigma prosedural bekerja secara urut dan sistematis, sedangkan OOP bekerja dengan sebuah objek yang fleksibel, dapat dikembangkan _(scalable)_, dan dapat digunakan ulang _(reusable)_

<ins>Analogi Singkat</ins>

Jika kita menggunakan kembali analogi sebelumnya, pemrograman dengan cara prosedural dapat diibaratkan dengan melakukan pelayanan makanan secara berurutan mulai menerima pesanan, memasak di dapur sampai memberikan makanan ke pelanggan. Perbedaanya disini pada alur prosedural berurutan tidak mempunyai _standar operational procedure_ (SOP) yang baik, sehingga jika ada pelanggan lagi, alur pelayanan tadi dijalankan lagi tanpa adanya standar yang jelas. Misalnya ada kemungkinan untuk kasir terlibat dalam bagian dapur karena hal tertentu. Situasi yang kacau seperti ini dapat menimbulkan konsistensi yang buruk.
wildanie12 marked this conversation as resolved.
Show resolved Hide resolved

Di samping itu, paradigma pemrograman berorientasi objek telah mendefinisikan semua langkah-langkahnya dengan baik. Satu bagian kasir fokus mengerjakan pekerjaannya sesuai dengan prosedur yang jelas dan sudah ditentukan sehingga kasir tidak perlu mengurusi bagian dapur namun tetap berinteraksi dengannya secara rapi dan teratur. Akibatnya setiap bagian (objek) dapat fokus mengerjakan bagiannya masing-masing dengan lebih teratur. Selain itu jika ada masalah dengan alur layanannya, bisa mudah untuk dicari letak kesalahannya dan dapat diterapkan solusi yang mudah untuk diintegrasikan.

<ins>Gambaran pemrograman</ins>

Sama halnya dengan pemrograman sebenarnya. Misalnya pada implementasi form tambah data barang, hal-hal yang diimplementasikan pastinya dimulai dengan: menampilkan form, mempopulasikan data barang, melakukan validasi dan menambahkan rekam data ke database. Jika menggunakan metode prosedural, biasanya semua itu dilakukan seluruhnya secara berurutan dalam satu file sehingga jika misalnya kita ingin membuat edit data barang yang sejatinya memiliki banyak kesamaan dengan tambah data barang harus membuat ulang dan melakukan hal yang sama berulang kali sehingga terjadi duplikasi.
azqilana marked this conversation as resolved.
Show resolved Hide resolved

<p align="center">
<img src="../../assets/content/basics/14_oop_dasar/1-prosedural.png" width="50%" />
</p>

Sedangkan pada pemrograman berorientasi objek, setiap fungsi _use case_ dipecah pada tiap-tiap objek yang nantinya berkorelasi satu sama lain membentuk sebuah fungsi aplikasi yang sebenarnya. Misalnya, objek `Barang` dibuat untuk mempopulasikan data barang. Di objek ini bisa dilakukan hal-hal seperti memastikan data barang tetap pada format dan bentuk yang ditentukan. Begitu pula dengan validasinya, bisa juga dibuat objek seperti `BarangRequest` yang menangani validasi saat sebuah form dikirimkan, memastikan semua inputan sudah sesuai yang diinginkan. Dan begitu pula untuk _use case_ yang lain seperti `BarangModel` khusus untuk interaksi dengan database.

Perhatikan disini karena setiap _use case_ diasingkan pada tiap-tiap objek, developer bisa fokus menuliskan apapun **khusus** untuk _use case_ tersebut. Developer bisa leluasa menuliskan kode-kode yang kompleks hanya untuk _use case_ objek tertentu secara terstruktur. Berbeda dengan prosedural yang prakteknya menumpuk semua kode menjadi satu sehingga susah dibaca dan tidak terstruktur. Ini sangat penting sekali karena dapat memudahkan kinerja programmer dalam memanajemen kode-kodenya. Selain itu, yang paling dirasa keuntungannya yaitu pada saat kerja tim yang mengharuskan kode terstruktur agar dapat dimengerti oleh semua anggota tim.

<p align="center">
<img src="../../assets/content/basics/14_oop_dasar/2-oop.png" width="50%" />
</p>


Semua hal _use case_ diibaratkan sebagai sebuah objek yang terorganisir bertujuan membantu dalam menyelesaikan sesuai _use case_nya. Sehingga apapun dapat di gambarkan kedalam objek ini. Objek berisikan fungsi-fungsi dan atribute-atribute, dimana objek dapat di gandakan dengan nilai dari atribut berbeda-beda tetapi dapat menjalankan fungsi yang sama. Karena bersifat modular objek dapat digunakan kembali. Sehingga pengembangan dan perawatan sebuah aplikasi menjadi lebih mudah. Data dalam properti dan metode objek dapat diproteksi dengan encapsulasi dan memberikan batas hak akses modifikasi _(yang akan dibahas nanti)_. Dengan demikian data dirasa "lebih aman" dari pada pemrograman prosedural.


87 changes: 84 additions & 3 deletions basics/5_perulangan/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
- [2.1 Nested Foreach](#21-nested-foreach)
- [List sebagai Pengganti Nested Foreach](#list-sebagai-pengganti-nested-foreach)
- [3. Perulangan While](#3-perulangan-while)
- [4. Perulangan Do While](#4-perulangan-do-while)
- [Referensi](#referensi)
- [4. Perulangan Do While](#4-perulangan-do-while)
- [5. Perulangan Tak Terbatas](#5-perulangan-tak-terbatas)

## Jenis-Jenis Perulangan

Expand Down Expand Up @@ -303,7 +303,7 @@ Dari diagram alur di atas bisa kita lihat bahwa *while* hampir sama dengan *for*
// Deklarasi parameter $i sesuai diagram bernilai 0
$i = 0;
// Perulangan while dengan ekspresi selama $i lebih kecil dari 5
while($ < 5){
while($i < 5){
// echo nilai $i dan kemudian $i ditambah 1 (post increment)
echo $i++;
}
Expand Down Expand Up @@ -374,6 +374,87 @@ end:
return $i;
```

## 5. Perulangan Tak Terbatas

Kita bisa saja suatu saat membuat sebuah perulangan yang tidak pernah berhenti. Perulangan ini disebut sebagai perulangan tak terbatas (infinite loop). perulangan ini akan terus bekerja selamanya, bagaimanapun setiap programer bisa saja melakukan kesalahan ini, karena sedikit perubahan atau salah meletakan suatu ekspresi akan menyebabkan nilai dari ekspresi akan selalu bernilai benar-`true`. sebagai contoh dari baris kode perulangan while diatas kita salah memposisikan variable dari $i, coba perhatikan baris kode dibawah ini :

```php
<?php
$i = 0;
while ($i < 5)
{
echo $i++;
}
?>
```

Maka kode di atas akan melakukan print dari angka 0 sampai angka 4, tapi jika tanpa sengaja variabel $i kita posisikan seperti ini :

```php
while($i < 5)
{
$i = 0;
echo $i++;
}
```

Maka baris kode di akan akan selalu melakukan print nilai `0` tanpa henti, karena setiap perlungan dilakukan nilai dari variable $i akan kembali menjadi `0` sehingga menyebabkan ekspresi 1 < 5 adalah benar-`true`.
wildanie12 marked this conversation as resolved.
Show resolved Hide resolved

Jika hal ini terjadi saat kita melakukan testing atau debugging terhadap baris kode kita, jangan jadi panik coba lakukan salah satu dari metode ini :

1. Jika testing kita berjalan dalam webpage.
Tunggu saja beberapa detik, biasa settingan php mempunyai masa time out selama 30 detik, bila dalam 30 detik tidak berhenti, kemungkian konfigurasi ini telah diganti, kita dapat menggunakan tombol stop pada browser kita untuk menghentikan perulangan ini.
wildanie12 marked this conversation as resolved.
Show resolved Hide resolved
2. Jika PHP kita jalankan dalam mode Command Line Interface (CLI).
Kita dapat menekan tombol CTRL+C, maka script PHP akan berhenti, terkadang script akan terus berjalan beberapa saat lagi, tapi pasti akan berhenti secepat nya.

Dalam pengebangan aplikasi ada kalanya kita akan melakukan loop yang sangat banyak seperti dalam pencarian, jika kita ragu terhadap perulangan yang kita lakukan kita dapat menyelipkan fungsi `break` dalam perulangan kita yang kemudian dapat kita hilangkan jika kita rasa perulangan tersebut telah berjalan dengan benar, sebagai contoh baris kode dibawah ini :
wildanie12 marked this conversation as resolved.
Show resolved Hide resolved

```php
<?php
$data = false;
$i = 1; //variable untuk mengecek banyak nya loop
while ($data = true) //Seharunya kita mengecek apakah data ini benar tetapi kita malah mengeset data ini menjadi benar
{
echo 'Data Benar<br>';
$data = false;

#pencegahan sementara agar tidak terjadi infinite loop
$i++;
if ($i > 5)
{
#hentikan perulangan
break;
}
}

?>
```

Hasil dari perulangan di atas akan menjadi seperti ini :

```text
data benar
data benar
data benar
data benar
data benar
```

Dimana kita seharusnya menggunakan operator pembanding(`==`,`===`) tapi tanpa sengaja kita menggukan operator penugasan(`=`). Kemudian kita dapat memperbaiki perulangan yang kita buat.
wildanie12 marked this conversation as resolved.
Show resolved Hide resolved

Setelah kita jalankan script PHP tersebut dan kita merasa bahwa perulangan yang terjadi sudah benar, kita dapat menghapus baris kode dari pencegahan perulangan tersebut. atau dengan cara lain jika menggukan operator persaman dalam ekspresi, kita dapat membalik posisi variabel dan nilai, jika kita salah memasukan operator hal ini hanya akan menimbulkan pesan kesalahan. contoh :
wildanie12 marked this conversation as resolved.
Show resolved Hide resolved

```php
$data = true;
while (true = $data)
{
lakukan sesuatu;
$data = false;
}
```

Baris kode diatas tidak akan melakukan perulangan tetapi akan memunculkan pesan kesalahan. Hal ini tidak berlaku untuk penggunaan operator lebih besar atau lebih kecil.

### Referensi

- [W3School - PHP Loops](https://www.w3schools.com/php/php_looping.asp)
Expand Down