Swift-style-guide: Fungsi vs. Metode

Dibuat pada 6 Jul 2015  ·  26Komentar  ·  Sumber: raywenderlich/swift-style-guide

Panduan harus eksplisit tentang penggunaan fungsi dan metode yang tepat saat menulis. Setelah melihat dokumen Bahasa Pemrograman Swift Apple, sesuatu seperti:

Metode adalah fungsi yang terkait dengan kelas, struct, atau enum. Ini berlaku untuk metode instance dan tipe. Sebuah fungsi, di sisi lain, dideklarasikan dalam lingkup global dan bukan milik tipe apa pun.

akan cukup.

Komentar yang paling membantu

Bagaimana dengan sesuatu yang seperti ini:

Metode vs Fungsi Gratis

Metode adalah fungsi yang terkait dengan suatu tipe dan lebih disukai karena kemampuan pelengkapan otomatisnya dapat ditemukan. Fungsi bebas kurang umum tetapi masuk akal ketika operasi tidak terkait erat dengan jenis atau contoh tertentu.

Lebih disukai

let sorted = items.mergeSort()  // easily discoverable
rocket.launch()  // a mutating method

Tidak disukai

let sorted = mergeSort(items)
launch(&rocket)

Pengecualian Fungsi Gratis

let tuples = zip(a, b)  // feels natural as a free function (symmetry)
let value = max(x,y,z)  // another free function that feels natural

Semua 26 komentar

Saya juga melihat fungsi yang disebut sebagai "fungsi gratis". Saya menganggap "bebas" berarti, "tidak terkait dengan objek apa pun".

Fungsi memiliki lebih banyak opsi cakupan daripada tipe dan global, di Swift.

Saya hanya berasumsi metode normal di Objective-C sekarang disebut sebagai functiona di Swift . Semua materi yang saya baca dalam hal forum, blog, tutorial, dll. telah menyebut mereka hanya sebagai functions , bahkan ketika mereka termasuk dalam kelas atau enum.

@mitchellporter Dokumen Apple sendiri jelas tentang kapan sesuatu harus dirujuk sebagai fungsi atau metode, sesuai kutipan di atas.

Tutorial di raywenderlich.com juga mengikuti panduan Apple di sini, oleh karena itu harus dimasukkan ke dalam panduan gaya.

Ada fungsi dan metode di Objective-C juga; tidak semuanya adalah metode. 😉

@micpringle Masuk akal, tapi saya bersumpah saya sudah membaca banyak materi di mana mereka menyebutnya function bahkan ketika itu milik kelas. Saya kira saya bukan satu-satunya yang selalu menggunakan function juga, akan menarik untuk melihat apakah perubahan ini bergerak maju.

Apakah "fungsi" di dalam metode "metode bersarang"?
Apa yang disebut fungsi di dalam penutupan atau non-fungsi lainnya?

struct Struct {
   let closure = {
      func whoAmI() {}
   }

   var any: Any? {
      func jeanValjean() {}
      return nil
   }
}

Saya pikir ini akan digolongkan sebagai fungsi anonim (IMO) karena secara teknis mereka bukan "milik" apa pun, dan mereka hanya ada dalam lingkup tertentu dan tidak dapat diakses dari luarnya.

Saya tidak berpikir "fungsi anonim" adalah nama yang tepat di sini — yang biasanya mengacu pada penutupan.

Saya akan menyebutnya "fungsi bersarang": "fungsi" karena itu adalah fungsi, bukan metode yang dilampirkan ke tipe atau instance bernama. Dan "bersarang" karena...mereka bersarang! Mungkin "fungsi cakupan" tetapi itu sepertinya tidak begitu jelas.

Maaf, saya tidak menyadari penutupan juga disebut sebagai fungsi anonim. :]

Fungsi bersarang terdengar bagus bagi saya. Saya setuju bahwa scoped tidak terdengar benar.

Saya pikir "fungsi bersarang" di dalam apa pun, baik itu metode atau bukan, tampaknya cukup jelas untuk masa mendatang.

Dan meskipun saya berpikir bahwa fungsi bersarang yang memiliki nama membuatnya "nonim", saya tidak jelas apa sebenarnya "anonim", namun, ketika menyangkut penutupan, terutama yang disimpan, yang tidak dapat diubah, yang sangat mirip dengan fungsi. Saya condong untuk percaya bahwa fungsi yang disimpan memang anonim, tetapi penutupan yang menangkapnya, dan berpotensi beberapa status, adalah yang memiliki namanya. Itulah cara yang diajarkan untuk C#, di mana sintaks lambda adalah singkatan untuk membangun apa yang disebut Delegate.
https://msdn.microsoft.com/en-us/library/system.delegate (v=vs.110).aspx

func nonymous() {
   func nonymous() {}
}

let anonymouses: [() -> ()] = [].map
{$0} // This "transform" is also anonymous.

let unlcearToMeWhetherNonymous = {}

Ini adalah poin yang halus dan bahkan mungkin bisa diperdebatkan begitu Anda masuk ke perut Swift dan semuanya sama, tetapi mendeklarasikan sesuatu dengan func pasti memberi nama pada hal itu. Sebaliknya, penutupan hanyalah beberapa blok kode tanpa nama. Anda bisa menetapkannya ke variabel atau konstanta, tentu saja, tapi itu hanya menyimpan pointer ke benda itu.

Sekali lagi, ini semacam perbedaan artifisial. Anda bisa menjadi seperti cadel dan mengatakan func hanyalah gula sintaksis untuk memberi nama pada penutupan.

Bagaimana dengan sesuatu yang seperti ini:

Metode vs Fungsi Gratis

Metode adalah fungsi yang terkait dengan suatu tipe dan lebih disukai karena kemampuan pelengkapan otomatisnya dapat ditemukan. Fungsi bebas kurang umum tetapi masuk akal ketika operasi tidak terkait erat dengan jenis atau contoh tertentu.

Lebih disukai

let sorted = items.mergeSort()  // easily discoverable
rocket.launch()  // a mutating method

Tidak disukai

let sorted = mergeSort(items)
launch(&rocket)

Pengecualian Fungsi Gratis

let tuples = zip(a, b)  // feels natural as a free function (symmetry)
let value = max(x,y,z)  // another free function that feels natural

Tentang,

Pengecualian Fungsi Gratis

let tuples = zip(a, b)  // feels natural as a free function (symmetry)
let value = max(x,y,z)  // another free function that feels natural

"Terasa alami" cukup ambigu dan subjektif.

Bisakah kita menjelaskan apa yang kita maksud di sini?

Selain itu, zip dan max juga akan mengalami masalah // hard to discover Anda angkat di PR.

IMHO, saya pikir zip adalah contoh yang canggung. Masalah yang saya miliki dengannya:

  • Apa yang sebenarnya _dilakukan_? Menggabungkan a dan b ? Mengompresi a dan b entah bagaimana? Sesuatu yang lain? Tanpa lebih banyak konteks, sulit untuk mengetahuinya.

Dari pada

Fungsi bebas kurang umum tetapi masuk akal ketika operasi tidak terkait erat dengan jenis atau contoh tertentu.

Bagaimana dengan ini?

Fungsi gratis, yang tidak dilampirkan ke kelas atau tipe, harus digunakan dengan hemat. Jika memungkinkan, lebih suka menggunakan metode daripada fungsi gratis. Ini membantu dalam keterbacaan dan kemampuan untuk ditemukan.

Fungsi gratis paling sesuai bila tidak dikaitkan dengan jenis atau instance tertentu.

Saya membuka kembali masalah ini untuk mencari diskusi lebih lanjut tentang Free Function Exceptions .

Nah, ini adalah fungsi perpustakaan standar. Ini memiliki prioritas dalam bahasa seperti R, Python, C#, C++. (via boost).

Nah, ini adalah fungsi perpustakaan standar.

Betulkah? Saya belum pernah menggunakannya di iOS... *malu*

Saya akan memeriksanya ... Jika dipahami/digunakan secara luas di iOS, mungkin kekhawatiran saya di sini salah tempat ...

Saya suka saran bertele-tele Anda ... Saya enggan menyerah pada contoh zip. (PS: Tim RW Swift memiliki piagam yang lebih besar (atau lebih kecil) dari iOS.)

Tim RW Swift memiliki piagam yang lebih besar (atau lebih kecil) dari iOS.

👍 Benar. ;]

Setelah meninjau apa yang dilakukan Zip , saya meninggalkannya sebagai contoh. 👍

Permintaan maaf atas pengalaman Swift-newbie-moment saya di sini. 😉

Jangan khawatir. Terima kasih atas bantuan Anda seperti biasa. BTW, saya baru tahu Anda tidak disebutkan dalam kredit. Aku akan memperbaikinya juga.

Saya tidak yakin bahwa fungsi gratis adalah solusi terbaik. Jika digunakan, saya pikir mereka harus menambahkan fungsionalitas yang tidak dibahas di tempat lain.

maksimal

let max = Swift.max(0, 1, 2)
let maxElement = [0, 1, 2].maxElement()!

maxElement harus berupa properti, dan bukan metode, tetapi saya masih berpikir bahwa fungsi gratis itu berlebihan. Jika ini tidak dikompilasi ke hal yang sama, maka saya pikir kompiler harus ditingkatkan, tetapi bahkan jika tidak, saya tidak berpikir kinerjanya akan menjadi masalah; Saya tidak berpikir orang akan menggunakan fungsi max dengan banyak elemen.

ritsleting
Di C#, Zip diimplementasikan setara dengan metode ekstensi protokol Swift . Saya tidak berpikir itu lebih baik, tetapi ini adalah contoh bagaimana menangani zip berbeda.

Di Swift, zip adalah hal yang sama dengan inisialisasi ini untuk Zip2Sequence . Akan menyenangkan memiliki cara untuk mewakili urutan zip dari sejumlah variabel urutan input, tetapi sampai itu terjadi, saya pikir menggunakan penginisialisasi secara langsung tidak masalah.

zip([1...3], ["a"..."c"])
Zip2Sequence([1...3], ["a"..."c"])

operator
Sebagian besar fungsi gratis yang saya tulis di Swift adalah operator. Saya telah melihat Chris Lattner dan Joe Groff menyarankan bahwa operator akan dapat didefinisikan dalam tipe, la C#, di masa depan, jadi operator juga dapat mengikuti konvensi apa pun yang dipilih, untuk fungsi lain, kemudian. Implementasi mereka saat ini sebagai fungsi-bebas saja mungkin tidak boleh digunakan sebagai pedoman.

operator
Sebagian besar fungsi gratis yang saya tulis di Swift adalah operator. Saya telah melihat Chris Lattner dan Joe Groff menyarankan bahwa operator akan dapat didefinisikan dalam tipe, la C#, di masa mendatang...

Yap, ini kemungkinan arah yang akan dituju Swift ke depannya. Ini proposal yang cukup baru dari Chris Lattner, seperti yang Anda sebutkan.

Ini khususnya aneh dengan protokol seperti Equatable , yang menurut pedoman ekstensi kami, pada dasarnya _mewajibkan_ Anda untuk membuat ekstensi kosong. Ini canggung. 😞

Saya sangat setuju bahwa operator tidak boleh digunakan sebagai contoh untuk fungsi gratis yang ideal.

Terima kasih atas komentarnya @Jessy-!

Beberapa catatan:

Saya pikir maxElement() dideklarasikan sebagai metode karena bukan O(1) yang dapat mengejutkan beberapa pengguna. Jika Anda mengimplementasikan properti yang bukan O(1), properti itu perlu didokumentasikan dengan jelas. (Dalam tutorial RW kami memiliki kemewahan bahwa semua kode terbuka sehingga kami tidak perlu terlalu khawatir tentang itu atau menerapkannya sebagai pedoman gaya.)

Di sisi lain, beberapa bentuk max<T: Comparable> adalah O(1) dan berpotensi untuk dispesialisasikan untuk memanfaatkan perangkat keras. (Saya kira itu sebabnya ada dua versi parameter selain versi variadic meskipun saya belum mengonfirmasi itu.)

Bagaimanapun, saya pikir kita semua sepakat bahwa fungsi gratis harus digunakan dengan hemat tetapi saya akan menolak _never_. Contoh yang digunakan berasal dari perpustakaan standar. Saya belum melihat proposal untuk menghapus fungsi zip dari pustaka standar. Apakah ada keberatan dengan spesifikasi penulisan ulang @ JRG-Developer atau modul permintaan tarik yang saat ini digabungkan untuk penulisan ulang ini?

Jangan ragu untuk membuka kembali jika menurut Anda ada sesuatu yang perlu didiskusikan lebih lanjut. (Digabungkan ke cabang pembaruan.)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jackwu95 picture jackwu95  ·  6Komentar

luki picture luki  ·  3Komentar

aramezk picture aramezk  ·  9Komentar

rayfix picture rayfix  ·  3Komentar

jrturton picture jrturton  ·  3Komentar