Apakah praktik yang baik untuk memberi nama "hasil" variabel yang dikembalikan? [Tutup]

44

Apakah praktik yang baik untuk memanggil variabel metode kembali dengan nama variabel result?

Misalnya:

public Zorglub calculate() {
    Zorglub result = [...]
    [...]
    return result;
}

Atau haruskah saya beri nama berdasarkan jenisnya?

public Zorglub calculate() {
    Zorglub zorglub = [...]
    [...]
    return zorglub;
}

Saya telah melihat keduanya di alam liar, jika saya harus memilih satu alasan apa yang bisa membuat saya lebih suka yang pertama atau yang terakhir (atau nama yang lebih baik)?

Saya terutama berpikir tentang Jawa.

Nicolas Raoul
sumber
73
Saya juga telah melihat ofTheJedidigunakan untuk tujuan itu. Bukan rekomendasi, hanya mengatakan saya sudah melihatnya. Zorglub ofTheJedi = //...; return ofTheJedi;
7
Saya biasanya menyebutnya "retval" (nilai untuk kembali) tapi itu kurang lebih sama dengan "hasil", yang akan saya pilih.
Zeta Two
5
Setiap orang memiliki jawaban yang berbeda, semuanya sama, tetapi berbeda, dan valid, pertanyaannya tidak sukarela subjektif, tetapi jawabannya. Ini lebih dari sebuah polling.
ZJR
16
Saya akan mengatakan bahwa "hasil" sebagai variabel baik-baik saja, tetapi "menghitung" sebagai fungsi sama sekali tidak.
Kaz Dragon
2
Apakah Anda bekerja dengan banyak mantan programmer Delphi?
Peter Turner

Jawaban:

48

Jika ini adalah variabel metode, itu sangat tergantung pada keterbacaan.

Karena Anda sudah memiliki nama tipe di deklarasi variabel dan tipe metode pengembalian, Anda sebaiknya menggunakan result- itu adalah deskriptif peran variabel.

Oded
sumber
40

Membaca silang menjadi lebih mudah jika variabel tersebut dinamai result. Ini membuat niat Anda jelas.

mouviciel
sumber
2
+1 Ini adalah poin utama. Saya tahu apa artinya hasil dalam konteks apa pun hanya dengan melirik kode.
Xeoncross
1
Saya setuju, menggunakan tipe variabel tidak membantu Anda memahami bahwa Anda akan mengembalikannya. Dalam contoh sederhana ini, lebih mudah untuk melihat pengembalian tanpa menggulir atau melihat, tetapi lebih cepat untuk mengetahui di muka apa nilai yang dikembalikan dari fungsi tersebut. Penting juga untuk memulai, seperti yang dilakukan dalam contoh.
nycynik
17

Jika saya memerlukan variabel kembali (yang sebenarnya jarang terjadi), saya selalu memanggilnya retdan selalu mendefinisikannya tepat di bawah kepala fungsi. Fungsi sudah memiliki nama, yang mengatakan semua tentang apa yang dikembalikan.

Jika saya punya myFunctionsaya bisa menyebutkan itu variabel pengembalian myFunctionReturnValueuntuk mengatakan hal yang persis sama, hanya saya harus mengatakannya secara eksplisit setiap saat. Karena fungsi umumnya harus singkat, tidak perlu untuk kesaksian seperti itu. Dan bahkan jika saya kehilangan jejak, saya dapat melompat ke deklarasi dan akan mendarat tepat di bawah definisi fungsi.

Tetapi nama lain, yang tidak secara implisit (suka retatau result) atau eksplisit (suka myFunctionReturnValueatau myFunctionResult) menyatakan, bahwa ini adalah variabel fungsi pengembalian saat ini terlalu generik.

Dalam contoh kedua Anda zorglubadalah pilihan yang mengerikan. Semua pernyataan yang benar-benar memberi tahu saya adalah bahwa Anda membuat variabel, yang namanya sama dengan jenis anotasi yang ditemukan tepat di sebelah namanya. Ini tentang membantu int someIntatau Zorglub z.

Dalam contoh pertama Anda, ketika saya melihat kode, saya pertama kali melihat nama fungsi, yang memberitahu saya, bahwa fungsi ini menghitung a Zorglub. Ketika saya membaca baris kedua saya melihat "ok, ini zorglub, yang akan dikembalikan, tetapi ternyata tidak dapat segera dikembalikan dan karena itu disimpan dalam resultvariabel" (sebagai catatan: Jika Anda tidak akan menetapkan ulang nilai, maka Anda sebaiknya mendeklarasikan variabel final untuk mengkomunikasikannya), dan kemudian saya berpikir "jadi sekarang mari kita lihat apa yang terjadi padanya sebelum dikembalikan". Tidak seperti pada contoh pertama saya tidak perlu membaca lebih jauh dari itu untuk mengetahui bahwa ini adalah variabel, yang akan dikembalikan dan bahwa saya ingin mengikuti fungsi body jika saya ingin memahaminya.

Anda mungkin ingin membaca tentang Pemrograman Spartan , yang agak terkait dengan pertanyaan Anda.

back2dos
sumber
8
+1 untuk "zorglub adalah pilihan yang buruk". Tidak ada alasan duniawi untuk memiliki nama variabel, dalam konteks apa pun, yang identik dengan nama jenis (minus modal awal). Deklarasi memberitahu Anda jenis variabel - menamai variabel Anda setelah jenis Anda tidak lebih baik dari memanggil variabel Anda x1, x2, x3 dan seterusnya. Nama variabel apa pun harus mengungkapkan untuk apa variabel itu atau apa fungsinya. Nama pilihan saya untuk variabel dalam kasus khusus ini adalah toReturn - karena variabel referensi objek untuk kembali. Bahkan, banyak nama variabel saya mulai dengan "ke".
Dawood mengatakan mengembalikan Monica
21
@ Davidvidallace - itu terlalu kuat dari yang absolut. Saya memiliki kelas yang disebut Container. Jika saya memiliki metode yang mengubah kuantitas, saya bisa mengatakan var container = getContainer(id); container.Quantity += 1; Itu tentu dapat dibaca jika konteks metode ini hanya beroperasi pada satu wadah, dan hanya itu yang dilakukannya. Menyebutnya theContainerWeAreGoingToAdjustTheQuantityOfhanya konyol.
Scott Whitlock
4
@ David, saya tidak setuju. Mari kita ambil situasi di mana Anda memiliki beberapa variabel lokal, masing-masing dari jenis yang berbeda (katakanlah Pengguna, Manajer dan Departemen). Dan anggaplah tugasnya adalah untuk menghubungkan pengguna ke departemen dan tim manajer. IMHO tidak apa-apa untuk menyebut instance Pengguna ini secara sederhana user(berlawanan dengan userToJoinThisDepartmentAndManager? Atau apa yang akan menjadi pilihan Anda?)
Péter Török
10
Nitpick minor: Saya benci melihat "ret" atau "rv" atau varian disingkat dari result / returnValue lainnya. "hasil" tidak terlalu lama, dan tidak ada yang perlu menghemat karakter.
Kristopher Johnson
2
@KristopherJohnson: "hasil" tidak terlalu panjang, tetapi juga tidak berarti "nilai pengembalian". Nilai kembali tidak selalu merupakan hasil perhitungan, dan sebaliknya, hasil perhitungan tidak selalu merupakan nilai balik. Saya kira Anda bisa menyebutkan nilai pengembalian Anda returnValue, tetapi retbersifat tradisional, sama seperti intdan char.
ruakh
12

Dalam contoh kedua Anda, Anda mengonfigurasi jenis hasil dengan apa itu .

Zorglub zorglub;

katakan saja itu Zorglub, dua kali. Tiga kali jika saya repot membaca jenis metode pengembalian. Namun,

double variance;

misalnya, beri saya petunjuk tentang apa artinya nilai pengembalian , dalam hal semantik program. Mungkin atau mungkin tidak lebih jelas daripada hanya memanggilnya result, tergantung pada ukuran metode - itu panggilan penilaian untuk setiap metode IMO.

Tak berguna
sumber
8

Jika Anda bermain dengan banyak Zorglub objek dalam metode Anda, Anda "bisa" membuat kesalahan dan kembali yang salah, atau / dan Anda bisa tergoda untuk nama orang lain zorglub1, zorglub2dll

Jika Anda menyebutkannya result, tidak ada kesempatan bagi Anda untuk melakukan kesalahan seperti itu. Plus, saya menemukan itu nama yang bagus; Saya juga sudah melihat returnedValueatau returnedObjectbeberapa kali, juga jelas meski agak panjang.

Jalayn
sumber
5

Saya pribadi tidak sepenuhnya nyaman menggunakan resultsebagai nama variabel. Cukup adil, ini memberitahu saya bahwa nilai yang terkait adalah hasil dari beberapa perhitungan - namun, saya kira itu benar untuk sekitar (atau lebih) 90% dari variabel / bidang yang digunakan dalam suatu program.

Selain itu, sebagaimana dicatat beberapa jawaban lainnya, ini dapat digunakan untuk menandai nilai yang akan dikembalikan dari metode / fungsi. Namun, jika saya menjaga metode saya pendek, fokus pada melakukan satu hal saja dan tetap konsisten pada satu tingkat abstraksi, saya tidak akan memiliki banyak variabel lokal dan itu akan sepele untuk melihat apa metode yang akan dikembalikan.

Jadi saya lebih suka menjaga metode saya tetap pendek dan bersih, dan beri nama variabel saya untuk mengekspresikan arti dari nilai yang mereka pegang, daripada peran lokalnya di dalam metode terlampir. Namun, (misalnya dalam kode lama) Zorglub resultmungkin lebih mudah dipahami daripada Zorglub zorglub.

Péter Török
sumber
12
Itu tidak dipanggil resultkarena itu adalah hasil dari beberapa perhitungan; itu disebut resultkarena ini adalah hasil dari perhitungan ini . Itu juga berfungsi sebagai artinya IMO, bahkan jika itu bukan makna yang paling spesifik. Mengekspresikan makna adalah emas, tetapi niat dan idiom juga bisa berharga. Dalam hal ini sedikit trade-off.
Supr
@Supr: Nama apa yang akan Anda gunakan untuk menggambarkan hasil perhitungan lain, yang hanya akan digunakan dalam satu atau dua pernyataan berikutnya (mis. if (result >= 0) numChars+=result; else break;, Dan yang maknanya akan jelas dari perhitungan yang dipermasalahkan?) Menurut saya, nilainya yang akan dikembalikan dari ini fungsi harus disebut ret, sedangkan nilai yang telah kembali dari yang terakhir disebut fungsi harus result. Perhatikan bahwa resultmungkin lebih bermakna daripada nama yang lebih panjang jika nilai pengembalian fungsi tersebut mis. Mewakili kuantitas atau kode kesalahan.
supercat
@supercat, saya akan menamainya berdasarkan apa perhitungannya, atau apa nilai yang dimaksudkan untuk digunakan. Bahkan jika itu hanya digunakan dalam perhitungan berikutnya, itu masih membantu keterbacaan jika dinamai dengan baik. Dalam contoh Anda, saya tidak tahu apa artinya resultatau apa kode sebenarnya pada tingkat yang lebih tinggi. Saya harus merujuk ke tempat itu diatur untuk melihat dari mana nilainya berasal dan apa itu. Sesuatu seperti addedCharsatau matchedCharsakan lebih transparan dan membantu mengungkap apa yang dikerjakan kode tersebut, dan tidak memerlukan juggling mental ini dan yang terkait result = ...:)
Supr
@Supr: Masalahnya adalah bahwa dalam banyak kasus, rentang nilai pengembalian yang berbeda dapat berarti hal yang berbeda. Misalnya, rutin untuk membaca paket ke buffer dengan ukuran yang ditentukan mungkin mengembalikan sejumlah byte jika paket diterima, atau angka negatif untuk menunjukkan bahwa suatu paket (dan masih) tertunda yang terlalu besar untuk buffer, atau angka negatif yang sangat besar untuk mengindikasikan kesalahan lainnya. Menyimpan kembali ke dalam resultdan kemudian memeriksa dengan kriteria itu akan tampak lebih alami daripada mencoba untuk datang dengan nama deskriptif yang mencakup semuanya.
supercat
@ supercat, Menggunakan retbukannya resulttampak baik oleh saya. Ini agak kurang jelas menurut saya karena disingkat dan tidak seperti kata benda, tetapi jika digunakan secara konsisten maka itu setara dengan result.
Supr
1

Saya pribadi menggunakan nama resultuntuk nilai yang akan dikembalikan dari fungsi / metode. Itu membuatnya eksplisit bahwa itu adalah nilai yang akan dikembalikan. Memberinya nama berdasarkan jenis tampaknya tidak berguna, karena mungkin ada lebih dari satu variabel dari jenis yang sama.

Juraj Blaho
sumber
Uhm, pasti fakta bahwa ia akan mengatakan 'kembali' sebelum dikembalikan cukup eksplisit? Anda harus menggambarkan apa yang akan Anda lakukan dengannya, sekarang 'bagaimana'. Mengapa tidak menyebutnya total, hasil, atau sesuatu yang deskriptif tujuan, maka kode Anda akan siap "kembalikan total" atau serupa ...
Dave
@ Jangan Tidak perlu, terutama jika Anda punya beberapa objek dari jenis yang sama yang semuanya dapat dikembalikan, tujuan dari metode ini adalah untuk mencari tahu mana yang tepat untuk dikembalikan.
Andy
@Andy, saya mengerti maksud Anda, tetapi dalam kenyataannya, saya tidak bisa membayangkan menulis fungsi seperti itu. Jika itu alasan untuk menulis fungsi seperti itu, sepertinya harus dipecah menjadi fungsi yang lebih kecil dan lebih mudah dimengerti.
Dave
1

Apa bedanya? hanya ada 2 kata berbeda di sana yang akan melakukan hal yang sama sehingga masalah sebenarnya adalah mana yang terdengar lebih jelas bagi Anda?

"Hasil" atau "zorglub".

Saya lebih suka menggunakan ZorglubResultstarter untuk melihat hasil yang kembali dari Zorglub lebih mudah untuk membandingkan dengan hasil lain yang Anda miliki dan hasilnya seperti yang Anda lihat ..

Berker Yüceer
sumber
1

haruskah saya memberi nama berdasarkan jenisnya?

Tidak pernah. Ini disebut Sistem Hungaria dan agak ketinggalan jaman oleh gagasan menggunakan program yang dapat menampilkan jenis variabel apa pun kapan pun Anda membutuhkannya.

DeadMG
sumber
1

Kapan pun Anda perlu memberi nama apa pun dalam kode, Anda harus memberikan nama yang deskriptif, bermakna, dan mudah dibaca. Kasus variabel kembali adalah contoh yang sangat baik di mana orang cenderung menjadi puas tentang penamaan.

Jika Anda memiliki fungsi yang diberi nama dengan jelas, dan Anda hanya perlu satu baris kode, maka Anda dapat melewati penamaan sepenuhnya. Membuat metode Anda pendek dan tujuan tunggal selalu ideal yang harus Anda tuju. Namun, itu adalah kasus yang kadang-kadang Anda perlu menyelesaikan fungsi dengan beberapa baris kode. Jika demikian, selalu disarankan untuk memberi nama variabel Anda agar sesuai dengan tujuan fungsi Anda.

Jika tujuan fungsi adalah untuk mengembalikan hasil perhitungan atau algoritma keputusan, maka resultapakah nama yang cukup memadai untuk variabel Anda untuk digunakan, tetapi bagaimana jika fungsi Anda mengembalikan item dari daftar? Bagaimana jika fungsi Anda melayani beberapa tujuan lain yang tidak ada hubungannya dengan matematika atau daftar? Dalam kasus tersebut, lebih baik menyediakan variabel dengan nama yang bermakna yang terkait dengan mengapa fungsi itu dibuat. Tentu, Anda bisa menggunakan hasil jika Anda menginginkannya karena itu adalah nama yang tidak mungkin berbenturan dengan hal lain, namun dari perspektif keterbacaan, lebih masuk akal untuk memberi nama variabel Anda lebih bermakna dan sesuai konteks.

S.Robins
sumber
0

Saya suka menggabungkan mereka, menunjukkan apa itu dan dimaksudkan untuk dikembalikan.

jadi dalam contoh Anda itu akan menjadi resultZorglub

jika apa itu tidak terlalu penting daripada hanya akan menghasilkan (bukan resulttring)

KeesDijk
sumber
Tidak buruk tapi saya kira Anda harus mengubah nama variabel Anda jika jenis kembali berubah. Dengan IDE modern itu dilakukan dalam satu atau dua klik, saya kira.
Jalayn
@ Jalayn Ya, tetapi jika jenisnya tidak disebutkan namanya maka itu adalah perubahan yang tidak perlu dilakukan sama sekali. (Jika sebuah metode cukup panjang sehingga nama yang sederhana tidak jelas, itu mungkin terlalu panjang dan harus di refactored.)
Donal Fellows
@DonalFellows Saya setuju sepenuhnya dengan Anda. Semakin sedikit perubahan yang Anda lihat saat memperbarui dari repositori sumber, semakin baik.
Jalayn
Oke setuju bahwa ketika Anda mengubah tipe pengembalian Anda mungkin lupa untuk mengubahnya juga dalam nama variabel, itu masalah. Sampai sekarang ini tidak pernah menjadi masalah bagi saya. Saya masih suka menunjukkan niat ganda dalam nama tetapi dengan kode niat menunjukkan lebih kecil sudah baik itu mungkin juga berlebihan. Kalian meyakinkan saya. Jika saya merasa perlu untuk memanggil variabel saya dengan cara ini mulai sekarang saya akan refactor sampai saya tidak merasa perlu lagi. Terima kasih
KeesDijk
0

Saya tidak melihat banyak perbedaan antara menetapkan nilai kembali di beberapa titik dan kemudian menggunakan kondisional untuk melewati semua kode yang mungkin memodifikasinya, dan returnsegera, jadi saya langsung kembali, maka tidak ada resultvariabel.

Jika Anda memiliki nilai antara yang mungkin atau mungkin tidak diubah oleh kode kondisional, maka itu bukan hasil (belum), jadi tentu tidak boleh dinamai demikian.

Simon Richter
sumber
0

Ketika saya bekerja di C ++ dan saya kira ini mungkin berlaku di Java saya lakukan.

misalnya

int Width() const
{
    Requires(....);
    Requires(....);

    //calculation

    Ensures(...);
    Ensures(...);
    return Result;
}

Ini dirancang berdasarkan kontrak, karena blok yang dipastikan harus berada di akhir metode. Tetapi kembalinya harus menjadi yang terakhir. Kami memiliki aturan yang mengembalikan Hasil adalah satu-satunya hal yang dapat mengikuti blok jaminan.

ctrl-alt-delor
sumber
0

Dalam fungsi rekursif, seringkali efektif untuk membawa hasil dari langkah ke langkah, untuk membuat optimasi panggilan ekor. Untuk memberi tanda kepada pengguna, bahwa ia tidak perlu memberikan parameter, masuk akal untuk memberi nama parameter "hasil":

def removeOccurence [A] (slice: Seq[A], original: Seq[A]) = {
  @scala.annotation.tailrec
  def remove (leftOriginal: Seq[A], result: Seq[A]) : Seq[A] =
    trimStart (slice, leftOriginal) match {
      case (h :: tail) => remove (tail, h +: result)
      case (Nil)       => result.reverse
    }
    remove (original, Nil)
}

Tetapi lebih sering saya menggunakan 'carry' dan 'sofar', yang saya lihat di alam liar, dan yang membawa ide itu sedikit lebih baik, dalam banyak kasus.

Alasan kedua tentu saja, jika topik Anda menyarankan kata '' hasil '', misalnya jika Anda melakukan evaluasi aritmatika. Anda bisa menguraikan rumus, mengganti variabel dengan nilai, dan menghitung hasilnya pada akhirnya.

Alasan ketiga telah dinyatakan, tetapi saya memiliki sedikit penyimpangan: Anda menulis metode yang melakukan beberapa pekerjaan, katakanlah itu mengevaluasi bentuk '' maks ''.

def max = {
  val result = somethingElseToDo
  if (foo) result else default 
}

Alih-alih memanggil hasil '' hasil '', kita bisa menyebutnya '' maks '', tetapi dalam beberapa bahasa Anda dapat menghilangkan tanda kurung saat memanggil metode, jadi max akan menjadi panggilan rekursif ke metode itu sendiri.

Secara umum, saya lebih suka nama yang memberitahu, apa hasilnya. Tetapi jika nama itu sudah diambil, mungkin oleh lebih dari satu variabel, atribut atau metode, karena ada bidang GUI, representasi string, numerik dan satu untuk database, menggunakan yang lain meningkatkan kemungkinan kebingungan. Dalam metode pendek 3 sampai 7 baris, '' hasil '' seharusnya tidak menjadi masalah untuk sebuah nama.

Pengguna tidak diketahui
sumber
0

Dalam Object Pascal ini bukan pilihan. Anda harus menetapkan nilai pada Resultvariabel di suatu tempat dalam kode fungsi.

Contoh:

function AddIntegers( A,B: Integer): Integer;
begin
  Result := A + B; 
end; 

Jadi bagi saya cukup alami memiliki "Hasil" (atau "Retorno", karena saya mengejanya dalam bahasa Portugis untuk menghindari konflik nama dengan kata-kata yang disediakan bahasa) variabel untuk menerima nilai kembali.

Tentu saja, jika itu ekspresi yang sangat sederhana dalam bahasa yang diturunkan dari C, saya tidak akan repot-repot untuk mendeklarasikan variabel hasil - mengembalikan ekspresi secara langsung.

Fabricio Araujo
sumber
0

tidak hanya apa yang Anda beri nama hasilnya (saya khusus untuk 'r'), tetapi juga bagaimana digunakan. misalnya, jika Anda akan memiliki variabel kembali, maka setiap pernyataan kembali harus mengembalikannya. tidak punya 'return r;' pada akhirnya, tetapi taburkan hal-hal seperti 'kembalikan m * x + b; "di seluruh metode / fungsi. gunakan" r = m * x + b; return r; "sebagai gantinya.

rbp
sumber
-1

hasilnya baik-baik saja. Saya dapat memahami kode dalam pandangan pertama sehingga nama variabel melayani tujuan tersebut.

java_mouse
sumber