Kamis, 11 Desember 2014

Polimorfisme Menggunakan Golang

Kadang-kadang saya telah menemukan lebih mudah untuk menjelaskan polimorfisme dengan ilustrasi. Sebuah ilustrasi mencoba untuk menyederhanakan dan pasti memiliki kekurangan, tetapi bisa membantu memperjelas ide. Asumsikan Mars datang ke  bumi dan dia tahu tentang manusia, tetapi dia tidak tahu tentang perbedaan antara seorang pria dan seorang wanita. Dia sekarang mendekati manusia acak di jalan dan meminta pertanyaan yang sama, "Manusia, katakan apa yang Anda ingin lakukan". Asumsikan sekarang bahwa manusia pertama Mars mendekati dengan pertanyaan ini adalah Man. Untuk pergi dengan stereotip Barat, jawabannya bisa "Aku suka memancing". Sekarang menganggap itu mendekati Wanita dengan pertanyaan yang sama. Melanjutkan dengan stereotip, tanggapannya bisa "Aku suka belanja". Sejauh Mars yang melihatnya, tampak bahwa ia telah meminta hanya Manusia, tapi dia mendapat jawaban yang berbeda setiap kali. Jawabannya tergantung pada jenis sebenarnya dari orang yang ia tanya. Contoh konyol mungkin, tapi ini mirip dengan polimorfisme - di mana respon yang berbeda diperoleh dari jenis yang sama, dalam hal ini manusia, tergantung pada apa jenis tertentu itu.

Di Go, kita menggunakan antarmuka untuk mencapai polimorfisme ini. Untuk tutorial pemula pada antarmuka di Go, silahkan baca tutorial ini: Antarmuka di Go. Jika kita membuat sebuah antarmuka dan memiliki jenis lain mengimplementasikan antarmuka itu, maka kita dapat mencapai ke masing-masing jenis melalui metode yang didefinisikan antarmuka tanpa harus tahu apa jenis tertentu itu. Mari kita menerapkan itu dan melihat apa yang kita dapatkan.

kode lengkap
package main

import "fmt"

type Human interface {
    myStereotype() string
}

type Man struct {
}

func (m Man) myStereotype() string {
    return "I'm going fishing."
}

type Woman struct {
}

func (m Woman) myStereotype() string {
    return "I'm going shopping."
}
func main() {
    m := new (Man)
    w := new (Woman)

    // array Manusia - kita tidak tahu apakah Man atau Perempuan
    hArr := [...]Human{m, w} // array 2 Manusia. Salah satunya adalah tipe manusia, satu adalah tipe Perempuan.
    for n, _ := range (hArr) {

        fmt.Println("I'm a human, and my stereotype is: ", hArr[n].myStereotype())   // muncul sebagai jenis manusia, tetapi perilaku berubah tergantung pada contoh aktual
        
    }

}
I'm a human, and my stereotype is: I'm going fishing.
I'm a human, and my stereotype is: I'm going shopping.
Dalam kode di atas dalam untuk loop, kita dapat meminta stereotip manusia, tetapi mendapatkan tanggapan yang berbeda setiap kali berdasarkan apa jenis intrinsik, baik pria atau wanita. Pada titik memanggil, kita hanya tahu bahwa itu adalah manusia - sehingga tampak bahwa manusia adalah morphing setiap kali. Di sana Anda pergi, polimorfisme!

Saya berharap bahwa contoh mudah untuk memahami dan menggambarkan konsep. Polimorfisme, setidaknya bagi saya, telah menjadi konsep yang sulit untuk menjelaskan, itulah sebabnya saya resor untuk contoh lebih mudah. Tapi jika Anda berpikir tentang hal ini, contoh di atas bisa dalam kenyataannya dilaksanakan seolah-olah pria dan wanita yang mewarisi dari Human. Jadi mari kita memperpanjang contoh sedikit lebih jauh.

Kami akan kali ini mengubah antarmuka ke Hobby. Kali ini kita akan memiliki Man and Woman berasal dari Manusia. Selain itu kami juga akan menambahkan Anjing yang tidak berasal dari jenis lainnya. Tapi kita akan memiliki masing-masing menerapkan Hobby antarmuka. Karena mereka melakukan itu, kita harus bisa memanggil myStereotype () metode pada semua dari mereka dan menerima hasil yang berbeda berdasarkan jenis intrinsik.

kode lengkap

package main

import "fmt"

type Hobby interface {
    myStereotype() string
}

type Human struct {

}

func (h Human) myStereotype() string {
    return "I'm a Human, only an abstract concept, and I can have no hobby."
}

type Man struct {
    Human // kelas anonim untuk mewarisi perilaku manusia
}

func (m Man) myStereotype() string {
    return "I'm a Man and I'm going fishing."
}

type Woman struct {
    Human // kelas anonim untuk mewarisi perilaku manusia
}

func (m Woman) myStereotype() string {
    return "I'm a Woman and I'm going shopping."
}

type Dog struct {
    // tidak mewarisi jenis lain
}

func (m Dog) myStereotype() string {
    return "bow bow bow, I'm chasing sticks."
}

func main() {
    h := new (Human)
    m := new (Man)
    w := new (Woman)
    d := new (Dog)

   // array contoh hobi - kita tidak perlu tahu apakah manusia atau anjing
    hobbyArr := [...]Hobby{h, m, w, d} //array of 3 Humans and 1 dog.
    for n, _ := range (hobbyArr ) {

        fmt.Println("My hobby?  Well,", hobbyArr [n].myStereotype())  // muncul sebagai jenis Hobby, tetapi perubahan perilaku tergantung pada contoh aktual

    }
}
My hobby? Well, I'm a Human, only an abstract concept, and I can have no hobby.
My hobby? Well, I'm a Man and I'm going fishing.
My hobby? Well, I'm a Woman and I'm going shopping.
My hobby? Well, bow bow bow, I'm chasing sticks.

Rabu, 10 Desember 2014

Cara Penggunaan Struct pada Golang

Langsung aja gan disini ane akan menjelaskan apakah Go itu adalah sebuah bahasa pemrograman dengan OOP... ^_^

Indikasi awal yang digunakan untuk mendeteksi bahwa itu adalah OOPS, Langkah pertama yang harus diingat adalah Go tidak memiliki kata kunci 'class'. Sebuah struct adalah apa yang akan digunakan untuk konsep paralel di Go. Bahasa seperti Java, C #, C ++ dan lain-lain juga memiliki struct. Seperti banyak dari bahasa pemrograman yang lain mendukung penggunan metode struct, Go juga begitu. Sehingga seharusnya tidak sulit untuk dipahami. Tapi ada perbedaan. o__o)

Dalam beberapa bahasa berorientasi objek, metode terdiri dalam class atau struct. Di Go, mereka 'associated' dengan struct.

Potongan script: Untuk Jawa
class House {
    public String getHouseName() {  //metode untuk mendefinisikan class
    }
}
Potongan script: Untuk Go

type House struct { }

func (h House) GetHouseName() string { } //metode untuk mendefinisikan struck yang beradadalam House struct

Sekarang mari kita belajar cara membuat struct dan spesialisasi mereka dalam Go, yang memungkinkan kita untuk mendapatkan semua kebaikan pemrograman berorientasi objek tanpa benar-benar membutuhkannya. .___.)/ Sebuah struct didefinisikan dengan type dan struct sebagai kata kunci.

type my_struct_name struct { }

type Rectangle struct { }

type Vehicle struct { }

type Vehicle1_Car struct { }

Semua pernyataan di atas adalah definisi yang valid karena mereka mengikuti penamaan konvensi variable Go . Yang di bawah ini adalah tidak sah.

type Hash# struct {} //tidak mempunyai karakter spesial
type 0struct struct {} //tidak dapat memulai dengan angka

Berikutnya, struct dapat berisi data lainnya. Jadi struct, seperti class yang memungkinkan untuk menentukan isi dari item dunia nyata yang sedang mencoba untuk mewakili dan menata letak memori yang sesuai. Berikut adalah beberapa contoh yang valid.

type my_struct_name struct {
    i int 
    j int 
    s string
}

type Rectangle struct {
    length, width int //dapat mendefinisikan item multiple pada beberapa tipe yang sama d    dengan garis yang dibatasi dengan koma
    area float64
}

Sekarang untuk menggunakan struct dalam kode. Ane mencoba mempertahankan bagian dari kelas Rectangle dan mencetaknya.

package main

import "fmt"

type Rectangle struct {
    length, width int 
}

func main() {
    r := Rectangle{}  
    fmt.Println("Default rectangle is: ", r) //mencetak nilai default
}

Default rectangle is: {0 0}

Ada satu hal penting untuk melihat output: nilai-nilai variabel dalam struct adalah nol-ed, yaitu int akan 0, string akan kosong, dll Jadi pada dasarnya, struct juga memiliki nilai nol ed yang diinisialisasi tergantung pada jenis konstituennya.

Pada contoh berikut, terlihat cara yang berbeda untuk menginisialisasi struct, menetapkan nilai untuk variabel di dalamnya, dan juga bawaan pencetakan.

package main

import "fmt"

type Rectangle struct {
    length, width int 
    name string
}

func main() {
    r1 := Rectangle{2, 1, "my_r1"} // menginialisasi nilai dalam urutan mereka yang didefinisikan dalam struct
    fmt.Println("Rectangle r1 is: ", r1) 

    r2 := Rectangle{width:3, name:"my_r2", length:4}  menginialisasi nilai dengan nama variable di beberapa urutan
    fmt.Println("Rectangle r2 is: ", r2) 
    pr := new (Rectangle) // mendapatkan pointer ke jarak dengan kata kunci new
    (*pr).width = 6 //memasang nilai menggunakan notasi yang arahkan dengan pointer
    pr.length = 8 // Go automatically converts memasang nilai menggunakan nilai yang sama. disana adalah no-> operator atau seperti di c++
    pr.name = "ptr_to_rectangle"
    fmt.Println("Rectangle pr as address is: ", pr) //Go menampilkan default atau struct
    fmt.Println("Rectangle pr as value is: ", *pr) // alamat dan nilai dibedakan dengan simbol &
}

Rectangle r1 is: {2 1 my_r1}
Rectangle r2 is: {4 3 my_r2}
Rectangle pr as address is: &{8 6 ptr_to_rectangle}
Rectangle pr as value is: {8 6 ptr_to_rectangle}

Beberapa hal yang perlu diperhatikan di sini :
* Agan dapat menginisialisasi nilai-nilai dalam struct dengan menyebutkan hal itu dalam kurung kurawal sesuai urutan di mana mereka muncul, masing-masing dipisahkan dengan koma. r1: = Rectangle {2, 1, "my_r1"}
* Agan dapat menginisialisasi nilai dengan memberikan nama variabel dan nilainya dipisahkan oleh titik dua. r2: = Rectangle {width: 3, Nama: "my_r2", panjang: 4}
* Agan bisa mendapatkan pointer ke contoh struct yang baru dibuat dengan menggunakan kata kunci new.
* Pointer yang diperoleh, dapat digunakan dengan atau tanpa menggunakan operator * untuk mendapatkan variabel di dalamnya
* Go menyediakan mekanisme cetak default untuk struct berdasarkan nilai-nilainya.

  • Enkapsulasi dan visibilitas struct dan variabel

Bahasa pemrograman lain menggunakan beberapa kata kunci seperti public, private, package, protected, dan lain-lain yang memungkinkan pengembang untuk menentukan visibilitas dan aksesibilitas variabel dalam konteks yang berbeda. Ane pikir semua itu benar-benar diperlukan sampai melihat pendekatan Go untuk itu. Pendekatan Go untuk visibilitas variabel dan aksesibilitas sangat sederhana bahwa Ane berpikir itu sangat konyol. Jadi, tanpa basa-basi bahwa jika huruf pertama adalah kapital, itu terlihat di luar paket. 

sebagian kode:

type notExported struct { //struct ini terlihat hanya dalam paket seperti itu untuk memulai dengan huruf kecil.
}

type Exported struct { // variable memulai dengan huruf kapital, jadi kelihatan diluar paket variable ini
    notExportedVariable int // variable memulai dengan huruf kecil, jadi tidak kelihatan di luar paket variable ini    ExportedVariable int //variable memulai dengan huruf kapital, jadi kelihatan diluar paket variable ini
    s string //tidak tersaring 
    S string //tersaring
}