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
Post a Comment