2012-12-04 27 views
2

仍在学习clojure,并试图围绕clojure和协议进行实验。我的主要问题是我的代码是否提取低级别数据库交互的正确方法,以便为我的数据库添加特定数据类型提供更简洁的方法?clojure,用于插入数据库项目的协议

(defn- db-insert 
[table record] 
"Inserts record based on table/record map" 
(sql/with-connection 
    rosay-db 
    (sql/transaction 
    (sql/insert-record table record)))) 

;; public interface 
(defprotocol DBFactory 
    (add-item [_] "Adds item to db")) 

(defrecord Page [name description keywords frontpage client_id pages_type_id] 
    DBFactory 
    (add-item [_] 
    (db-insert :pages {:name name 
           :description description 
           :keywords keywords 
           :frontpage frontpage 
           :client_id client_id 
           :pages_type_id pages_type_id}))) 

(defrecord Client [username password email domain] 
DBFactory 
    (add-item [_] 
    (db-insert :clients {:username username 
         :password password 
         :email email 
         :domain domain}))) 

然后在我的nrepl我可以做到以下几点:

rosay.server=> (use 'rosay.models) 
nil 
rosay.server=> (add-item (->Client "booyaka" "fark" "mailzer" "domain.com")) 
{:updated_on nil, :created_on #inst "2012-12-04T04:25:22.672462000-00:00", :email "mailzer",  :domain "domain.com", :password "fark", :username "booyaka", :id 10} 

我猜我只是好奇,如果我攻击这个问题的方法是正确的,甚至是有道理的。到目前为止,我可以通过简单地用我的记录类型调用我的协议来完成客户端和页面,并且一切似乎都行得通。也许我正在克服这个问题,只写几个函数就是了?

感谢

回答

2

国际海事组织它不是隐藏仅分贝互动两个远距离类型的客户端和页面之间的差别是非常有用的。没有其他多态操作(例如,对象创建,对象处理等),它不会减少/抽象代码。无论如何,这些类型在所有应用中都不同于“相同”item。更为清楚的是,为这些类型创建单独的操作(例如,添加页面,添加客户端)。如果你真的需要这个,你可以比较你的解决方案与multimethods提供调度机制,但不要强迫你使用OOP。

+0

感谢您的快速响应! – battlemidget