Penggunaan "ini" di Golang

12

Pada hal terdekat Golang memiliki panduan gaya yang ditemukan di sini , di bawah Nama Penerima ini tertulis:

Nama penerima metode harus mencerminkan identitasnya; sering singkatan satu atau dua huruf dari jenisnya mencukupi (seperti "c" atau "cl" untuk "Klien"). Jangan gunakan nama generik seperti "saya", "ini" atau "diri", pengidentifikasi khas bahasa berorientasi objek yang lebih menekankan pada metode dibandingkan dengan fungsi. Nama tidak perlu deskriptif seperti argumen metode, karena perannya jelas dan tidak melayani tujuan dokumenter.

Saya pribadi selalu menggunakan "ini" sebagai pengidentifikasi karena "ini" adalah fokus dari apa yang saya kerjakan ketika saya menulis dan mengedit fungsi. Kedengarannya benar, dan (setidaknya bagi saya) itu masuk akal.

Jika namanya tidak perlu deskriptif, perannya jelas, dan tidak ada gunanya dokumenter , mengapa penggunaan "ini" disukai?

Adam
sumber
3
Pertanyaan serupa dengan lebih banyak jawaban: stackoverflow.com/questions/23482068
Trenton

Jawaban:

11

Kami harus bertanya kepada penulis panduan gaya itu untuk mengetahui dengan pasti, tetapi saya pikir alasan utama saya agak setuju dengannya adalah bahwa hubungan antara struct dan metode jauh lebih longgar di Go daripada bahasa lain .

Intinya, ketika Anda menulis metode seperti ini:

func (m *MultiShape) area() float64 {
  ...
}

Itu hampir persis sama dengan menulis fungsi seperti ini:

func area(m *MultiShape) float64 {
  ...
}

Satu-satunya perbedaan adalah sedikit perubahan sintaks dalam cara kita memanggil fungsi / metode.

Dalam bahasa lain variabel this/ self/ apa pun biasanya memiliki beberapa properti khusus seperti disediakan secara ajaib oleh bahasa tersebut, atau memiliki akses khusus ke metode pribadi (ingat Go tidak memiliki bidang / metode pribadi). Meskipun "penerima" masih "disediakan secara ajaib" sampai batas tertentu, itu sangat mirip dengan argumen fungsi biasa sehingga bisa dibilang tidak masuk hitungan.

Plus, dalam bahasa OOP "tradisional", metode struct / class 'semuanya datang dengan definisi struct / class, sehingga tidak ada lagi yang bisa ditambahkan dari luar. In Go, sejauh yang saya tahu ada yang bisa menambahkan lebih banyak metode untuk apa saja (dalam lingkup kode mereka sendiri, tentu saja).

Saya belum menulis cukup Pergi untuk membuat panduan gaya saya sendiri, tetapi secara pribadi saya mungkin akan menggunakan thismetode yang didefinisikan dalam file yang sama dengan struct yang mereka terima, dan beberapa nama penerima yang lebih deskriptif pada metode yang saya lampirkan ke struct dari file lain .

Ixrec
sumber
Itu penjelasan yang bagus, saya kira saya sudah terbiasa dengan C # dan bahasa OOP lainnya jadi saya kembali ke konvensi yang saya tahu.
Adam
1
@ Adam Saya akan menghindari thisjika tanpa alasan lain selain mengingatkan diri sendiri bahwa saya tidak menggunakan bahasa OOP tradisional.
Michael Hampton
4
Tidak ada perbedaan nyata antara "ini" dan "penerima" (dan tolong berhenti menyalahgunakan kata "ajaib" - setiap fitur dari bahasa pemrograman tingkat tinggi dapat disebut "ajaib", ini tidak membuat sesuatu yang negatif, upaya Anda untuk pilih "ini" karena menjadi "sihir" tidak masuk akal).
mvmn
6

Saya tidak yakin dengan panduan gaya ini dan saya tidak berpikir ada yang lebih baik dari this, meatau self. Karena this, meatau selfmembuatnya sangat jelas bahwa variabel adalah turunan dari struct konteks. Saya tidak mengatakan variabel nama struct yang lebih rendah adalah ide yang buruk, saya hanya suka cara yang thismembuatnya sangat jelas.

Qian Chen
sumber
tanpa penjelasan, jawaban ini dapat menjadi sia-sia jika ada orang yang memposting pendapat yang berbeda. Misalnya, jika seseorang memposting klaim seperti "Saya yakin dengan panduan gaya ini dan saya pikir itu lebih baik daripada this, meatau self" , bagaimana jawaban ini membantu pembaca untuk memilih dua pendapat yang bertentangan? Pertimbangkan untuk mengeditnya dalam bentuk yang lebih baik, untuk memenuhi pedoman Cara Menjawab
agas
Saya pikir saya sudah jelas menjelaskan apa yang ingin saya katakan.
Qian Chen
1
Saya setuju. Saya pikir ada terlalu banyak otak yang diracuni oleh konteks javascript. Jika Anda kesampingkan itu. Bahwa ini merujuk pada konteks saat ini jauh lebih sederhana. Dan lebih mudah jika Anda mengganti nama struct nanti, atau menyalin bagian dari implementasi. Gong untuk nama pendek cryptic baris hl dll tidak membuatnya lebih mudah dari ini.
Sentient
0

Ini dari perspektif JavaScript di mana thismemiliki arti kata kunci yang sebenarnya untuk kompiler, tetapi dari pemahaman saya, jika mereka setuju dengan singkatan dua huruf untuk jenis objek, seharusnya cukup mudah untuk menggunakannya. Alasan perbedaannya adalah bahwa dalam blok kode asinkron yang semakin dalam dan besar, bisa sangat mudah untuk salah menafsirkan apa "ini", atau penerima, dalam konteks yang lebih dalam; dan mungkin itu tidak akan menjadi objek yang sama.

Dalam JavaScript misalnya, modul kontrol mungkin memulai dialog dan menyatakan onLoadfungsi sebaris untuknya. Tetapi pada titik itu, bisa sangat mudah bagi pembuat kode lain untuk salah menafsirkan thisdi dalam onLoaduntuk merujuk ke modul kontrol, bukan dialog; atau sebaliknya. Ini bisa dihindari jika kontrol disebut sebagai ctrldan dialog sebagai dg.

Katana314
sumber
3
Saya bukan downvoter, tetapi sebagian besar perilaku membingungkan thisdalam Javascript tidak berlaku untuk Go, jadi saya menduga itu sebabnya.
Ixrec
@ Ixrec Hm ... oke. Saya agak berusaha memperluasnya ke situasi di mana Anda dapat memilih thisnama; misalnya, sering kali JS coders akan menulis var self = thisuntuk menjaga referensi yang sama; tetapi menurut panduan desain Go, yang kemudian dapat memiliki masalah kebingungan yang sama, dan secara teoritis harus menggunakan referensi yang lebih deskriptif.
Katana314