2014-09-10 3 views
0

사용자가 일부 속성을 계산하는 함수를 지정할 수있게하고이 함수를 제네릭 클래스에 저장하려고합니다. 즉, 클래스의 각 인스턴스는 동일한 인터페이스를 갖지만 'calculate'메서드를 호출 한 결과는 사용자가 제공하는 함수에 따라 다릅니다.문자열에서 구문 분석하여 데이터베이스에 저장하십시오.

이 클래스를 직렬화하여 나중에 저장하려고합니다. 용도. 이것이 내가 생각하는 것입니다.

class LogicalCharge < Charge 
    attr_reader :name, :type, :formula, :threshold 

    def initialize(name: nil, type: nil, formula: nil, threshold: nil) 
     super(name: name, type: type) 
     @formula = formula 
     @threshold = threshold 
    end 

    def parse(formula: nil) 

    end 

    def calculate(dimensions: nil) 
     parse(formula: formula).call(dimensions) < threshold 
    end 

여기서부터 어떻게하면 좋을까요?

+4

사용자 제공 코드를 실행 하시겠습니까? 나쁜, 나쁜 생각 (보안 POV에서) –

+0

다른 접근법에 대한 조언? – Tarlen

답변

0

관련 함수의 계층 구조가있는 다른 접근 방법을 제안합니다. 하나는 현재 계산 함수의 변형이고, 다른 하나는 클래스 이름과이를 실행하기위한 각 매개 변수에 대한 필드가있는 테이블입니다.

클래스가 모두 동일한 인터페이스를 따르므로 잘 작동합니다. 그러면 사용자 입력을 깨끗하게 정리할 수 있으며 사용자가 서버에 직접 실행 코드를 넣을 수 있다는 끔찍한 보안 함의를 피할 수 있습니다.

+0

10 개 이상의 다른 계산이있을 수 있습니다. 각각을 모두 서브 클래 싱해야합니까? – Tarlen

+0

@ 탈린 그들은 어떻게 다른가요? 함수가 복잡한 경우 변수에 따라 알고리즘을 사용하면 다른 클래스로 구분하는 것이 좋습니다. 매개 변수가 다른 동일한 알고리즘 인 경우 하나의 클래스 만 갖고 클래스 이름없이 DB에 매개 변수를 저장하면됩니다. –

관련 문제