PhalGo-ADM思想

PhalGo-ADM思想

关于ADM思想主要是指在API开发中使用API,Domain和Model三层结构,PhalGo从PhalApi中学习并且推崇这种设计模式,这种模式的好处在于分工明确,业务复用,数据复用可以减少复杂业务重复的代码量,很多框架关心性能,而不关心人文;很多项目关心技术,而不关注业务。ADM设计就是从业务的角度出发建立的开发规范.

ADM分工协作

Api

Api层可以理解为是请求开始结束以及组合业务的地方,主要负责以下几件事情:

  1. 获取请求参数并且验证请求参数的有效性
  2. 对Domain领域层的实现进行拼接来组成整个接口的业务
  3. 对于返回结果进行处理

我们可以看一个获取用户详情接口的例子:

func (this *User_Api)GetUserInfo() echo.HandlerFunc {

    return func(c echo.Context) error {
        Request := phalgo.Requser{Context:c}
        Response := phalgo.Response{Context:c}
        defer Request.ErrorLogRecover()

        //获取请求参数
        id := Request.GetParam("id").GetInt()
        //拼接领域层业务
        user, err := this.Domain.User.GetUserInfo(id)
        if err != nil {
            return Response.RetError(err, 400)
        }
        //返回结果
        return Response.RetSuccess(user)
    }
}

(1)Api接口层应该做:

  • 应该:对用户登录态进行必要的检测
  • 应该:控制业务场景的主流程,创建领域业务实例,并进行调用
  • 应该:进行必要的日志纪录
  • 应该:返回接口结果

(2)Api接口层不应该做:

  • 不应该:进行业务规则的处理或者计算
  • 不应该:关心数据是否使用缓存,或进行缓存相关的直接操作
  • 不应该:直接操作数据库
  • 不应该:将多个接口合并在一起

Domain

Domain可以称之为领域层,是ADM(Api-Domain-Model)分层中的桥梁,主要负责处理业务规则。Domain层存在的目录是为了把复杂业务拆分成一个一个小模块然后组织起来实现复杂的业务,从而达到代码复用,拆分复杂业务的作用.

举个栗子

场景:我们在传统MVC开发的时候,使用控制器来处理业务,我们可能会写很多的重复代码来验证用户提交的信息是否ok,比如完善信息的时候验证邮箱,在修改用户信息的时候也要验证修改的邮箱,在管理的时候去编辑一个用户的时候也可能在去验证邮箱,这个时候我们的验证逻辑代码已经重复写在了3个地方,如果有一个需求加入了电话号码,那么你需要在3个地方加上对电话号码的验证逻辑

场景一并不难以遇到,而且在复杂的业务情况下重复使用的业务逻辑会更多,如果我们使用了Domain来处理用户修改前的验证那么我们只需要修改这个验证逻辑加上对电话号码的验证,那么所有需要验证用户信息的地方就会全部生效,而不用去做重复的工作并且避免遗漏的风险

下面是我们获取User详情的Domain层的实现,它不仅仅只是可以用在获取用户详情也可以用来验证用户ID是否有效,增加代码复用性减少修改代价

func (this *Domain_User)GetUserInfo(id int)(Model.User,error) {

    user, err := this.Model.User.GetInfoById(id)
    if err != nil {
        return user, errors.New("UserInfo There is no")
    }
    return user,nil
}

一个函数如果超过了一屏那将会影响到阅读者的理解,使用领域层拆分笨重的业务可以很好的解决这个问题

Model

Model层想必不用说了,就是和数据库通讯获取数据,Model层是单纯的不带任何业务只是简单的获取数据库数据,我们看一段Model层代码:

type User struct {
    Id     int       `gorm:"column:aId"`
    Name   string    `gorm:"column:name"`
    Passwd string    `gorm:"column:passwd"`
    Email  string    `gorm:"column:email"`
}

func (User) TableName() string {
    return "user"
}

func (this *User)GetInfoById(id int) (User, error) {

    User := User{}
    err := phalgo.GetORM().Where("id = ?", id).First(&User).Error
    return User, err
}

注意:Model层只应该获取数据然后结束关于没有获取到数据,获取出错等情况抛出到Domain层进行处理,这样可以增加灵活性,比如通过用户名是否重复和通过用户名称获取ID,一个返回存在才算异常,一个返回不存在才算异常,具体更具业务不同体现也不同,所以Model层处理并不合适

层级调用的顺序

整体上讲根据从Api接口层、Domain领域层再到Model数据源层的顺序进行开发。

在开发过程中,需要注意不能越层调用也不能逆向调用,即不能Api调用Model。而应该是上层调用下层,或者同层级调用,也就是说,我们应该:

  • Api层调用Domain层
  • Domain层调用Domain层
  • Domain层调用Model层
  • Model层调用Model层

为了更明确调用的关系,以下调用是 错误 的:

  • 错误的做法1:Api层直接调用Model层
  • 错误的做法2: Domain层调用Api层,也不应用将Api层对象传递给Domain层
  • 错误的做法3: Model层调用Domain层

这样的约定,便于我们形成统一的开发规范,降低学习维护成本。

比如需要添加缓存,我们知道应该定位到Model层数据源进行扩展;若发现业务规则处理不当,则应该进入Domain层探其究竟;如果需要对接口的参数进行调整,即使是新手也知道应该找到对应的Api文件进行改动。

时间: 2024-08-16 23:31:55

PhalGo-ADM思想的相关文章

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

Android 3.0设计思想规范和UI设计规范

文章描述:Android 3.0(蜂巢)交互&UI设计规范. Android OS自上市以来,由于缺乏统一规划,使得不同设备在 1.5.1.6.2.0.2.1.2.2.2.3几大版本徘徊,本人用的HTC Hero(俗称G3)也是从1.5~2.3一个个版本,10多个rom手动刷机试过来的,过程及其纠结 ~.多系统版本带来的问题就是缺乏交互.UI的一致性,外加硬件厂商HTC.摩托罗拉.三星.夏普(创新工场点心OS).小米(MIUI)等公司热衷于UI的个性化发挥,以及民间高手的DIY rom 等因素,

优秀的Web设计:优秀设计思想的10项原则

文章描述:优秀Web设计10项原则:创新实用富有美感. 他能够为我们使用家用电器的方式掀起一场革命,现在我们仍然把它作为现代世界的设计灵感,最好例子就是Apple.Apple的许多畅销产品的核心功能都采用了Dieter Rams的设计原则. Dieter Rams最著名的设计思想是优秀设计的10项原则,这些原则通常用来做出好的设计或对其进行归类.这些原则包含了在创建项目的时候设计师需要考虑到的问题,但是这些原则最适用于工业设计,因为Dieter Rams正是在这个领域做出了非同寻常的作品,并得出

ava-求解以下代码的绘图思想

问题描述 求解以下代码的绘图思想 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; // Graphics2D g3 = (Graphics2D) g; drawCoordinate(g2); Line2D line; // Line2D li; g2.setColor(Color.BLACK); g2.drawString("(" + (pt

算法设计-猜猜我是谁游戏设计编程思想

问题描述 猜猜我是谁游戏设计编程思想 像微软小冰的读心术类似通过程序给出的几个问题选择是否来推出所猜的人,这要用什么数据结构 解决方案 这个是根据语义匹配等算法实现的.

说说掌握JavaScript语言的思想前提

无论是公司的同事还是外界的程序员朋友们,大部分人对JavaScript的高级应用不甚了解,已有的知识架构里会认为JavaScript仅仅是一门脚本语言,其作用是给页面做一些锦上添花的效果,比如表单验证等等.潜意识里也就不会用面向对象的思想去编写JavaScript代码,也很少会去深入了解prototype, closures等概念.这导致书写的代码经常很糟糕. 对于JavaScript的学习,可能最重要的还是要从思想上认识到JavaScript不是玩具语言.JavaScript的作用远不止增加点

[雷军.小米]用互联网思想武装自己

两年前的4月6日,我们几个人,在北四环的银谷大厦静悄悄的创办了小米公司,一起喝了碗小米粥,就开始艰难的创业之旅.仅仅两年时间,小米在百度手机品牌排行榜排在前五名,也在淘宝销售排行榜名列前茅,第一年估计至少可以销售500万部手机,米聊也超过了1300万用户. 一家创业公司,短短两年时间,如何创造了这么多的奇迹?很多人都好奇问我,为什么?   雷军:用互联网思想武装自己 两年前的4月6日,我们几个人,在北四环的银谷大厦静悄悄的创办了小米公司,一起喝了碗小米粥,就开始艰难的创业之旅.仅仅两年时间,小米

从网站抄袭谈民间设计思想匮乏

设计  网易学院:蓝色你好,很高兴能约你作这期关于设计的访谈.中国有句老话,叫"盗亦有道",但在互联网上,很多人显然忘记了这句古训.如今在网上有很多网站都跟你的网站是一样的.说的好听是模范.借鉴,说得不好其实性质就是抄袭甚至是照搬.您是怎么看这个问题的. 蓝色:这个问题是由来以久的,现在的网络开发者,有大致三种,一种是半道出家,一种是程序员出身,一种是设计师出身. 有很多人是半路出家的,不是程序师,也不是设计师出身,他们有自己做网站的优势,比如对某个专业了解.有兴趣.有精力,所以选择了

避免OOP的形式,POP的思想

避免OOP的形式,POP的思想 好久没发技术性文章了,今天在21PHP里看到有位兄弟发了这贴子,转了过来.对加强OOP的学习有些用 ----------------------------------------------------------避免OOP的形式,POP的思想随着PHP对OOP(面向对象编程)支持的增强以及程序设计思想的发展,越来越多的PHP程序员走进了OOP的世界.通过简单的学习,大多数程序员都能 快速的掌握OOP编程的基本技能.程序员们所写的代码里class,new等字符串