Tier abstraction of data in Go -


i going create project in go, want separate tiers. goal create package has code dao pattern, i.e. wish caller should communicate interface of service (which might project) , not implementation. avoid situation of future change database, caller should not change , should transparent change.

i thinking of creating project db contains file called persistence package persistence well

http://play.golang.org/p/o9b93f4ljp

package persistence  // interface have crud need use service(another project) type recorder interface {     selectkey([]byte) (err error)     insert([]byte, []byte) (err error)     update([]byte, []byte) (err error)     delete([]byte) (err error) }  // struct oracle type managedataoracle struct { } // struct binarytree type managedatabinarytree struct { } // struct mongodb type managedatamongodb struct { }  // implemtations oracle func (memory *managedataoracle) selectkey(pkey []byte) error {     // logic oracle here     return nil } func (memory *managedataoracle) insert(pkey []byte, pvalue []byte) error {         // logic oracle here     return nil } func (memory *managedataoracle) update(pkey []byte, pvalue []byte) error {     // logic oracle here     return nil }  func (memory *managedataoracle) delete(pkey []byte) error {     // logic oracle here     return nil }  // implemtations binary tree func (memory *managedatabinarytree) selectkey(pkey []byte) error {     // logic binary tree here     return nil } func (memory *managedatabinarytree) insert(pkey []byte, pvalue []byte) error {         // logic binary tree here     return nil } func (memory *managedatabinarytree) update(pkey []byte, pvalue []byte) error {     // logic binary tree here     return nil }      func (memory *managedatabinarytree) delete(pkey []byte) error {     // logic binary tree here     return nil }  // implemtations mongo db func (memory *managedatamongodb) selectkey(pkey []byte) error {     // logic mongodb here     return nil } func (memory *managedatamongodb) insert(pkey []byte, pvalue []byte) error {         // logic mongodb here     return nil } func (memory *managedatamongodb) update(pkey []byte, pvalue []byte) error {     // logic mongodb here     return nil }  func (memory *managedatamongodb) delete(pkey []byte) error {     // logic mongodb here     return nil } 

any advice on how separation of concepts, or how previous code should called project?

you on right track different persistence mechanisms use different key types (for example integer in oracle , string-like identifier in mongo).

the serialization of data []byte should handled abstraction layer because different underlying persistence engines use different representations of data. consider instance integer , it's endianness.

hence change signatures of interface following:

type recorder interface {     selectbykey(interface{}) error     deletebykey(interface{}) error     insert(interface{}, interface{}) error     update(interface{}, interface{}) error } 

this way can panic inside, selectkey if given key not of correct type specific implementation. wouldn't possible if serialized key beforehand , lead trouble.


Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -