平衡抽象原理

平衡抽象原则 使代码复杂易读和理解的一件事是,方法内部的指令处于不同的抽象级别。

假设我们的应用程序仅允许登录用户查看其朋友的旅行。 如果用户不是朋友,则不会显示任何行程。

一个例子:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python编写姓名年龄_python小工具 - alert弹框输出姓名年龄、求和

# 导入tkinter的所有的包里面所有的内容from tkinter import *import tkinter.messageboxasmessagebox# 从Frame派生一个Application类&#xff0c;这是所有Widget的父容器classApplication(Frame):def __init__(self,masterNone):Frame.__init__(self,master)self.pack()self.…

IIS后台网站部署不支持PUT方法 405错误

在web.config文件中添加如下代码&#xff1b;删除模块WebDAVModule <system.webServer><modules runAllManagedModulesForAllRequests"true" runManagedModulesForWebDavRequests"true"><remove name"WebDAVModule"/></mod…

IntelliJ IDEA内部设计

IntelliJ IDEA的第一版于2001年1月发布&#xff0c;当时它是第一个集成了高级代码导航和代码重构功能的Java IDE之一。 2009年&#xff0c;JetBrains开源了其社区版本 。 从那时起&#xff0c;创建了许多基于它的IDE&#xff0c;例如Google的Android Studio。 让我们使用JArc…

TDD:MS自带的单元测试 之 线程模型和执行顺序

背景 我一直在呼喊“不要靠假设编程”&#xff0c;可是我却常常这么做。我用单元测试就是一种基于假设进行编程的反面教材&#xff0c;今天就下决心弄明白它。 主要想弄明白两个问题&#xff1a; 执行的所有单元测试方法的线程模型&#xff0c;是单线程&#xff1f;是多线程&am…

JS下载图片保存在本地

const imgUrl "";// 图片链接const a document.createElement(a);// 这里是将url转成blob地址&#xff0c;fetch(imgUrl) // 跨域时会报错.then(res > res.blob()).then(blob > { // 将链接地址字符内容转变成blob地址a.href URL.createObjectURL(blob);a.…

bat文件名操作_Excel按文件名制作目录,你复制粘贴花一小时,同事只要十秒搞定...

Excel有个特殊操作&#xff0c;那就是对文件夹中上百个文件&#xff0c;用Excel按照文件名制作目录&#xff0c;我们只需要点击对于的超链接就可以快速打开对于的文件。如上图所示&#xff0c;我们的文件夹中包含有26个视频和Excel文件&#xff0c;因为文件数量过多所以我们需要…

整数返回poj1005——I Think I Need a Houseboat

这两天一直在研究整数返回之类的问题,上午正好有机会和大家讨论一下. 原题&#xff1a; Description Fred Mapper is considering purchasing some land in Louisiana to build his house on. In the process of investigating the land, he learned that the state of Louisia…

偷窥JCache API(JSR 107)

这篇文章从较高的层次介绍了JCache API&#xff0c;并提供了一个预告片–刚够您&#xff08;希望&#xff09;开始对此发痒&#xff1b;-) 在这篇文章中...。 JCache概述 JCache API&#xff0c;实现 JCache API支持的&#xff08;Java&#xff09;平台 快速了解Oracle Coh…

electron IPC通信报错Uncaught (in promise) Error: An object could not be cloned.

项目场景&#xff1a; electronreact 问题描述 electron 中用IPC通信 Uncaught (in promise) Error: An object could not be cloned. e Error: An object could not be cloned.at EventEmitter.i.invoke (node:electron/js2c/sandbox_bundle:33)at uploadImg (YakitPluginI…

Linux C中发现无法连接到math.h中的数学函数解决办法

Linux 下使用数学函数 今天在编译一个用到log函数的c文件时&#xff0c;遇到一个错误&#xff1a;/tmp/ccQuh0ns.o(.text0x2bb): In function Compute:: undefined reference to log到网上查了一下这个问题&#xff0c;原因及解决方法如下&#xff1a;出现这个错误是因为编译器…

canvas 圆角矩形填充_一篇文章让你学会你最“害怕”的Canvas,太有意思了

Canvas画布 基本用法<canvas idcanvas width"150" height"150"></canvas> <canvas>看起来跟img标签有点像&#xff0c;唯一不同的是它没有src属性和alt属性。实际上&#xff0c;canvas标签只有两个属性:width和height。 如果没有设置宽度…

通过流而不是列表

开幕式免责声明&#xff1a;这并不总是一个好主意。 我将介绍这个主意&#xff0c;以及为什么它是一个好主意的一些原因&#xff0c;但随后我将讨论一些不太理想的实例。 懒惰 如您所知&#xff0c;我在Python中涉猎的程度几乎与在Java中一样。 我一发现Python就很喜欢生成器。…

react-infinite-scroll-component 第二次加载无法触发next

react-infinite-scroll-component 是一款滚动加载插件&#xff0c;在页面滚动的时候加载数据&#xff0c;在使用过程遇到一个坑。 坑的描述&#xff1a; 在页面滚动的时候&#xff0c;infiniteScroll页面数是自动1,打个比方说&#xff0c;页面加载到第三页&#xff0c;infinit…

linux查看文件大小和查看磁盘使用情况

1、df -h 显示目前所有文件系统的可利用空间及和使用情况。参数 -h表示人类可以看懂的格式输出 2、du -h --max-depth1 目录 查询指定文件夹下各个文件夹或文件的大小 3、du -sh test/ 或 du -sm * |sort -n 查看文件目录的大小和数量&#xff0c;并且可以按大小排序 du和df的…

abaqus单位_ANSYS和ABAQUS哪个好,一个例子告诉你

分别用ANSYS和ABAQUS来分析同一个题目并考察其异同点。【问题】一根悬臂梁&#xff0c;长200mm,截面是30mm*20mm的矩形(高度方向是20mm)。该梁左端固定&#xff0c;在其上面施加向下的分布力系&#xff0c;载荷集度是0.6Mpa.已知材料使用低碳钢&#xff0c;弹性模量是200GPA&am…

electron nodejs上传文件获取文件流

使用antd upload组件&#xff0c;electron中ipcRenderer.invoke无法传递文件流&#xff1b; 传文件路径过去&#xff0c;然后使用nodejs获取文件流 // 创建数据流const readerStream fs.createReadStream(path)const formData new FormData()formData.append("file_name…

使用junit做其他事情

junit&#xff01;单元测试 Junit是Java单元测试框架。 通常&#xff0c;我们将其用于单元测试&#xff0c;但是很多时候我们也使用它来执行集成测试。 主要区别在于&#xff0c;单元测试可测试单个单元&#xff0c;而集成测试则可测试不同类如何协同工作。 这样&#xff0c;集…

转行python能拿到多少钱_想转行学python过来人提醒大家几点

因为目前python非常火&#xff0c;应用也非常广泛&#xff0c;是目前最火的行业之一&#xff0c;竞争很大&#xff0c;工资很高&#xff0c;未来发展也极好。Python 现在到底有多热呢&#xff1f;我觉得我们可以看以下的这2组数据。第一&#xff1a;Python 排名稳居前五得益于 …

纯前端 导出excel 插件xlsx和file-saver

使用插件 xlsx 导出表格&#xff0c;file-saver保存文件 vue-element-admin,源码中找的&#xff1b;导出上万条数据还是很快的 gitHub地址,/vendor/Export2Excel的js文件 使用方法 export_json_to_excel({header: res.header,data: res.exportData,filename: ${fileName}1-$…

用Java创建自己的AOP

介绍 如您所知&#xff0c;AOP是Spring框架提供的最好的功能之一&#xff0c;它在实现跨领域关注的同时提供了最大的灵活性。 您是否想到过AOP在Spring如何工作&#xff1f; 有时这是高级技术面试时要问的问题。 有时&#xff0c;仅涉及核心Java时&#xff0c;这个问题变得更加…