cari
Rumahhujung hadapan webtutorial jsMenggunakan Corak Strategi untuk Mengelak Penyaman Terlalu Banyak

Beberapa minggu yang lalu, saya mengusahakan penyelesaian untuk Globo Player, di mana ia perlu untuk mengaktifkan dan menyahaktifkan gelagat tertentu dalam perisian semasa pelaksanaan. Keperluan jenis ini biasanya diselesaikan dengan syarat berantai, seperti if-else dan suis, tetapi pendekatan ini tidak selalunya ideal.

Dalam artikel ini, saya membentangkan penyelesaian yang memenuhi cabaran ini dengan sempurna dan boleh digunakan pada senario pengaturcaraan yang berbeza.

Strategi manakah yang harus saya gunakan?

Bayangkan anda baru tiba di destinasi yang tidak diketahui. Apabila meninggalkan lapangan terbang, anda mempunyai beberapa pilihan untuk pergi ke hotel anda. Alternatif termurah ialah menyewa basikal, tetapi ini akan mengambil lebih banyak masa. Menaiki bas akan menjadi lebih mahal sedikit, tetapi ia akan membawa anda ke sana dengan lebih cepat dan selamat. Akhirnya, menyewa kereta akan menjadi pilihan terpantas, tetapi juga paling mahal.

Usando Strategy Pattern para evitar condicionamento exagerado

Perkara yang paling penting dalam situasi ini ialah memahami bahawa, tanpa mengira strategi yang dipilih, objektif akhir adalah sama: sampai ke hotel.

Analogi ini boleh digunakan untuk pembangunan perisian. Apabila kita berurusan dengan senario di mana proses berbeza berusaha untuk mencapai objektif yang sama, kita boleh menggunakan corak reka bentuk Strategi untuk membantu kita.

Apabila anda memprogram tanpa strategi...

Bayangkan bahawa kita perlu membangunkan sistem perbankan yang mampu mengira yuran berdasarkan jenis akaun pelanggan, seperti semasa, simpanan atau premium. Pengiraan ini perlu dilakukan pada masa jalan, yang memerlukan pelaksanaan yang betul mengarahkan aliran kod ke pengiraan yang sesuai.

Pada prinsipnya, pendekatan biasa adalah menggunakan struktur ringkas syarat berantai untuk menyelesaikan masalah dengan cepat dan berfungsi:

class Banco {
  calcularTaxa(tipoConta, valor) {
    if (tipoConta === "corrente") {
      return valor * 0.02; // 2% de taxa
    } else if (tipoConta === "poupanca") {
      return valor * 0.01; // 1% de taxa
    } else if (tipoConta === "premium") {
      return valor * 0.005; // 0,5% de taxa
    } else {
      throw new Error("Tipo de conta não suportado.");
    }
  }
}

const banco = new Banco();
const taxa = banco.calcularTaxa("corrente", 1000); // Exemplo: R00
console.log(`A taxa para sua conta é: R$${taxa}`);

Walaupun penyelesaian ini berfungsi dengan baik untuk senario mudah, apakah yang berlaku jika bank perlu menambah lima lagi jenis akaun pada masa hadapan?

calcularTaxa(tipoConta, valor) {
  if (tipoConta === "corrente") {
    return valor * 0.02; // 2% de taxa
  } else if (tipoConta === "poupanca") {
    return valor * 0.01; // 1% de taxa
  } else if (tipoConta === "premium") {
    return valor * 0.005; // 0,5% de taxa
  } else if (tipoConta === "estudante") {
    return valor * 0.001; // 0,1% de taxa
  } else if (tipoConta === "empresarial") {
    return valor * 0.03; // 3% de taxa
  } else if (tipoConta === "internacional") {
    return valor * 0.04 + 10; // 4% + taxa fixa de R
  } else if (tipoConta === "digital") {
    return valor * 0.008; // 0,8% de taxa
  } else if (tipoConta === "exclusiva") {
    return valor * 0.002; // 0,2% de taxa
  } else {
    throw new Error("Tipo de conta inválido!");
  }
}

Kini, kod mula menunjukkan had yang serius. Mari kita terokai masalah dengan pendekatan ini:

1. Kebolehskalaan rendah

Setiap kali jenis akaun baharu perlu ditambah, kaedah calculateRate perlu diubah suai. Ini terus meningkatkan bilangan bersyarat, menjadikan kod lebih kompleks dan sukar untuk diurus.

2. Kebergantungan yang tinggi

Logik pengiraan kadar digabungkan sepenuhnya dengan kaedah calculateRate. Perubahan pada satu jenis akaun boleh memberi kesan kepada orang lain secara tidak sengaja, meningkatkan risiko memperkenalkan pepijat.

3. Pengulangan kod

Coretan yang serupa, seperti amaun * yuran, diduplikasi untuk setiap jenis akaun. Ini mengurangkan penggunaan semula kod dan melanggar prinsip KERING (Jangan Ulang Sendiri).

Dalam langkah seterusnya, kita akan melihat bagaimana Corak Strategi boleh menyelesaikan masalah ini, mempromosikan kod yang lebih bersih, berskala dan modular.

Satu strategi pada satu masa!

Untuk mengelakkan masalah yang dinyatakan di atas, kami akan menganggap setiap jenis akaun sebagai entiti terpencil dalam perisian. Ini kerana setiap jenis akaun mempunyai pengiraan yuran tertentu dan mungkin mempunyai gelagat masa hadapan yang berkaitan.

Daripada membuat kelas Bank dengan kaedah calculateRate yang menyelesaikan semua operasi, mari buat kelas untuk setiap jenis akaun:

class Banco {
  calcularTaxa(tipoConta, valor) {
    if (tipoConta === "corrente") {
      return valor * 0.02; // 2% de taxa
    } else if (tipoConta === "poupanca") {
      return valor * 0.01; // 1% de taxa
    } else if (tipoConta === "premium") {
      return valor * 0.005; // 0,5% de taxa
    } else {
      throw new Error("Tipo de conta não suportado.");
    }
  }
}

const banco = new Banco();
const taxa = banco.calcularTaxa("corrente", 1000); // Exemplo: R00
console.log(`A taxa para sua conta é: R$${taxa}`);

Ini memastikan setiap operasi pengiraan disimpan dalam skop khusus untuk jenis akaun anda. Kini, kami mempunyai gelagat terpencil yang memfokuskan pada setiap jenis akaun:

Usando Strategy Pattern para evitar condicionamento exagerado


Seni bina penyelesaian berdasarkan strategi.

Tetapi, di manakah pilihan akaun yang diingini akan ditempatkan?

calcularTaxa(tipoConta, valor) {
  if (tipoConta === "corrente") {
    return valor * 0.02; // 2% de taxa
  } else if (tipoConta === "poupanca") {
    return valor * 0.01; // 1% de taxa
  } else if (tipoConta === "premium") {
    return valor * 0.005; // 0,5% de taxa
  } else if (tipoConta === "estudante") {
    return valor * 0.001; // 0,1% de taxa
  } else if (tipoConta === "empresarial") {
    return valor * 0.03; // 3% de taxa
  } else if (tipoConta === "internacional") {
    return valor * 0.04 + 10; // 4% + taxa fixa de R
  } else if (tipoConta === "digital") {
    return valor * 0.008; // 0,8% de taxa
  } else if (tipoConta === "exclusiva") {
    return valor * 0.002; // 0,2% de taxa
  } else {
    throw new Error("Tipo de conta inválido!");
  }
}

Perhatikan bahawa, daripada membuat struktur keputusan berantai (jika lain), kami memilih untuk meluluskan akaun, strategi dalam pembina kelas Bank kami. Ini membenarkan kaedah setConta untuk memilih jenis akaun yang diingini pada masa jalankan apabila membuat instantiate bank. Pengiraan kadar akan dilakukan melalui ini.conta.calcularTaxa(valor).

class ContaCorrente {
  calcularTaxa(valor) {
    return valor * 0.02; // 2% de taxa
  }
}

class ContaPoupanca {
  calcularTaxa(valor) {
    return valor * 0.01; // 1% de taxa
  }
}

class ContaPremium {
  calcularTaxa(valor) {
    return valor * 0.005; // 0,5% de taxa
  }
}

Dengan model ini, kami dapat menggunakan Corak Strategi dengan cara yang mudah, memastikan pelaksanaan yang lebih fleksibel, berskala dan gandingan rendah.

Bolehkah saya menggunakan strategi dalam segala-galanya?

Corak Strategi ialah penyelesaian yang berkuasa apabila anda perlu mengubah gelagat operasi semasa masa jalan, tanpa menggandingkan kod pelaksanaan secara langsung kepada keadaan atau jenis yang berbeza. Corak ini sesuai untuk senario di mana gelagat operasi mungkin berbeza-beza bergantung pada konteks dan tempat alternatif adalah bebas antara satu sama lain.

Bila hendak menggunakan Corak Strategi

  • Gelagat variasi: Apabila gelagat sistem perlu diubah secara dinamik bergantung pada keadaan tertentu (seperti jenis akaun yang berbeza dalam contoh perbankan).
  • Elakkan syarat yang rumit: Apabila logik keputusan berdasarkan banyak struktur kawalan aliran, seperti berbilang if-else atau suis, yang menjadikan kod sukar untuk dikekalkan.
  • Kemudahan penyelenggaraan dan pengembangan: Apabila anda ingin menambah gelagat baharu tanpa mengubah suai kod sedia ada, cuma buat kelas strategi baharu.
  • Penyahgandingan kelakuan: Apabila anda ingin mengasingkan gelagat tertentu dalam kelas yang berbeza, menjadikan kod lebih modular dan fleksibel.

Dengan menggunakan Strategi, kami menjamin bahawa kod menjadi lebih bersih, modular dan fleksibel, selain menggalakkan penyelenggaraan dan pengembangan sistem yang lebih baik.

Atas ialah kandungan terperinci Menggunakan Corak Strategi untuk Mengelak Penyaman Terlalu Banyak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Peranan JavaScript: Membuat Web Interaktif dan DinamikPeranan JavaScript: Membuat Web Interaktif dan DinamikApr 24, 2025 am 12:12 AM

JavaScript adalah di tengah -tengah laman web moden kerana ia meningkatkan interaktiviti dan dinamik laman web. 1) Ia membolehkan untuk menukar kandungan tanpa menyegarkan halaman, 2) memanipulasi laman web melalui Domapi, 3) menyokong kesan interaktif kompleks seperti animasi dan drag-and-drop, 4) mengoptimumkan prestasi dan amalan terbaik untuk meningkatkan pengalaman pengguna.

C dan JavaScript: Sambungan dijelaskanC dan JavaScript: Sambungan dijelaskanApr 23, 2025 am 12:07 AM

C dan JavaScript mencapai interoperabilitas melalui webassembly. 1) Kod C disusun ke dalam modul WebAssembly dan diperkenalkan ke dalam persekitaran JavaScript untuk meningkatkan kuasa pengkomputeran. 2) Dalam pembangunan permainan, C mengendalikan enjin fizik dan rendering grafik, dan JavaScript bertanggungjawab untuk logik permainan dan antara muka pengguna.

Dari laman web ke aplikasi: Aplikasi pelbagai JavaScriptDari laman web ke aplikasi: Aplikasi pelbagai JavaScriptApr 22, 2025 am 12:02 AM

JavaScript digunakan secara meluas di laman web, aplikasi mudah alih, aplikasi desktop dan pengaturcaraan sisi pelayan. 1) Dalam pembangunan laman web, JavaScript mengendalikan DOM bersama -sama dengan HTML dan CSS untuk mencapai kesan dinamik dan menyokong rangka kerja seperti JQuery dan React. 2) Melalui reaktnatif dan ionik, JavaScript digunakan untuk membangunkan aplikasi mudah alih rentas platform. 3) Rangka kerja elektron membolehkan JavaScript membina aplikasi desktop. 4) Node.js membolehkan JavaScript berjalan di sisi pelayan dan menyokong permintaan serentak yang tinggi.

Python vs JavaScript: Gunakan Kes dan Aplikasi MembandingkanPython vs JavaScript: Gunakan Kes dan Aplikasi MembandingkanApr 21, 2025 am 12:01 AM

Python lebih sesuai untuk sains data dan automasi, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python berfungsi dengan baik dalam sains data dan pembelajaran mesin, menggunakan perpustakaan seperti numpy dan panda untuk pemprosesan data dan pemodelan. 2. Python adalah ringkas dan cekap dalam automasi dan skrip. 3. JavaScript sangat diperlukan dalam pembangunan front-end dan digunakan untuk membina laman web dinamik dan aplikasi satu halaman. 4. JavaScript memainkan peranan dalam pembangunan back-end melalui Node.js dan menyokong pembangunan stack penuh.

Peranan C/C dalam JavaScript Jurubah dan PenyusunPeranan C/C dalam JavaScript Jurubah dan PenyusunApr 20, 2025 am 12:01 AM

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.

JavaScript in Action: Contoh dan projek dunia nyataJavaScript in Action: Contoh dan projek dunia nyataApr 19, 2025 am 12:13 AM

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

JavaScript dan Web: Fungsi teras dan kes penggunaanJavaScript dan Web: Fungsi teras dan kes penggunaanApr 18, 2025 am 12:19 AM

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Memahami Enjin JavaScript: Butiran PelaksanaanMemahami Enjin JavaScript: Butiran PelaksanaanApr 17, 2025 am 12:05 AM

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.