Metode parametrize vs variabel global

10

Saya punya pertanyaan yang sangat sederhana yang telah menghantui saya untuk sementara waktu ketika kode saya mulai tumbuh.

Haruskah parameter digantikan oleh variabel global ketika mereka melewati rute panjang panggilan fungsi bersarang?

Saya mengerti bahwa lingkungan global dapat membuat keadaan suatu program tidak dapat diprediksi karena banyak fungsi dapat memodifikasi variabel bersama, tetapi tetap saja, ruang global membuat segalanya menjadi sangat mudah.

Biarkan saya jelaskan:

functionA(){
   x = something
   functionB(x)
}
functionB(x){
   functionC(x)
}
functionC(x){
   finallyDoSomethingWithX(x)
}
finallyDoSomethingWithX(x){
  x += 1 //Very dummy example ignoring pass by value, not reference.
}

Digantikan oleh:

globalX;
functionA(){
   globalX = something
   functionB()
}
...
...
...
finallyDoSomethingWithX(){
   globalX += 1
}

Saya merasa cara kedua memberikan begitu banyak kebebasan untuk memprogram karena parameter dapat terakumulasi dengan mudah dan juga terkadang sangat membatasi ketika kode harus digunakan kembali, tetapi pada saat yang sama saya merasa fungsi tersebut akan kehilangan modularitasnya ketika dikaitkan dengan variabel dalam lingkungan global, juga kehilangan reusability ketika, misalnya, saya ingin beroperasi finallyDoSomethingWithXdengan variabel lain yang berbeda tha globalX.

Saya pikir ini terjadi pada saya karena saya tidak benar-benar menggunakan pola desain karena saya pemrograman dalam Javascript, yang bagi saya terasa seperti satu-naskah-penawaran-dengan-semua bahasa untuk proyek-proyek menengah.

Ada saran? pola? Saya bisa lebih spesifik jika diperlukan.

AFP_555
sumber
5
Biasanya, jika Anda mengirimkan variabel sangat dalam, Anda belum memecahkan masalah dengan benar. Sedangkan untuk variabel global yang mendorong negara bagian lain dalam sistem, hindarilah seperti wabah. Tidak mungkin untuk mengelola pada titik tertentu, dan Anda akan menemukan hal-hal melanggar secara acak karena beberapa negara dimutasi oleh fungsi yang tidak Anda harapkan secara acak.
mgw854
Hindari ini layaknya wabah. Dimengerti Bisakah Anda menguraikan lebih lanjut tentang "Anda belum memecahkan masalah dengan benar". Saya mengerti ide umum tapi saya tidak bisa memberikan contoh atau sesuatu untuk memahaminya.
AFP_555
2
Obat umum ketika Anda menemukan diri Anda melewati argumen banyak lapisan dalam adalah untuk membuat objek metode : objek kelas baru yang metodenya sesuai dengan fungsi yang melewati parameter. Parameter kemudian bisa menjadi variabel lokal ke objek, dan metodenya tidak perlu meneruskan nilai-nilai lagi.
Kilian Foth
@KilianFoth Terima kasih. Bisakah Anda menguraikan beberapa kode sehingga saya dapat memeriksa jawabannya?
AFP_555
1
Pertimbangkan memperlakukan struktur kode JavaScript Anda seperti yang Anda lakukan dalam bahasa lain (seperti yang menggunakan kelas "nyata"). Beberapa tautan bermanfaat pada pertanyaan terkait ini di SO: stackoverflow.com/questions/927651/…
Ben Cottrell

Jawaban:

7

Jangan gunakan variabel global.

Juga, jangan berikan parameter ke rantai fungsi!

Sulit karena Anda tidak menggunakan contoh aktual. Tetapi biasanya akan ada pendekatan yang lebih baik.

Katakanlah kita memiliki variabel kata sandi yang perlu kita gunakan untuk memanggil apis yang inturn digunakan oleh berbagai fungsi tingkat rendah.

Pendekatan global (kode psudo)

var pass;

function multiply(a,b) {
   return apiMultiply(pass,a,b);
}

Pendekatan parameter lewat

function multiply(a,b,pass) {
    return apiMultiply(pass,a,b);
}

Pendekatan objek

class math {
    var api;
    constructor(pass) {
        api = new api(pass);
    }

    function Multiply(a,b) {
        api.Multiply(a,b); //uses pass from constructor
    }
}
Ewan
sumber
Unggul. Lewat cara ini tidak di lingkungan global dan juga bukan parameter untuk fungsi kelas karena dapat diambil dari atribut objek. Terima kasih.
AFP_555
3

Hindari global seperti wabah.

Kode apa pun dapat memodifikasi global. Jadi jika Anda memiliki rantai A (x) -> B (x) -> C (x) -> ... -> Z (x), dan Anda menyimpan x ke dalam X global dan sekarang Anda memiliki rantai A- > B-> C -> ...-> Z, lalu pada setiap langkah rantai panjang itu, atau dalam kode yang sepenuhnya independen, seseorang dapat mengubah X. Dan nilai yang digunakan Z bisa sangat berbeda dari yang A dimulai dengan.

Ini mimpi buruk jika Anda ingin memastikan bahwa kode Anda melakukan apa yang seharusnya dilakukan, atau bahwa ia melakukan apa yang Anda pikirkan.

gnasher729
sumber
1
Setuju. Jika Anda menggunakan global untuk menyelesaikan masalah Anda, sekarang Anda memiliki dua masalah.
Caleb Mauer