我正在编写一个Clojure程序,以帮助我执行安全风险评估(最终得到了Excel的补充)。
我有一个关于Clojure成语和风格的问题。
为了在风险评估中创建关于资产的新记录,我在当前正在使用的风险评估(地图)中传递了有关资产的新记录,以及关于该资产的一组信息,我的make-asset函数创建了该资产,并将其添加到R-A并返回新的R-A。
(defn make-asset
"Makes a new asset, adds it to the given risk assessment
and returns the new risk assessment."
[risk-assessment name description owner categories
& {:keys [author notes confidentiality integrity availability]
:or {author "" notes "" confidentiality 3 integrity 3 availability 3}}]
(let [ia-ref (inc (risk-assessment :current-ia-ref))]
(assoc risk-assessment
:current-ia-ref ia-ref
:assets (conj (risk-assessment :assets)
{:ia-ref ia-ref
:name name
:desc description
:owner owner
:categories categories
:author author
:notes notes
:confidentiality confidentiality
:integrity integrity
:availability availability
:vulns []}))))这看起来是一种明智的做法吗?
我能让它变得更地道,更短,更简单吗?
我想的特别事情是:
谢谢
发布于 2014-09-17 16:25:03
Clojure (和任何其他Lisp方言)的一个核心原则是创建小的可组合函数。
如果一个资产是在风险评估之外创建的,只要该资产在添加到风险评估之前没有暴露于期望完全形成的资产的代码中,这就不是一个问题。
因此,我建议如下(未经测试):
(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 []})您还可能发现模式库对于验证函数参数的形状很有用。
https://stackoverflow.com/questions/25875987
复制相似问题