Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Go

Let's Go: Pemrograman Berorientasi Objek di Golang

by
Read Time:7 minsLanguages:

Indonesian (Bahasa Indonesia) translation by Ari Ana (you can also view the original English article)

Go adalah campuran aneh dari ide-ide lama dan baru. Ini memiliki pendekatan yang sangat menyegarkan di mana tidak takut untuk membuang gagasan yang sudah ada tentang "bagaimana melakukan sesuatu". Banyak orang bahkan tidak yakin jika Go adalah bahasa berorientasi objek. Biarkan saya meletakkan itu untuk beristirahat sekarang. Ya!

Dalam tutorial ini Anda akan belajar tentang semua kerumitan desain berorientasi objek di Go, bagaimana pilar pemrograman berorientasi objek seperti enkapsulasi, pewarisan, dan polimorfisme dinyatakan dalam Go, dan bagaimana Go dibandingkan dengan bahasa lain.

Filosofi Desain Go

Akar Go didasarkan pada C dan lebih luas pada keluarga Algol. Ken Thompson setengah bercanda mengatakan bahwa Rob Pike, Robert Granger dan dirinya berkumpul dan memutuskan mereka membenci C++. Entah itu lelucon atau bukan, Go sangat berbeda dari C++. Lebih lanjut tentang itu nanti. Go adalah tentang kesederhanaan. Hal ini dijelaskan secara detail oleh Rob Pike dalam Less secara eksponensial lebih banyak.

Go vs. Bahasa Lainnya

Go tidak memiliki kelas, tidak ada objek, tidak ada pengecualian, dan tidak ada template. Ini memiliki garbage collection dan konkurensi bawaan. Pengabaian yang paling mencolok sejauh menyangkut objek adalah bahwa tidak ada hierarki tipe di Go. Ini berbeda dengan kebanyakan bahasa berorientasi objek seperti C++, Java, C#, Scala, dan bahkan bahasa dinamis seperti Python dan Ruby.

Fitur Bahasa Berorientasi Objek Go

Go tidak memiliki kelas, tetapi memiliki tipe. Secara khusus, ia memiliki struct. Struct adalah tipe yang ditentukan pengguna. Tipe Struct (dengan metode) melayani tujuan yang sama untuk kelas dalam bahasa lain.

Structs

Sebuah struct mendefinisikan status. Berikut ini adalah struct Creature. Ini memiliki bidang Name dan penanda boolean yang disebut Real, yang memberitahu kita apakah itu makhluk nyata atau makhluk imajiner. Struct hanya memiliki status dan tidak ada perilaku.

Metode

Metode adalah fungsi yang beroperasi pada tipe tertentu. Mereka memiliki klausa penerima yang mengamanatkan jenis apa yang mereka operasikan. Berikut ini adalah metode Dump() yang beroperasi pada struct Creature dan mencetak statusnya:

Ini adalah sintaks yang tidak biasa, tetapi sangat eksplisit dan jelas (tidak seperti implisit "this" atau "self" Python yang membingungkan).

Penyematan

Anda dapat menyematkan jenis anonim di dalam satu sama lain. Jika Anda menanamkan struct tanpa nama maka struct yang tertanam menyediakan statusnya (dan metode) ke struct yang menyematkan secara langsung. Misalnya, FlyingCreature memiliki struct Creature yang tidak bernama yang tertanam di dalamnya, yang berarti FlyingCreature adalah sebuah Creature.

Sekarang, jika Anda memiliki instance dari FlyingCreature, Anda dapat mengakses atribut Name dan Real-nya secara langsung.

Antarmuka

Antarmuka adalah ciri khas dari dukungan berorientasi objek Go. Antarmuka adalah jenis yang menyatakan set dari metode. Demikian pula untuk antarmuka dalam bahasa lain, mereka tidak memiliki implementasi.

Obyek yang mengimplementasikan semua metode antarmuka secara otomatis menerapkan antarmuka. Tidak ada kata kunci pewarisan atau subclassing atau "implements". Dalam potongan kode berikut, tipe Foo mengimplementasikan antarmuka Fooer (berdasarkan konvensi, nama antarmuka Go diakhiri dengan "er").

Desain Berorientasi Objek: Cara Go

Mari kita lihat bagaimana Go mengukur terhadap pilar pemrograman berorientasi objek: enkapsulasi, pewarisan, dan polimorfisme. Itu adalah fitur bahasa pemrograman berbasis kelas, yang merupakan bahasa pemrograman berorientasi objek yang paling populer.

Pada intinya, obyek adalah konstruksi bahasa yang memiliki status dan perilaku yang beroperasi pada status dan secara selektif memaparkannya ke bagian lain dari program.

Enkapsulasi

Go mengenkapsulasi hal-hal di tingkat paket. Nama yang dimulai dengan huruf kecil hanya terlihat dalam paket itu. Anda dapat menyembunyikan apa pun dalam paket private dan hanya mengekspos tipe, antarmuka, dan fungsi pabrik tertentu.

Sebagai contoh, di sini untuk menyembunyikan tipe Foo di atas dan mengekspos hanya antarmuka, Anda dapat mengganti namanya menjadi foo huruf kecil dan menyediakan fungsi NewFoo() yang mengembalikan antarmuka public Fooer:

Kemudian kode dari paket lain dapat menggunakan NewFoo() dan mendapatkan akses ke antarmuka Fooer yang diterapkan oleh jenis foo internal:

Pewarisan

Pewarisan atau subkelas selalu menjadi isu kontroversial. Ada banyak masalah dengan penerapan pewarisan (sebagai lawan dari pewarisan antarmuka). Pewarisan ganda seperti yang diterapkan oleh C++ dan Python dan bahasa lain menderita masalah tajam yang mematikan, tetapi bahkan pewarisan tunggal pun tidak berpiknik dengan masalah kelas dasar yang rapuh.

Bahasa modern dan pemikiran berorientasi objek sekarang mendukung komposisi daripada pewarisan. Go mengambil hati dan tidak memiliki hierarki tipe apa pun. Ini memungkinkan Anda untuk berbagi detail penerapan melalui komposisi. Tapi Go, dalam perputaran yang sangat aneh (yang mungkin berasal dari kekhawatiran pragmatis), memungkinkan komposisi anonim melalui penyematan.

Untuk semua maksud dan tujuan, komposisi dengan menyematkan tipe anonim setara dengan penerapan pewarisan. Sebuah struct tertanam sama rapuhnya dengan kelas dasar. Anda juga dapat menyematkan antarmuka, yang setara dengan mewarisi dari antarmuka dalam bahasa seperti Java atau C++. Ia bahkan dapat menyebabkan kesalahan runtime yang tidak ditemukan pada waktu kompilasi jika tipe penyematan tidak mengimplementasikan semua metode antarmuka.

Di sini SuperFoo menyematkan antarmuka Fooer, tetapi tidak menerapkan metode-metodenya. Compiler Go akan dengan senang hati membiarkan Anda membuat SuperFoo baru dan memanggil metode Fooer, tetapi jelas akan gagal pada saat runtime. Ini mengkompilasi:

Menjalankan program ini menghasilkan kepanikan:

Polimorfisme

Polimorfisme adalah inti dari pemrograman berorientasi objek: kemampuan untuk memperlakukan obyek dari berbagai tipe secara seragam selama mereka mematuhi antarmuka yang sama. Antarmuka Go menyediakan kemampuan ini dengan cara yang sangat langsung dan intuitif.

Berikut ini adalah contoh yang rumit di mana banyak makhluk (dan pintu!) yang mengimplementasikan antarmuka Dumper yang dibuat dan disimpan dalam slice dan kemudian metode Dump() dipanggil untuk masing-masing. Anda akan melihat gaya yang berbeda dari instansiasi obyek juga.

Kesimpulan

Go adalah bahasa pemrograman berorientasi objek yang bonafit. Ini memungkinkan pemodelan berbasis objek dan mempromosikan praktik terbaik menggunakan antarmuka daripada hierarki tipe konkrit. Go membuat beberapa pilihan sintaksis yang tidak biasa, tetapi secara keseluruhan bekerja dengan tipe, metode, dan antarmuka terasa sederhana, ringan, dan alami.

Menyematkan tidak terlalu murni, tetapi tampaknya pragmatisme sedang bekerja, dan menyematkan diberikan alih-alih hanya komposisi berdasarkan nama.

Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.