Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Simpan Perhitungan dalam Kode atau Basis Data?

Eval itu Jahat

Pertama-tama:jangan gunakan eval() kecuali ada alasan yang bagus. Dan tidak pernah ada alasan bagus .

dalam kasus terburuk eval() membuat aplikasi Anda rentan terhadap serangan injeksi dan juga sangat lambat. Sedikit riset mengungkapkan banyak alasan mengapa eval sangat dilarang.

Jangan simpan kode perhitungan Anda ke dalam database

Jika Anda melakukannya dan Anda ingin beralih dari PHP ke bahasa lain, Anda masih memiliki kode PHP di database Anda. Itu membuatnya sangat sulit untuk memigrasi bahasa. Anda harus selalu berusaha untuk membuat sebanyak mungkin bagian dari aplikasi Anda mandiri.

Dalam hal ini Anda akan memasangkan erat bahasa yang Anda gunakan, ke database. Itu praktik yang buruk.

Juga satu-satunya kemungkinan untuk menjalankan perhitungan Anda dari database adalah dengan mengevaluasinya (yang buruk, lihat di atas) atau membongkar string dengan operasi string atau regex yang menyebabkan upaya yang tidak perlu.

Ini semua tentang Strategi

Untuk memecahkan masalah Anda, Anda harus mengeksekusi kode tergantung dari perhitungan yang Anda butuhkan. Itu bisa dilakukan dengan pernyataan switch-case atau if-statement. Tapi itu juga bukan solusi yang sangat elegan. Bayangkan Anda perlu menjalankan operasi lain sebelum menghitung di masa mendatang, atau memperluas fungsionalitas. Anda perlu memperbarui semua kasus atau pernyataan if.

Ada pola desain yang bagus yang disebut Pola Strategi . Pola strategi memecahkan masalah ketika satu kasus penggunaan dapat ditangani secara berbeda yang mungkin Anda inginkan.

Anda ingin menghitung sesuatu (kasus penggunaan) dan ada berbagai jenis perhitungan untuk itu (strategi berbeda)

Cara kerjanya

Untuk menerapkan pola Strategi, Anda pada dasarnya membutuhkan tiga hal.

  • Kelas tempat Anda menyuntikkan strategi. Ini pada dasarnya adalah penutup untuk tugas strategi Anda.
  • Antarmuka yang akan diterapkan oleh strategi Anda
  • Strategi Anda

Antarmuka Anda dapat terlihat seperti ini:

<?php
interface CalculatableInterface {
    
    public function calculate();

}

Antarmuka akan memastikan bahwa semua strategi Anda menyediakan metode untuk benar-benar menjalankan perhitungan. Tidak ada yang istimewa.

Selanjutnya Anda mungkin ingin memiliki kelas dasar yang menggunakan operator kalkulasi Anda sebagai argumen konstruktor dan menyimpannya ke dalam properti.

<?php
abstract class Calculatable {

    protected $valueA;
    protected $valueB;

    public function __construct($valueA, $valueB)
    {
        $this->valueA = $valueA;
        $this->valueB = $valueB;
    }

}

Sekarang mulai serius. Kami menerapkan strategi kami.

<?php
class Division extends Calculatable implements CalculatableInterface {

    public function calculate()
    {
        return ($this->valueB != 0) ? $this->valueA / $this->valueB : 'NA';
    }

}

class Percentage extends Calculatable implements CalculatableInterface {

    public function calculate()
    {
        return ($this->valueB != 0) ? (100 / $this->valueB) * $this->valueA : 'NA';
    }

}

Tentu saja Anda bisa membersihkannya sedikit, tapi yang ingin saya tunjukkan di sini adalah deklarasi kelas.

Kami memperluas Calculatable kelas sehingga kami dapat meneruskan operasi aritmatika melalui konstruktor dan kami mengimplementasikan CalculatableInterface yang memberi tahu kelas kita:"Hei! Anda harus menyediakan metode hitung, saya tidak peduli apakah Anda mau atau tidak.

Kita akan lihat nanti mengapa ini merupakan bagian integral dari pola.

Jadi kami memiliki dua kelas konkret yang berisi kode aktual untuk operasi aritmatika yang sebenarnya. Jika perlu, Anda dapat mengubahnya dengan mudah seperti yang Anda lihat. Untuk menambahkan lebih banyak operasi, cukup tambahkan kelas lain.

Sekarang kita akan membuat kelas di mana strategi kita dapat disuntikkan. Nanti Anda akan membuat instance objek dari kelas ini dan bekerja dengannya.

Begini tampilannya:

<?php 
class Calculator {

    protected $calculatable;

    public function __construct( CalculatableInterface $calculatable )
    {
        $this->calculatable = $calculatable;
    }

    public function calculate()
    {
        return $this->calculatable->calculate();
    }

}

Bagian terpenting di sini adalah konstruktor. Lihat bagaimana kami mengetik-petunjuk antarmuka kami di sini. Dengan melakukan itu, kami memastikan bahwa hanya objek yang dapat disuntikkan (Injeksi Ketergantungan ) yang kelasnya mengimplementasikan antarmuka . Kita tidak perlu menuntut kelas konkret di sini. Itulah poin penting di sini.

Juga ada metode menghitung di sana. Ini hanya pembungkus strategi kami untuk menjalankan metode penghitungannya.

Menyelesaikannya

Jadi sekarang kita hanya perlu membuat objek Calculator kelas dan meneruskan objek dari salah satu kelas strategi kami (yang berisi kode untuk operasi aritmatika).

<?php
//The corresponding string is stored in your DB
$calculatable = 'Division';

$calc = new Calculator( new $calculatable(15, 100) );
echo $calc->calculate();

Coba ganti string yang disimpan di $calculatable ke Percentage dan Anda melihat bahwa operasi untuk menghitung persentase akan dijalankan.

Kesimpulan

Pola strategi memungkinkan Anda membuat antarmuka yang bersih untuk bekerja dengan tugas dinamis yang hanya dibuat konkret selama runtime. Basis data Anda tidak perlu tahu bagaimana kami menghitung sesuatu, begitu pula kalkulator Anda yang sebenarnya. Satu-satunya hal yang perlu kita pastikan adalah mengkodekan antarmuka yang menyediakan metode untuk memungkinkan kita menghitung banyak hal.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL format DATETIME salah

  2. Mysql:Konversi DB dari waktu lokal ke UTC

  3. Penghitung waktu mundur Javascript dan PHP yang menampilkan hal yang sama untuk semua orang

  4. Apakah ada manfaat nyata menggunakan RDBMS vs. file datar pada sistem dokumen Web sederhana (atau CMS dasar)?

  5. Masalah memiliki banyak database?