Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lưu tính toán trong mã hoặc cơ sở dữ liệu?

Eval is Evil

Trước hết:không sử dụng eval() trừ khi có lý do chính đáng. Và không bao giờ có lý do chính đáng .

trong trường hợp xấu nhất eval() khiến ứng dụng của bạn dễ bị tấn công bởi các cuộc tấn công chèn và nó cũng rất chậm. Một chút nghiên cứu cho thấy nhiều lý do tại sao đánh giá là một điều không nên.

Không lưu mã tính toán của bạn vào cơ sở dữ liệu

Nếu bạn làm như vậy và bạn muốn chuyển từ PHP sang một ngôn ngữ khác, bạn sẽ vẫn có mã PHP trong cơ sở dữ liệu của mình. Nó làm cho việc di chuyển ngôn ngữ thực sự khó khăn. Bạn phải luôn cố gắng tạo ra nhiều phần trong ứng dụng của mình độc lập nhất có thể.

Trong trường hợp này, bạn sẽ kết hợp chặt chẽ ngôn ngữ bạn sử dụng với cơ sở dữ liệu. Đó là một thực tiễn không tốt.

Ngoài ra, khả năng duy nhất để chạy các phép tính của bạn từ cơ sở dữ liệu là đánh giá chúng (điều này không tốt, xem ở trên) hoặc tháo rời chuỗi bằng các phép toán chuỗi hoặc regex gây ra nỗ lực không cần thiết.

Đó là tất cả về Chiến lược

Để giải quyết vấn đề của bạn, bạn phải thực thi mã phụ thuộc vào phép tính bạn cần. Điều đó có thể được thực hiện với câu lệnh switch-case-hoặc câu lệnh if. Nhưng đó cũng không phải là một giải pháp thanh lịch cho lắm. Hãy tưởng tượng bạn sẽ cần thực hiện các thao tác khác trước khi tính toán trong tương lai hoặc mở rộng chức năng. Bạn cần cập nhật tất cả các trường hợp hoặc câu lệnh if của mình.

Có một mẫu thiết kế đẹp được gọi là Mẫu chiến lược . Mẫu chiến lược giải quyết các vấn đề khi một ca sử dụng có thể được xử lý theo cách khác mà có thể là điều bạn muốn.

Bạn muốn tính toán thứ gì đó (trường hợp sử dụng) và có các loại tính toán khác nhau cho nó (các chiến lược khác nhau)

Cách hoạt động

Để triển khai mô hình Chiến lược, về cơ bản, bạn cần ba điều.

  • Một lớp học nơi bạn đưa ra các chiến lược của mình. Về cơ bản, nó là một trình bao bọc cho các nhiệm vụ chiến lược của bạn.
  • Một giao diện sẽ được thực hiện bởi các chiến lược của bạn
  • Các chiến lược của bạn

Giao diện của bạn có thể trông như thế này:

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

}

Giao diện sẽ đảm bảo rằng tất cả các chiến lược của bạn cung cấp một phương pháp để thực sự chạy tính toán. Không có gì đặc biệt.

Tiếp theo, bạn có thể muốn có một lớp cơ sở lấy các toán tử tính toán của bạn làm đối số của phương thức khởi tạo và lưu trữ chúng thành các thuộc tính.

<?php
abstract class Calculatable {

    protected $valueA;
    protected $valueB;

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

}

Bây giờ nó đang trở nên nghiêm trọng. Chúng tôi đang thực hiện các chiến lược của mình.

<?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';
    }

}

Tất nhiên bạn có thể làm sạch điều này một chút, nhưng điều tôi muốn chỉ ra ở đây là khai báo lớp.

Chúng tôi đang mở rộng Calculatable của mình lớp để chúng ta có thể chuyển các phép toán số học thông qua hàm tạo và chúng ta đang triển khai CalculatableInterface cho lớp chúng ta biết:" Này! Bạn phải cung cấp một phương pháp tính toán, tôi không quan tâm bạn có muốn hay không.

Sau này chúng ta sẽ xem lý do tại sao đây là một phần không thể thiếu của mẫu.

Vì vậy, chúng ta có hai lớp cụ thể chứa mã thực cho phép toán số học thực tế. Nếu cần, bạn có thể thay đổi nó một cách dễ dàng như bạn thấy. Để thêm các thao tác khác, chỉ cần thêm một lớp khác.

Bây giờ chúng ta sẽ tạo một lớp mà các chiến lược của chúng ta có thể được đưa vào. Sau đó, bạn sẽ khởi tạo một đối tượng của lớp này và làm việc với nó.

Đây là cách nó trông như thế nào:

<?php 
class Calculator {

    protected $calculatable;

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

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

}

Phần quan trọng nhất ở đây là constructor. Xem cách chúng tôi gõ-gợi ý giao diện của mình tại đây. Bằng cách làm đó, chúng tôi đảm bảo rằng chỉ một đối tượng mới có thể được đưa vào ( Dependency Injection ) có lớp triển khai giao diện . Chúng ta không cần phải yêu cầu một lớp cụ thể ở đây. Đó là điểm quan trọng ở đây.

Ngoài ra, có một phương pháp tính toán trong đó. Nó chỉ là một trình bao bọc cho chiến lược của chúng tôi để thực hiện phương pháp tính toán của nó.

Kết thúc nó

Vì vậy, bây giờ chúng ta chỉ cần tạo một đối tượng của Calculator và chuyển một đối tượng của một trong các lớp chiến lược của chúng tôi (chứa mã cho các phép toán số học).

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

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

Hãy thử thay thế chuỗi được lưu trữ trong $calculatable thành Percentage và bạn thấy rằng thao tác tính toán tỷ lệ phần trăm sẽ được thực hiện.

Kết luận

Mẫu chiến lược cho phép bạn tạo một giao diện rõ ràng để làm việc với các tác vụ động chỉ được thực hiện cụ thể trong thời gian chạy. Cơ sở dữ liệu của bạn không cần biết cách chúng tôi tính toán mọi thứ, hay máy tính thực tế của bạn cũng vậy. Điều duy nhất chúng tôi cần đảm bảo là viết mã dựa trên giao diện cung cấp một phương pháp cho phép chúng tôi tính toán mọi thứ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP / MySQL 2 câu lệnh 'while' từ 1 truy vấn mysql?

  2. Làm cách nào để tìm nạp bản ghi cuối cùng trong bảng cơ sở dữ liệu MySQL bằng PHP?

  3. Lỗi MySQL 5.7 (1093:Bạn không thể chỉ định bảng đích ___ cho bản cập nhật trong mệnh đề FROM) - giải pháp thông thường không hoạt động

  4. Quầy khách Laravel

  5. Tải bảng mysql vào python mất rất nhiều thời gian so với R