模块化设计,减少了耦合

时间:2016-05-27 01:30:39

标签: go modularity

我正在使用golang构建RESTful API。 我正在使用gin-gonic框架和mgo进行mongodb连接。

我正在努力建立这种模块化......(我不认为我确切地知道我在说什么,并试图这样做.XD LOL)

与所有其他软件一样,我的项目有多个集合,未来会有更多的集合。

我想尽可能地将每个模块与其他模块分开,以便我可以

  1. 逐步添加模块
  2. 为将来的项目重用代码,只需添加文件即可添加功能(在这种情况下,我可能需要将每个模块放入一个单独的包中)。
  3. 这是我目前的项目结构。

    • main.go - 包含主要功能
    • database.go - 用Db打开连接的小功能
    • users.go - 用户集合相关文件
    • users-controller.go - 包含用户集合的gin.HandlerFunc
    • contents.go - 内容集合相关文件
    • contents-controller.go - 包含用于内容集合的gin.HandlerFunc

    代码 https://gist.github.com/letsdevus/5121381be7cb1065e62ae403f14cd562

    userscontents模块完全独立。 从项目中删除内容* .go文件将干净地禁用项目中的内容模块。 添加一些非依赖模块也很容易。我无需触摸任何代码,只需添加文件即可。

    我会为此给予自己的荣誉。

    但现在我正在尝试添加一个必须与其他模块交互的模块。

    它被称为'活动'模块。 该模块必须与其他模块交互以跟踪正在发生的活动。

    例如,当插入发生在用户集合上时,活动模块需要知道它发生了以便它可以记录活动。

    实施活动模块的一种简单方法是在调用activities.insert("NewUser", Id)后添加一行users.Insert()

    这种方法的问题非常明显。

    1. 我必须为所有收藏品做这件事。
    2. 更重要的是,当我从项目中删除活动文件时,我需要注释掉与其他模块相关的所有活动。
    3. 我希望你能听到我解决这个问题的计划,并告诉我它是否可行或是否还有其他更好的方法。

      我目前可能的解决方案:活动经理

      eventmanager.go将作为main.go和database.go等基本文件之一添加到项目中。

      eventmanager.go

      package main
      
      type EventFunc func()
      
      type EventManager struct {
          events map[string][]EventFunc
      }
      
      func (i *EventManager) AddEvent(eventName string, fn EventFunc) {
          i.events[eventName] = append(i.events[eventName], fn)
      }
      
      func (i *EventManager) RunEvents(eventName string) {
          for _, fn := range i.events[eventName] {
              fn()
          }
      }
      
      var eventManager EventManager // Globally available
      

      users.go Insert()函数中,我添加了

      eventManger.RunEvent("usersPostInsert")
      

      dbcUsers.Insert(&user)之后。

      在activities.go文件的init()中,我添加了

      eventManager.AddEvent("usersPostInsert", newUserActivity)
      

      activities.go

      的末尾
      func newUserActivity() {
        // Do something. For now just print a message
        log.Print("New User is Inserted!")
      }
      

      这样当我取消活动模块时,不会出现问题。

      我希望你能理解我想要做的事情。

      我真的很想知道这是不是解决这个问题的好方法。

      P.S。如果你打算投票这个问题,因为它更像是代码审查,只需留下评论。 (以某种方式投票让我真的很不舒服大声笑)

0 个答案:

没有答案