Kapan boleh menggunakan variabel Global

22

Ok, jadi ini benar-benar pertanyaan advokat setan.

Kapan variabel global ok, dan jika tidak, apa yang akan Anda gunakan sebagai alternatif?

Sebuah kasus sampingan yang menarik untuk pertanyaan ini, bagaimana bidang kelas statis publik berbeda dari global?

ocodo
sumber
5
Kode Lengkap , edisi ke-2, §13.3.
Jerry Coffin
1
Aplikasi multithreaded cukup banyak membutuhkan variabel global.
aqua
4
@ aqua Aplikasi multithread adalah tempat variabel global paling merusak. Semua orang membenci logika penguncian yang kompleks.
luiscubal
1
@JerryCoffin Jika memposting tautan sebagai jawaban tanpa mengutip bagian yang relevan adalah praktik yang buruk, maka mengutip bagian dari buku tanpa mengutip bagian yang relevan. Terutama, karena buku tidak dapat diperoleh secara bebas dan mudah seperti halnya laman web.
Braden Best

Jawaban:

18

Sejauh yang saya tahu, bidang statis publik pada dasarnya adalah global yang dapat dipanggil dari mana saja dengan pengecualian bahwa itu tidak menyumbat ruang nama.

Satu-satunya waktu saya secara pribadi menggunakan variabel 'global' dalam kode saya adalah dalam bentuk bidang statis publik yang tidak dapat diubah. Dalam hal ini tidak perlu khawatir tentang nilai yang diputar-balikkan oleh bagian lain dari program dan tentu saja itu jauh lebih baik daripada memiliki selusin variabel dengan nilai permanen yang sama di setiap kelas.


sumber
2
Saya akan menyebut bidang tidak berubah sebagai konstanta .
aioobe
14

Secara pribadi, saya menggunakan global untuk konfigurasi runtime - jika properti konfigurasi dimuat saat startup aplikasi, dan hanya sedikit perubahan (dan hanya dari satu tempat), itu mengerikan dan rawan kesalahan untuk menyebarkannya ke setiap metode yang mungkin perlu digunakan di beberapa titik. Lebih baik menggunakan sesuatu yang dapat dibawa ke ruang lingkup dari mana saja yang perlu menggunakannya, karena itu tidak mengacaukan dan mengaburkan tanda tangan metode Anda dan situs panggilan.

Segera.
sumber
Apakah Anda menggunakan global murni untuk ini atau statis publik / Singleton?
ocodo
1
@ Slomojo: Jelas bukan singleton. Tergantung pada situasinya, baik statika pada kelas konfigurasi, atau global polos dengan CONFIG_atau CFG_awalan.
Anon.
+1 satu perubahan yang saya sarankan adalah mengatakan "... rawan kesalahan untuk menyebarkannya ke setiap metode lain di setiap kelas lain". Kalau tidak, itu bisa dicakup ke kelas dengan apa pun yang berfungsi itu - saya pikir singleton.
Michael Durrant
8

Tidak termasuk sistem waktu nyata / tertanam, Anda seharusnya hanya menggunakan global untuk nilai konstan, sungguh. Jika Anda merasa bahwa Anda tidak dapat menyelesaikan masalah Anda tanpa mereka, Anda mungkin melakukan sesuatu yang salah.

Juga, lihat pola Singleton , itu dingin memberikan solusi yang lebih baik untuk global dalam situasi ketika Anda membutuhkan sesuatu untuk memiliki jalur akses global.

Davor Ždralo
sumber
8
Saya mungkin menyarankan menghindari Lajang.
ocodo
Saya tidak menyarankan bahwa lajang itu hebat, tapi saya masih berpikir mereka mengalahkan banyak variabel global.
Davor Ždralo
Nilai konstan hanya perlu dapat diakses di area / modul yang relevan. Konstanta TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOPhanya relevan dalam satu file / kelas / bagian di mana 'loop khusus ini' muncul.
Cthulhu
1
Bidang singleton adalah variabel global, jadi saya tidak melihat bagaimana ada perbedaan.
sleske
1
@ Cthulhu izinkan saya mengutip diri saya: "dalam situasi ketika Anda membutuhkan sesuatu untuk memiliki jalur akses global".
Davor Ždralo
6

Masalah dengan variabel global adalah Anda harus mewaspadai mereka di mana pun dalam kode Anda. Namun begitu Anda telah memutuskan bahwa Anda perlu tahu tentang global tertentu, ada sedikit lebih lanjut dalam menggunakannya. Oleh karena itu pendapat saya adalah Anda harus memiliki sangat sedikit variabel global, tetapi beberapa yang Anda miliki, Anda harus mendapatkan jarak tempuh maksimum.

Untuk contoh lain tentang sesuatu yang saya rasakan seperti ini, lihatlah penggunaan mixin di Ruby.

btilly
sumber
Contoh penggunaan apa yang Anda sarankan untuk penggunaan global ini?
ocodo
1
@ Slomojo: Contoh global yang saya tidak keberatan adalah penggunaan @ARGV dan $ _ dalam Perl. Contoh yang saya pikirkan adalah penggunaan global untuk memberikan parameter yang murah ke subrutin.
btilly
5

Ini semua tentang ruang nama.

Bayangkan sejenak bahwa semua orang di dunia memiliki nama belakang yang sama. Berantakan sekali.

(Di India, orang Sikh memiliki semua nama belakang yang sama: Singh - Lihatlah)

Christopher Mahan
sumber
6
Ini digunakan untuk menjadi semua tentang ruang nama, tapi sekarang itu tentang keselamatan benang.
dan04
6
@ dan04 Ini tentang tidak memiliki desain yang mengerikan dengan aksi seram di kejauhan.
Tom Hawtin - tackline
2
@ Tom: Mungkin kita bisa menyebutnya, lidah-di-pipi, "Quantum Programming"
Christopher Mahan
4

Versi singkat: ketika membuatnya lebih mudah untuk beralasan tentang program. Biasanya kasus adalah beberapa jenis negara global atau sumber daya statis yang banyak digunakan.

Versi panjang: Tom Hawtin berkata "dengan aksi seram di kejauhan" ... itulah masalah dengan global - Anda harus tahu di mana itu digunakan dan bagaimana, atau Anda bisa mendapatkan beberapa yang benar-benar aneh dan sulit untuk dilacak bug. Penduduk setempat tidak lebih dan kurang dari sebuah strategi untuk mengurangi ruang lingkup apa yang perlu dipahami oleh programmer untuk alasan tentang program.

Sisi lain dari masalah dengan mengetahui di mana mereka digunakan adalah bahwa Anda dapat berakhir dengan duplikat global - dalam hal ini hal-hal bisa menjadi sangat aneh karena sebagian besar program mendapat dan menetapkan var1 sementara di beberapa tempat var2 digunakan untuk menampung informasi yang sama. Terutama ketika banyak orang mengerjakan kode yang sama. IDE dapat membantu menemukan penggunaan yang mengurangi biaya global, tetapi mereka tidak melakukan apa pun untuk duplikat.

Semakin banyak global yang Anda miliki, semakin sulit untuk melacak apa yang terjadi dengan mereka. Mereka harus sedikit dan jarang.

jmoreno
sumber
Pada akhirnya memiliki global yang bisa berubah adalah ide yang sangat buruk. Satu-satunya pengecualian yang layak adalah ketika bekerja di jejak kaki perangkat keras yang sangat ketat, seperti dengan pemrograman tertanam. Paling tidak, calon global dalam pemrograman reguler harus dibagi menjadi anggota statis kelas atau modul, apa pun yang bisa berubah juga harus dianggap sebagai kasus khusus, dua kali lipat ketika bekerja di lingkungan multi-threaded. Menggunakan penguncian / futures / janji atau metode lain dari keamanan thread / transaksi. - Karena tidak ada orang lain yang disebutkan itu melihat masalah makan filsuf.
ocodo
1
Tidak diragukan lagi utas dapat membuat global yang bisa berubah lebih sulit untuk diajak bekerja sama, tetapi Anda bisa mendapatkan masalah dasar yang sama karena peristiwa. Saya setuju dengan saran untuk menempatkan hem sebagai anggota statis, dan akan melangkah lebih jauh dan mengatakan bahwa idealnya mereka adalah anggota statis SWASTA.
jmoreno
3

Kedua gotchas dengan global dan lajang adalah testability dan deployable.

Untuk pengujian, saya telah melihat terlalu banyak memanfaatkan pengujian yang terlalu kompleks hanya untuk berurusan dengan masa hidup global dan tunggal yang tidak terencana dengan baik. Pastikan bahwa objek tersebut memiliki aturan start up dan down yang jelas dan sederhana.

Adapun penyebaran, ada dua kasus untuk dipertimbangkan. Pertama, bagaimana objek global Anda akan hidup? Apakah itu di perpustakaan statis atau dinamis? Jika objek global itu digunakan kembali untuk sebuah plugin, apakah Anda akan mendapatkan salinan tambahan? Kedua, apa yang terjadi ketika objek global dijatuhkan ke aplikasi paralel? Apakah ini aman?

Secara keseluruhan, saya pikir alasan itu berarti bahwa global dan lajang hanya digunakan secara luar biasa.

smithco
sumber
2

Pengembangan sistem embedded kritis biasanya melibatkan penggunaan variabel global.

Ukuran tumpukan kecil, semuanya dialokasikan secara statis ( malloc()dilarang), variabel global disembunyikan dari luar perpustakaan tempat mereka berada.

mouviciel
sumber
0

Dalam basis kode VB6 yang mengerikan yang menyalahgunakan global seperti tidak ada hari esok, saya bersalah memperkenalkan yang baru:

Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained

Saya pikir ini adalah salah satu dari beberapa kasus penggunaan yang valid untuk objek global.

Mathieu Guindon
sumber