首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

「首席看软件架构」DDD,六边形,洋葱,干净,CQRS整合架构

这篇文章是软件架构编年史一部分,一系列关于软件架构文章。在这些文章中,写了对软件架构了解,如何看待,以及如何使用这些知识。如果您阅读了本系列以前文章,那么本文内容可能更有意义。...如果在某个时候我们决定改变数据库供应商,比如PostgreSQL或MongoDB,我们只需要创建一个适配器来实现PostgreSQL特定持久化接口,并注入新适配器而不是旧。...[编辑- 2017-11-18]完全错过了用来查询返回数据DTO,所以我现在添加了。感谢MorphineAdministered公司指出了这一点。 ?...然而,这并不总是需要,事实上在大多数情况下,处理程序将包含用例所有逻辑。如果需要在另一个处理程序中重用相同逻辑,则只需要将逻辑处理程序提取到单独应用程序服务中。...[编辑- 2017-11-18]完全错过了用来查询返回数据DTO,所以我现在添加了。感谢MorphineAdministered公司指出了这一点。 ?

5K22

Java 异常|Java Exceptions

本文是对以下内容分析:Java异常设计,Java异常可以告诉什么,以及如何使用Java异常。 Java Exceptions Java Exception 是处理异常应用程序行为而创建类。...Java 中异常处理 有两种方法可以处理抛出异常:在当前方法中处理或者只是重新抛出。没有比这更好方法了。您可能一个处理程序或以某种方式处理,例如制作重试逻辑。  ...提供例外可能是彼此父级,但是,在这里,只列出最流行案例,而不管它们关系如何:  潜在原因原因可能性有多大怎么修需要重写代码吗?需要重启吗?...空指针异常预期不可为空对象空高调用前添加验证层是的是的某些资源不可用并返回数据中等调用前添加验证层是的是的并发修改异常迭代期间集合已更改分别进行集合迭代和修改是的是的 集合在迭代期间已从另一个线程更改集合添加同步是的是的非法参数异常传递参数无效高在传递参数之前添加验证是的是的数字格式异常传递参数格式错误或符号错误高在传递数据之前添加格式或删除不可见符号是的是的...就个人而言,更喜欢使用运行时异常。即使在设计库情况下,您仍然可以在方法签名中保留运行时异常,并在 API 中添加一些注释。在这种情况下,您 API 用户将能够决定如何处理

3.1K40
您找到你想要的搜索结果了吗?
是的
没有找到

「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构,CQRS整合架构

这篇文章是软件架构编年史一部分,一系列关于软件架构文章。在这些文章中,写了对软件架构了解,如何看待,以及如何使用这些知识。如果您阅读了本系列以前文章,那么本文内容可能更有意义。...辅助或驱动适配器 与围绕端口驱动适配器不同,驱动适配器实现一个端口和一个接口,然后将其注入到应用程序核心中,无论哪里需要端口(类型暗示)。 例如,假设我们有一个需要持久化数据简单应用程序。...如果在某个时候我们决定改变数据库供应商,比如PostgreSQL或MongoDB,我们只需要创建一个适配器来实现PostgreSQL特定持久化接口,并注入新适配器而不是旧。...查询对象将包含一个优化查询,该查询将简单地返回一些原始数据以显示给用户。该数据将以DTO形式返回,并注入到ViewModel中。这个视图模型可能有一些视图逻辑,它将被用来填充一个视图。...然而,这并不总是需要,事实上在大多数情况下,处理程序将包含用例所有逻辑。如果需要在另一个处理程序中重用相同逻辑,则只需要将逻辑处理程序提取到单独应用程序服务中。

1.9K30

90%Java程序员不会10道Java面试题

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。...关于 readObject() 方法, 需要注意一点很重要一点是, 它用于持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确类型。

99200

来一场Java高级面试,看看自己啥水准

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。...关于 readObject() 方法, 需要注意一点很重要一点是, 它用于持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确类型。

1K10

史上最难10道 Java 面试题!

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。...关于 readObject() 方法, 需要注意一点很重要一点是, 它用于持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确类型。

82830

听说这10道Java面试题90%的人都不会!!!

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

62320

挑战10个最难回答Java面试题(附答案)

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

1.4K40

挑战 10 道超难 Java 面试题

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

71320

Java 大牛看过来,挑战10道超难 Java 面试题!

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

70031

挑战 10 道超难 Java 面试题

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

66820

挑战 10 道超难 Java 面试题

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

72510

10 大 Java面试难题,打趴无数面试者!

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...问题 8) 假设新类超级类实现可序列化接口, 如何避免新类序列化? 在 Java 序列化中一个棘手面试问题。

1.7K21

10个最难回答Java面试题

线程在监视器上等待,执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能指定,总是运行当前代码线程。...2) 枚举单例自行处理序列化 传统单例一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序编码,你可能会失败。...当你通过实现添加接口更改结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容可能性最小化, 但仍需要大量努力来确保向后兼容性。...关于 readObject() 方法, 需要注意一点很重要一点是, 它用于持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确类型。

78520

用 C++构建自己 GPT 文档工具

可能会得到这样结果: ➢ 当然可以,下面是 1 到 10 计数 C++ 代码: 没有任何源代码。 原因如下:发送给 API stop 参数让模型知道应该在输出哪个点上停止生成更多内容。...下面是我们所使用函数描述: OLEMethod():一个辅助函数,用于调用 IDispatch 接口方法,处理方法调用并返回指示错误 HRESULT 值。...你可以在我们源代码中看到这是如何实现,但一般来说,我们批注开始,转到相关文本,并检查批注是否得到了处理。...API 接口通用代码 为了通过网络与任何 API 接口,我们使用了通用代码来方便地发送请求并使用 JSON 数据格式解析响应。...在此过程中,我们使用了 libCurl,这是一个强大工具,广泛用于使用命令行或脚本在网络上传输数据

30320

在实施蓝绿部署后遇到问题和解决方法

数据源或 API 任何破坏性更改都意味着旧版本请求不能新版本处理,这就排除了蓝绿发布可能性。...这是最喜欢问面试问题之一,问一个如何在蓝绿环境中处理破坏性更改,以避免有人提出了一个很好解决方案,但它可能会涉及一些定制路由层来丰富或调整“旧”请求以适应“新”系统。...这意味着,除非我们首先从后端传播更改(这并不总是可行,特别是当蓝和绿共享同一个数据库时),否则我们将面临路由无法处理请求风险。...你对需求猜测很有可能是错误。 然而,你应该从一开始就让这些未来变更变得可行且容易。这意味着在构建整体应用程序设计时,你应该考虑如何数据库级别实现更改,以及如何API 中添加版本等。...如果架构中没有契合点,也没有比其他架构更容易大流量冲击点,并且如果组件只是彼此通信,而且部署在相同近似位置(例如,相同云或相同数据中心),那么你可能无法微服务架构中获得很大收益。

84840

来自前端同学对后端童鞋吐槽!@!#^$%

如果后端底层结构一旦发生更改接口很有可能也需要发生更改,前端调用代码也需要随之更改。...既然无论如何都要对接口判断两次,那为什么不将meta.code与 HTTP code 合二一?更何况还需要再本地维护一份自定义 code 枚举值,还需要和后端保证同步。...以请求失败错误信息例,错误信息只会出现在接口非正常返回情况下,但我们应该始终在返回体中用一个字段预留位置吗?...在概念之下如何实现我们拥有很多种选择。...如果是后端之间交互还可以利用 WebHook。通常对新技术持保留态度,但是不得不承认 GraphQL 在处理某些需求上也能够比 REST API更好。

42920

有理有据:一篇来自前端同学对后端接口吐槽!

如果后端底层结构一旦发生更改接口很有可能也需要发生更改,前端调用代码也需要随之更改。...既然无论如何都要对接口判断两次,那为什么不将meta.code与 HTTP code 合二一?更何况还需要再本地维护一份自定义 code 枚举值,还需要和后端保证同步。...以请求失败错误信息例,错误信息只会出现在接口非正常返回情况下,但我们应该始终在返回体中用一个字段预留位置吗?...在概念之下如何实现我们拥有很多种选择。...如果是后端之间交互还可以利用 WebHook。通常对新技术持保留态度,但是不得不承认 GraphQL 在处理某些需求上也能够比 REST API更好。

89320

EclipseBIRT:使用Design Engine API

此外,它还有一个用于按照国家来对项目进行分组表格组和一些列出了有界数据集属性列。 当表格中删除一列时,没有明确定义列宽度其他列,它们宽度重新计算结果并不令人满意。...您需要了解那些必须用于实现图表功能程序接口,并遵循izs创建图表严格规则。猜测结果看起来像rpt设计人员使用3选项卡作为图表设置。...使用DEAPI进行表格操作 在这种情况下,列宽度可以代码中看到固定像素值。宽度重新计算将在coldropedum之后执行。但是,我们要如何通过API删除一列表格呢?...当更改不那么复杂时,更喜欢使用脚本,比如设置报告参数或数据颜色。当一个场景如本文所述时,API解决方案是一个不错选择。...有了这个API,您可以通过Java访问rpt文件,这使得在运行时操作甚至创建这些文件提供了可能性

2.4K20

【总结】1773- 前端简洁架构

建议你领域开始,以便在你代码中准确地表达应用程序领域知识。 商店领域可能包括: 实体数据类型:用户、cookie、购物车和订单。 创建实体工厂,如果你用OOP编写,则是类。...用例通常以主题领域(subject area)方式描述。例如,"结账 "场景实际上由几个步骤组成: 购物车中检索商品并创建一个订单。 订单付款。 如果支付失败,通知用户。...我们可以轻松地与我们 API 进行通信,而不是直接与支付系统进行通信。顺便说一句,此更改只会影响此用例,其余代码将保持不变。 通知服务接口 如果出现问题,我们必须告诉用户。...取决于接口中描述行为,因此只要接口保持不变,我们并不关心哪个模块实现它以及如何实现。这使得模块可以更换。 深入细节:适配器层 我们已将用例“翻译” TypeScript代码。...如果只有假设,你可能会陷入分析麻痹。 具体解决方案取决于具体情况,只能提供一些建议。 不要使用继承,即使它被称为“扩展”。即使看起来确实是继承了接口

20230
领券