Kapan menggunakan variabel instance objek versus meneruskan argumen ke metode

93

Bagaimana Anda memutuskan antara meneruskan argumen ke metode versus hanya mendeklarasikannya sebagai variabel instance objek yang terlihat oleh semua metode objek?

Saya lebih suka menyimpan variabel instan dalam daftar di akhir Kelas, tetapi daftar ini bertambah panjang seiring dengan pertumbuhan program saya. Saya membayangkan jika sebuah variabel dilewatkan cukup sering itu hanya akan terlihat oleh semua metode yang membutuhkannya, tapi kemudian saya bertanya-tanya, "jika semuanya publik tidak perlu untuk melewatkan apapun sama sekali!"

Ziggy
sumber
1
Jika Anda memiliki contoh spesifik, Anda mungkin mendapatkan jawaban yang lebih berguna secara langsung
brabster

Jawaban:

55

Karena Anda mengacu pada variabel instan, saya berasumsi bahwa Anda bekerja dalam bahasa berorientasi objek. Sampai taraf tertentu, kapan menggunakan variabel instan, bagaimana mendefinisikan ruang lingkupnya, dan kapan menggunakan variabel lokal itu subjektif, tetapi ada beberapa aturan praktis yang dapat Anda ikuti setiap kali membuat kelas Anda.

  • Variabel instans biasanya dianggap sebagai atribut kelas. Pikirkan ini sebagai kata sifat dari objek yang akan dibuat dari kelas Anda. Jika data instance Anda dapat digunakan untuk membantu mendeskripsikan objek, mungkin aman untuk bertaruh bahwa itu adalah pilihan yang baik untuk data instance.

  • Variabel lokal digunakan dalam lingkup metode untuk membantu mereka menyelesaikan pekerjaan mereka. Biasanya, metode harus memiliki tujuan untuk mendapatkan beberapa data, mengembalikan beberapa data, dan / atau memproses / menjalankan algoritme pada beberapa data. Terkadang, memikirkan variabel lokal sebagai cara membantu suatu metode berkembang dari awal hingga akhir akan membantu.

  • Cakupan variabel instance tidak hanya untuk keamanan, tetapi juga untuk enkapsulasi. Jangan berasumsi bahwa "sasarannya adalah menjaga kerahasiaan semua variabel". Dalam kasus pewarisan, menjadikan variabel sebagai dilindungi biasanya merupakan alternatif yang baik. Daripada menandai semua data instance sebagai publik, Anda membuat getter / setter untuk mereka yang perlu diakses ke dunia luar. Jangan membuat semuanya tersedia - hanya yang Anda butuhkan. Ini akan terjadi selama siklus hidup pengembangan - sulit ditebak sejak awal.

Saat membahas tentang meneruskan data di sekitar kelas, sulit untuk mengatakan apa yang Anda lakukan adalah praktik yang baik tanpa melihat beberapa kode. Terkadang, beroperasi secara langsung pada data instance baik-baik saja; di lain waktu, tidak. Menurut pendapat saya, ini adalah sesuatu yang datang dengan pengalaman - Anda akan mengembangkan beberapa intuisi saat keterampilan berpikir berorientasi objek Anda meningkat.

Tom
sumber
Jawaban saya akan menambahkan jawaban ini ke jawaban H-Man2 (seumur hidup). Ini harus menjadi atribut anggota jika dan hanya jika itu adalah keadaan objek yang persisten. Artinya, nilai tersebut masuk akal dengan sendirinya di luar cakupan tumpukan metode saat ini.
David Rodríguez - dribeas
1
Reaksi naluriku adalah setuju dengan David dan H-MAn2. Namun saya membaca "kode bersih" oleh Robert c Martin dan di bab 3 dia refactors kode untuk memindahkan sesuatu dari parameter metode ke variabel anggota, karena memiliki banyak parameter buruk. Secara seimbang, saya kira jika kelas Anda hanya memiliki satu tanggung jawab maka umur objek sama dengan umur komputasi itu, jadi mungkin jawaban sebenarnya adalah jika Anda harus mengajukan pertanyaan ini maka kelas Anda terlalu besar?
Andy
@ DavidRodríguez-dribeas apa yang Anda maksud dengan metode tumpukan?
committedandroider
@committedandroider: jika nilai hidup lebih lama dari panggilan fungsi saat ini
David Rodríguez - dribeas
46

Terutama ini tergantung pada masa pakai data yang Anda simpan dalam variabel. Jika data hanya digunakan selama komputasi, teruskan sebagai parameter. Jika data terikat pada masa pakai objek, gunakan variabel instance.

Ketika daftar variabel Anda menjadi terlalu panjang, mungkin ada baiknya untuk memikirkan refactoring beberapa bagian kelas menjadi kelas baru.

H-Man2
sumber
21

Menurut pendapat saya, variabel instan hanya diperlukan ketika data akan digunakan di seluruh panggilan.

Berikut contohnya:

myCircle = myDrawing.drawCircle(center, radius);

Sekarang mari pencitraan kelas myDrawing menggunakan 15 fungsi pembantu untuk membuat objek myCircle dan masing-masing fungsi tersebut akan membutuhkan pusat dan radius. Mereka tetap tidak boleh disetel sebagai variabel instan dari kelas myDrawing. Karena mereka tidak akan pernah dibutuhkan lagi.

Di sisi lain, kelas myCircle perlu menyimpan pusat dan radius sebagai variabel instan.

myCircle.move(newCenter);
myCircle.resize(newRadius);

Agar objek myCircle mengetahui radius dan pusatnya saat panggilan baru ini dibuat, panggilan baru ini perlu disimpan sebagai variabel instan, tidak hanya diteruskan ke fungsi yang membutuhkannya.

Jadi pada dasarnya, variabel instan adalah cara untuk menyimpan "status" suatu objek. Jika variabel tidak diperlukan untuk mengetahui status suatu objek, maka variabel tersebut tidak boleh menjadi variabel instan.

Dan untuk membuat semuanya menjadi publik. Mungkin membuat hidup Anda lebih mudah saat ini. Tapi itu akan kembali menghantui Anda. Tolong jangan.

ng. mangine
sumber
Anda bisa mendefinisikan pindah untuk menggunakan parameter (oldCenter, newCenter) sekalipun.
obesechicken13
4

MENURUT OPINI SAYA:

Jika variabel merupakan bagian dari status instance, maka itu harus berupa variabel instance - classinstance HAS-A instancevariable.

Jika saya mendapati diri saya mengirimkan sesuatu berulang kali ke dalam metode sebuah instance, atau saya menemukan bahwa saya memiliki banyak variabel instan, saya mungkin akan mencoba dan melihat desain saya jika saya melewatkan sesuatu atau membuat abstraksi yang buruk di suatu tempat.

Semoga membantu

brabster
sumber
3

Tentu saja mudah untuk menyimpan satu daftar besar variabel publik di kelas. Tetapi bahkan secara intuitif, Anda dapat mengatakan bahwa ini bukanlah cara yang tepat.

Tentukan setiap variabel tepat sebelum Anda akan menggunakannya. Jika variabel mendukung fungsi metode tertentu, gunakan hanya dalam ruang lingkup metode.

Juga pikirkan tentang keamanan, variabel kelas publik rentan terhadap perubahan yang tidak diinginkan dari kode "luar". Tujuan utama Anda harus menjaga semua variabel tetap privat, dan variabel apa pun yang tidak, harus memiliki alasan yang sangat bagus untuk melakukannya.

Tentang melewatkan parameter semua ke atas tumpukan, ini bisa menjadi sangat cepat. Aturan praktisnya adalah menjaga tanda tangan metode Anda bersih dan elegan. Jika Anda melihat banyak metode menggunakan data yang sama, putuskan apakah cukup penting untuk menjadi anggota kelas, dan jika tidak, ubah kode Anda agar lebih masuk akal.

Ini bermuara pada akal sehat. Pikirkan dengan tepat di mana dan mengapa Anda mendeklarasikan setiap variabel baru, apa fungsinya, dan dari sana buat keputusan mengenai ruang lingkup mana yang harus digunakan.

Yuval Adam
sumber
Anda sering ingin metode dipublikasikan sehingga Anda dapat mengujinya secara unit.
obesechicken13