2014-09-16 3 views
0

나는 보안 위험 평가를 수행하는 데 도움이되는 Clojure 프로그램을 작성 중이다.Clojure 스타일/관용구 :지도를 만들고 다른지도에 추가하기

나는 Clojure 관용구 및 작풍에 대한 질문이있다.

위험 평가에서 자산에 대한 새로운 기록을 만들려면 나는 현재 (지도와) 작업하고있는 위험 평가와 자산에 관한 많은 정보를 전달하고 자산 생성 기능은 자산을 생성합니다 RA에 추가하고 새로운 RA를 리턴합니다.

이 방법이 현명한 방법으로 보입니까?

좀 더 간단하고 간단하게 만들 수 있습니까? 내가 생각하고

특별한 사항은 다음과 같습니다

  • 화장 자산해야한다 위험 평가에 자산을 추가? (자산은 위험 평가 외의 의미가 없습니다.)
  • 에는 애셋을 만드는 간단한 방법이 있습니다. 및
  • 위험 평가에 추가 하시겠습니까?

+0

select-keys는 복사 작업을 수행하는 친구입니다. http://clojuredocs.org/clojure_core/clojure.core/select-keys – Dapeng

답변

0

Clojure의 (그리고 다른 리스프 방언)의 핵심 원리는 작은 작성 가능 함수를 만드는 것입니다 감사합니다.

위험 평가에 추가되기 전에 자산이 완전한 형식의 자산을 기대하는 코드에 노출되지 않는 한 자산이 위험 평가 외부에서 작성되는 경우 문제가되지 않습니다.

그래서 나는 다음 (안된를) 제안 : 또한 함수 인수의 형태를 확인하기 위해 유용 Schema 라이브러리를 찾을 수

(defn add-asset-ra 
    [{:keys [current-ia-ref] :as risk-assessment} asset] 
    (let [ia-ref (if current-ia-ref 
       (inc current-ia-ref) 
       1)] 
    (-> risk-assessment 
     (assoc :current-ia-ref ia-ref) 
     (update-in [:assets] #(conj % (assoc asset :ia-ref ia-ref)))))) 

(defn make-asset 
    [name description owner categories 
    & {:keys [author notes confidentiality integrity availability] 
     :or {author "" notes "" confidentiality 3 integrity 3 availability 3}}] 
    {:name name 
    :desc description 
    :owner owner 
    :categories categories 
    :author author 
    :notes notes 
    :confidentiality confidentiality 
    :integrity integrity 
    :availability availability 
    :vulns []}) 

.

+0

감사합니다. 나는 코드 분할을 고려했지만 코드에서 보여 주듯이 결과는 더 복잡한 코드입니다. –

1

몇 가지 제안 사항이 적용될 수도 있고 적용되지 않을 수도 있습니다.

  1. 값이nil 없다 위한 Clojure의 관용구. 그걸 써.
  2. asset을 평면 맵으로 표시하십시오. 게재 순위와 키워드 인수가 섞여있어 이 자산을 유효하게 만드는 내용의 변경에 혼동을 일으키고 취약합니다.
  3. @Symfrog과 같이 자산의 유효성 확인을 위험 평가와의 연관에서 분리하십시오.
  4. :current-ia-ref을 위험에 처한 것으로 취급해야합니다. 평가. 그것은 단지 자산입니다.
  5. 자산에 대한 기본 항목을 맵으로 당깁니다. 원하는 기본값으로 변경할 수 있습니다.

    :current-ia-ref는 카운트되지 않습니다 댓글에

    (def asset-defaults {:confidentiality 3, :integrity 3, :availability 3}) 
    
    (defn asset-valid? [asset] (every? asset [:name :description :owner])) 
    
    (defn add-asset [risk-assessment asset] 
        (if (asset-valid? asset) 
        (update-in 
         risk-assessment 
         [:assets] 
         conj (assoc 
          (merge asset asset-defaults) 
          :ia-ref (inc (count (:assets risk-assessment))) 
          :vulns [])))) 
    

    응답 :

이 우리에게 다음과 같은 (테스트되지 않은) 같은 것을 제공합니다. 저작물이 삭제 된 경우 :current-is-ref을 줄여서는 안됩니다.

다음 (4)는 적용되지 않습니다.

가치가없는 Clojure 관용구가 nil이라는 진술이 적절하지는 않습니다. 이 맥락에서 더 설명해 주실 수 있습니까?

Differences with other Lisps 인용 : Clojure의 전무 수단 '아무것도'에서 을. 모든 유형의 값이 없음을 나타내며 목록 또는 시퀀스에만 적용되지 않습니다..

이 경우 :author 또는 :notes 빈 문자열 값을 제공 할 필요가 없습니다.

'평면지도': 함수에 대한 인수에 대해 이야기하고 있습니까? 그렇다면 동의합니다.

예.

asset-valid? 기능을 정의하는 이유가 확실하지 않습니다. 이는 원래의 요구 사항을 다소 초과하는 것 같습니다. 개인적으로는 사실을 확인하기보다는 유효한 자산 만 만들 수 있다는 것을 선호합니다.

귀하의 add-asset 함수는 인수 목록의 구조가 위험 평가, 이름, 설명, 소유자카테고리이 존재하는 (나는 를 확인하는 것을 잊었다 있는지 확인하기 위해 사용 카테고리). 데이터를 단일 인수로 전달할지 아니면 비 구조로 전달할지에 따라지도로 표시하면이 제약 조건을 잃게됩니다. 따라서 데이터를 명시 적으로 확인해야합니다 (별개의 기능으로 수행할지 여부는 문제입니다). 하지만 이점이 있습니다 :

  • 특정 인수가 있는지 이상을 확인할 수 있습니다.
  • 당신은 인수에 주문을 기억 할 필요가 없습니다. 버전이 나는 자산을하기로 결정하면 미래의 기록은 내가 모든 코드를 변경해야 할 것입니다 것을 의미하지 않을까요

을 그건 부가 자산이라고?

아니요 A 레코드는지도로 동작하며 IPersistentMap을 구현합니다. 분명히 make-asset을 변경해야합니다.

... 내 접근 방식은 자산이 무엇인지에 대한 세부 정보가 숨겨져있는 반면?

어떤 의미에서 자산의 내용이 숨겨져 있습니까? 자산은 특정 키가 필요하며 다른 여러 특정 키를 가질 가능성이있는지도입니다. 자산이 '정말로'레코드인지 여부는 중요하지 않습니다.

+0

응답 해 주셔서 감사합니다. : current-ia-ref는 카운트가 아닙니다. 자산이 삭제 된 경우에는 다음을 줄여서는 안됩니다. current-is-ref. –

+0

Clojure 관용구가 아무 가치가 없다는 것이 귀하의 진술과 관련이 있는지 확실하지 않습니다. 이 맥락에서 더 설명해 주실 수 있습니까?

+0

'평면지도': 함수에 대한 인수에 대해 이야기하고 있습니까? 그렇다면 동의합니다.