Katakanlah saya memiliki kelas Event
sebagai berikut:
class Event {
private var attendees: [Person] = []
// Case 1
//*******
// Should I use a func…
func countOfAttendees() -> Int {
return attendees.count
}
// …or a var
var countOfAttendees: Int {
return attendees.count
}
// Case 2
//*******
// Should I use a func…
func countOfPaidAttendees() -> Int {
return attendees.filter({$0.hasPaid}).count
}
// …or a var
var countOfPaidAttendees: Int {
return attendees.filter({$0.hasPaid}).count
}
}
Apakah praktik terbaik untuk menggunakan fungsi atau properti yang dihitung dalam 2 kasus yang ditunjukkan di atas?
functions
swift-language
Ashley Mills
sumber
sumber
Jawaban:
Ikuti Prinsip Akses Seragam ,
Bagi saya, ini berarti bahwa saya tidak menulis funcs yang tidak mengambil argumen dan mengembalikan nilai. Saya selalu menggunakan properti yang dihitung. Dengan begitu, jika saya kemudian memutuskan untuk mengubah properti yang dikomputasi menjadi properti yang disimpan, saya dapat melakukannya tanpa memiliki keinginan untuk menghapus parens di mana-mana di aplikasi saya dan tanpa memiliki metode "pengambil" yang terpisah yang hanya mengembalikan nilai yang tersimpan properti, yang tampaknya IMHO boros.
Dan jika saya mengubah properti tersimpan menjadi properti yang dihitung, saya tidak perlu menambahkan parens di akhir, dan di mana pun ia digunakan dalam aplikasi.
sumber
Saya akan mengatakan itu tergantung pada kompleksitas perhitungan vs frekuensi penggunaan.
O(1)
/*
, maka gunakan properti yang dihitung.O(N)+
/rare-use
, maka gunakan fungsi.O(N)+
/frequent-use
, pikirkan apakah di masa depan Anda mungkin memutuskan untuk menggunakan caching atau teknik "pintar" lainnya untuk mengkompensasi kompleksitas, jika "ya" lalu gunakan properti, jika "tidak-tidak-tidak, itu hanya berat" lalu gunakan fungsi .sumber
Saya baru-baru ini mulai belajar Kotlin dan mereka memiliki heuristik yang hebat tentang kapan harus menggunakan properti yang dihitung:
- https://kotlinlang.org/docs/reference/coding-conventions.html
sumber
Di Swift, fungsi tanpa parameter dan properti yang dihitung memiliki kemampuan yang hampir sama (mungkin ada perbedaan bahwa fungsi tanpa parameter juga merupakan penutupan, sedangkan properti yang dihitung tidak).
Perbedaannya secara semantik. Jika kode Anda melakukan suatu tindakan dan mengembalikan misalnya deskripsi hasil dari tindakan itu, maka saya akan menggunakan suatu fungsi. Jika kode Anda menghitung properti tetapi dari sudut pandang pengguna, ini bisa berupa properti tersimpan, atau mungkin properti tersimpan yang mengharuskan memperbarui beberapa nilai yang di-cache terlebih dahulu, maka saya akan menggunakan properti yang dihitung.
Perbedaan besar: Apa yang terjadi jika Anda memanggil fungsi atau properti yang dihitung dua kali? Untuk properti yang dihitung saya berharap bahwa x = properti; y = properti memiliki perilaku yang sama persis dengan x = properti; y = x kecuali itu mungkin berjalan sedikit lebih lambat. Untuk fungsi, saya tidak akan terkejut jika perilakunya berbeda.
sumber
Gunakan
countOfAttendees
dancountOfPaidAttendees()
.Variabel yang dihitung adalah variabel yang mengembalikan nilai yang dihitung setiap kali diakses. Artinya, itu tidak menyimpan nilai. Secara internal itu diimplementasikan sebagai fungsi.
Apa bedanya dengan fungsi?
Anda harus menggunakan variabel kapan
Alasan yang tidak relevan untuk memilih variabel daripada fungsi
Sumber daya
Dari WWDC 2014 - 204 Apa yang baru di Cocoa > 24:40 Kapan menggunakan @property
Dari Swift Style oleh Erica Sadun > Computed Properties vs. Methods
Dari konvensi pengkodean Kotlin> fungsi vs properti . Lihat jawaban Daniel di atas .
Sumber daya lain tanpa informasi yang relevan:
sumber
Saya akan menggunakan
func
. Pemrograman berorientasi objek bekerja dengan baik tanpa properti yang dihitung. Karena Anda mendapatkan nilai kembali yang dihitung / difilter, beberapa orang mungkin berpendapat bahwa properti yang dikomputasi terasa benar. Tapi inilah keluhan saya, jika Anda melakukannya maka keterbacaan terkena, karena rasanya seperti nilai.Dalam konteks ini tidak masuk akal untuk mencoba menetapkan nilai yang dihitung (dan untungnya IDE membantu kita menghindari ini) tetapi bagaimana jika saya mencoba menetapkan sesuatu yang dihitung tetapi terlihat seperti nilai?
Saat menggunakan func pemanggil tahu Anda tidak berurusan dengan nilai secara langsung:
Saya pikir jika ini merupakan objek perilaku yang seharusnya terlihat berperilaku daripada terlihat seperti struktur data. Jika objek Anda bodoh dan tidak memiliki perilaku apa pun, mengapa mencoba merangkumnya? Dalam hal ini Anda mungkin hanya memiliki peserta untuk umum
sumber