编译原理抽象语法树_平衡抽象原理
编译原理抽象语法树
使代码复杂易读和理解的一件事是,方法内部的指令处于不同的抽象级别。
假设我们的应用程序仅允许登录用户查看其朋友的旅行。 如果用户不是朋友,则不会显示任何行程。
一个例子:
public List<Trip> tripsByFriend(User user, User loggedInUser) {return (user.friends().contains(loggedInUser)) ? userRepository.findTripsBy(user.id()): Collections.emptyList();
}
在上面的代码中,方法主体中的所有指令处于不同的抽象级别。 我们有验证友谊的指令,通过协作者获取朋友的旅行列表的指令以及返回空且不变的列表的低级Java API。 最重要的是,我们拥有商业行为本身。
现在让我们看一下相同方法的重构版本:
public List<Trip> tripsByFriend(User user, User loggedInUser) {return (user.isFriendsWith(loggedInUser)) ? tripsBy(user): noTrips();
}private List<Trip> tripsBy(User user) {userRepository.findTripsBy(friend.id());
}private List<Trip> noTrips() {return Collections.emptyList();
}
在这个新版本中,我们将低级抽象提取到私有方法中,并且还将某些行为移至User类。 进行此更改后,所有指令都处于相同的抽象级别,从而使业务规则清晰明了。 现在,公共方法可以告诉我们一个故事,而无需担心技术实施细节。 现在,代码读取时没有任何颠簸:“如果用户是已登录用户的朋友,则按用户返回行程,否则不返回行程。”
平衡抽象原理(BAP)
平衡抽象原理定义了按较高级别构造分组的所有代码构造应处于同一抽象级别。 这意味着:
- 方法中的所有指令应处于相同的抽象级别
- 类内的所有公共方法都应处于相同的抽象级别
- 包/命名空间中的所有类
- 父包/命名空间中的所有同级包/命名空间
- 所有模块,子系统等
该原理也适用于测试-单个单元(方法,类,模块,系统)的所有测试应处于相同的抽象级别。
BAP和SRP
符合“单一职责原则”的代码也更有可能也符合“平衡抽象原则”。 但是,情况并非总是如此,相反的情况并非总是如此。
结论
为了获得精心设计的代码,我们需要考虑许多设计原则,我认为,平衡抽象原则(BAP)是SOLID原则和整个软件设计中缺少的部分。
翻译自: https://www.javacodegeeks.com/2015/03/balanced-abstraction-principle.html
编译原理抽象语法树
编译原理抽象语法树_平衡抽象原理相关推荐
- java抽象语法树_抽象语法树AST的全面解析(一)
Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...
- ast抽象语法树_新抽象语法树(AST)给 PHP7 带来的变化
本文大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstract_syntax_tree,为了易于理解从源文档中节选部分进行介绍. 我的官方群点击此 ...
- python 抽象语法树_抽象语法树(Abstract Syntax Tree)
一般来说,程序中的一段源代码在执行之前会经历下面三个步骤 1 分词/词法分析 这个过程会将由字符组成的字符串分解成有意义的代码快,这些代码块被称为词法单元.例如 var a = 4:会被分解成 var ...
- java抽象语法树_抽象语法树(AST)
抽象语法树(AST) 最近在做一个类JAVA语言的编译器,整个开发过程,用抽象语法树(Abstract SyntaxTree,AST)作为程序的一种中间表示,所以首先就要学会建立相对应源代码的AST和 ...
- python 抽象语法树_用python演示一个简单的AST(抽象语法树)
假设对'a + 3 * b'进行解释,其中a=2,b=5 代码很简单,就不再进行详细的解释了. Num = lambda env, n: n Var = lambda env, x: env[x] A ...
- 抽象语法树的简单原理
抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码 ...
- Scala的抽象语法树打印小工具-小拉达
为什么80%的码农都做不了架构师?>>> 最近做的两个项目,一个是VeriScala,另一个是Lickitung,都涉及到了Scala的抽象语法树(AST),前者是写macro ...
- AST(抽象语法树)超详细
自己研究的东西会用到AST,就自己通过查阅资料,整理一下. 本文目录 第一部分:AST的作用 第二部分:AST的流程 第三部分: Eclipse AST的获取与访问 第一部分:AST的作用 首先来一个 ...
- 抽象语法树手动生成--java实现
本人博客内编译原理文章的配套资源jar包,包括词法分析,语法分析,中间代码生成,静态语义检查,代码解释执行以及抽象语法树的手动生成:https://download.csdn.net/download ...
最新文章
- MyBatis日志到底是如何做到兼容所有常用日志框架的?
- 8.17——继续熟悉linux的命令行
- CCSpriteBatchNode的使用
- VS Code集成SandDance可视化分析数据
- Java开发必须掌握的5种加密策略
- 黑洞照片背后的女人:她的算法让数据“拼”成了照片
- python3.4编程_python编程:从入门到实践习题3-4~3-7
- cocoapods 详尽使用
- 艺术签名制作工具v1.0
- (UML)统一建模语言简介(关系详解)
- 计算机网络之了解计算机网络
- 霜降已至,你妈喊你加裤添衣!感恩老妈,就送她智慧云谷新风机
- 知识点 - 后缀数组
- 将谷歌网盘的文件搬运到百度网盘
- 不用网页另存PDF,浏览器在线简单查找下载PDF文件分享
- 使用pyecharts绘制各个3D图表代码示例整理和分享
- 几种常见的软件授权模式
- 梁漱溟:年轻人的焦虑,在于把欲望当做志气
- php条件查询,PHP-----多条件查询(示例代码)
- 算法设计与分析之ZOJ2104- Let the Balloon Rise