Seperti apa perbedaan antara "to" dan "as" seperti awalan nama metode
- toList (),
- asList (),
- dll ...
Kapan harus menggunakan yang mana ketika merancang suatu metode?
Suatu toXYZ()
fungsi diharapkan untuk melakukan konversi, dan untuk mengembalikan objek independen baru (meskipun ketidakmampuan memungkinkan untuk optimasi, java.lang.String.toString()
hanya mengembalikan objek).
Sebagai contoh, di C ++ kami memiliki std::bitset::to_ulong()
yang dapat dengan mudah gagal, dan sebagian besar dari to_string()
, semua melakukan konversi kompleks (lebih atau kurang) dan mengalokasikan memori.
Sebuah asXYZ()
fungsi di sisi lain diharapkan untuk mengembalikan (berpotensi berbeda) pandangan sumber, melakukan pekerjaan minimal.
Sebagai contoh, di C ++ kita memiliki std::as_const()
yang hanya mengembalikan referensi konstan, dan lebih banyak terlibat std::forward_as_tuple
yang juga merujuk argumennya dengan referensi.
std::to_string(x)
membuat objek string baru, tetapistd::as_const(x)
membuat referensi (tampilan) dari objek yang ada.Sejujurnya, itu mungkin hanya penamaan yang tidak konsisten. Jika di benda-benda perpustakaan standar di Smalltalk, misalnya, semua metode yang melakukan "kompleks konversi" atau "kembali representasi sederhana dalam jenis lain" yang diawali dengan
as
, seperti dalamasString
,asFloat
,asSeconds
, dan metode standar untuk mengkonversi apa pun untuk hal lain,as: aClass
.Di Ruby, jenis yang sama dari metode yang diawali dengan
to_
, seperti dalamto_s
,to_a
,to_h
, singkatanstring
,array
danhash
masing-masing.Tidak ada perpustakaan standar yang membedakan antara jenis konversi yang berbeda, mungkin karena itu harus dianggap sebagai detail implementasi.
Namun, di Jawa kami melihat banyak campuran. Seperti yang Anda sebutkan, ada
toString
,asList
dan sebagainya. Saya percaya ini hanyalah inkonsistensi penamaan, karena jika Anda mencoba mendefinisikan arti yang berbeda untuk setiap awalan, Anda akan selalu menemukan contoh tandingan di tempat lain di pustaka standar.Jadi dalam hal apa pun, saya akan mengatakan yang penting bagi Anda dan tim Anda untuk memilih satu awalan dan menggunakannya secara konsisten di seluruh kode. Konsistensi adalah kuncinya, sehingga orang tidak dibiarkan bertanya-tanya, seperti yang harus Anda lakukan.
sumber
toString
membuat string baru terputus sepenuhnya dari objek (dan tidak ada cara lain karena kekekalan). Hal yang sama berlaku misalnya, untukCollection#toArray
, sambilArrays#asList
mengembalikan tampilan array, yang terhubung dua arah (mutasi array mengubah daftar dan sebaliknya). Jadi ini cukup konsisten, meskipun mungkin ada pengecualian. Memilih satu awalan akan salah. Jika adaArrays#toList
, maka saya berharap untuk membuat daftar baru dengan array yang mendasarinya baru.Meskipun sudah ada jawaban yang diterima, tampaknya berfokus pada C ++, sementara pertanyaannya ditandai dengan java . Di Jawa, contoh pertama yang terlintas dalam pikiran untuk hal semacam ini adalah Arrays.asList , yang mengembalikan, pada dasarnya, tampilan array, terbungkus dalam daftar. Array yang mendasari dan daftar masih terhubung; perubahan array dicerminkan dalam daftar, dan sebaliknya. Namun, array yang dikembalikan oleh metode toArray daftar tidak tergantung dari array asli dan dari daftar:
Semua yang dikatakan, tidak ada jaminan bahwa setiap pengembang perpustakaan mengikuti konvensi ini, jadi Anda masih perlu memeriksa dokumentasi untuk mengetahui apakah ini perilaku yang akan Anda dapatkan dari kode yang tidak dikenal.
Tempat lain yang saya lihat sebagai ... () metode yang sering digunakan adalah tipe downcasting ke sub-tipe. Misalnya, jika Anda memiliki satu set subtipe, maka Anda mungkin berakhir dengan kode seperti:
sumber
Perbedaan yang saya perhatikan (barusan dengan memikirkannya) adalah
Jadi kita melihat AsInteger dan AsString dan kita melihat ToArray dan ToStringList.
Untuk menyiratkan konversi, yang masuk akal (itu adalah gerakan, proses). Seperti menyiratkan representasi, cara mengekspresikan objek asli.
Cara lain untuk melihat ini:
Dan kemudian ada "prior art" (atau warisan) yang harus dihadapi. Sebelum bahasa sepenuhnya OO dari bawah ke atas, Anda akan memiliki fungsi perpustakaan seperti StrToInt () dan IntToStr (). Mereka melakukan konversi, mereka adalah operasi sehingga masuk akal untuk memanggil mereka SomethingToSomethingelse (). Bagaimanapun, To lebih aktif daripada As. Saya terutama berpikir tentang Delphi di sini.
Ketika C # dirancang dengan ambisi untuk menjalankan OO sepenuhnya, masuk akal untuk memiliki metode pada objek integer sekarang yang akan mengubah integer menjadi string. Meskipun kami juga memiliki kelas Konversi, konversi ke string sangat umum sehingga dibuat metode virtual pada objek. Para desainer mungkin berpikir bahwa ToString akan lebih akrab bagi orang-orang dari paradigma lama dan mungkin ini sebabnya kami mendapat metode virtual ToString () dan bukan properti virtual AsString.
sumber
toString()
?