问题标签 [abstraction-layer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
16253 浏览

java - 我应该将实体转换为 Repository 对象内的 DTO 并将其返回给服务层吗?

我试图在这里得到两个非常相似的问题的答案:

我应该将实体转换为存储库对象中的 DTO 并将其返回给服务层吗?

或者

从存储库层返回 DTO 对象可以吗?

现在我被困在我的 Servlet(服务层)中,例如试图Restaurant从以下位置检索所有对象RestaurantOwnerRepository

Restaurant带注释的类在哪里@Entity-这似乎是我不应该做的第一件事,因为服务层现在确实知道一个非常低级的对象,恕我直言,这违反了在每一层中抽象我的数据的尝试。

如果我将 each 转换Restaurant为 a RestaurantDTO- 但我应该这样做吗?

基本上改变:

ConvertEntity每个实体都有一个实用程序,例如:

但这对我来说并不是最好的解决方案。我能在这里做什么?


值得一提的一件重要事情是,它来自一个 GWT 项目。这意味着我RestaurantDTO在服务器和客户端使用例如,因为它包含在共享项目中。

0 投票
1 回答
242 浏览

java - 我应该在客户端抽象服务层吗?如果是,如何?

问题是我在服务器端使用 Hibernate,并且我基本上将“原始”数据库数据发送到客户端 - 我猜这很好,但这也意味着我的客户端List<UpcomingEventDTO>在调用相应的服务时得到一个列出from一个指定的日期to另一个。

如果我现在想将这些事件拆分为一个映射,其中键映射到一天的事件列表,例如 aMap<Integer, List<UpcomingEventDTO>>那么我将不得不在客户端执行此操作。如果我不必在我的 Presenter 中这样做,这不会打扰我。

一方面,我的演示者正在加载:

以及在我展示之前数据的转换:

所以我的问题基本上是我对在我的演示者中有这样的代码并不满意,但另一方面,我不知道如何以及在哪里为我的演示者提供这种“升级”表单中的数据。

有人可能会争辩说,我也可以只从服务器返回数据,以一种我在服务器上需要它的方式,但那样我会失去一般性,我不想为所有视图和演示者编写他们“自己的”API到数据库。

另一种可能性是,例如在服务/servlet 层之间引入另一个层,并在我的演示者模型之前具有类似 DAO 或数据库层的东西。但这也会对我提出很多问题。例如,这样一个层的名称是什么^^,该层是否会为演示者提供“自定义”数据,或者数据是否仍然是通用的?

我在弄清楚在这里做什么时遇到了很大的问题,所以我希望我能从别人的经验中受益。

非常感谢这里的任何帮助!

0 投票
2 回答
236 浏览

mysql - 是否有任何抽象层使数据库看起来像 Oracle?

我们在生产中使用 Oracle,但在我们公司,很难在开发环境中安装。

有没有办法让 Perl(或任何其他语言)通过 DBI 模块(或任何其他语言向数据库发送 SQL 命令的等效模块)发送原始 SQL 语句,这些语句从 Oracle SQL 转换为 MySQL 或 SQLite 或其他东西别的?

所以应用程序会认为它正在与 Oracle 通信,但实际上是在与一个不同的、更易于安装的开源/免费数据库通信。

0 投票
2 回答
324 浏览

c++ - 嵌入式目标上的 C++:低开销存储后端

我正在为 ARM Cortex-M4 处理器编写可重用的 C++ 模块。该模块使用大量存储空间来完成其任务,而且时间紧迫

为了允许我的模块的用户自定义其行为,我使用不同的后端类来允许不同的低级任务实现。其中一个后端是存储后端,它旨在将实际数据存储在不同类型的易失性/非易失性 RAM 中。它主要由执行速度非常快并且会被非常频繁地调用的 set/get 函数组成。它们大多是这种形式:

基础表和数组的大小和数据类型取决于用户定义的功能,因此我无法避免使用存储后端。一个主要问题是需要将实际数据放入 RAM 地址空间的某个部分(例如,用于使用外部 RAM),我不想将我的模块限制为特定的存储选项。

现在我想知道选择什么设计模式来将存储方面与我的主模块分开。

  1. 具有虚函数的类将是一个简单而强大的选择。但是,我担心在时间紧迫的环境中经常调用虚拟 set/get 函数的成本。特别是对于存储后端,这可能是一个严重的问题。
  2. 为模块主类提供不同后端的模板参数(甚至可能使用 CRTP 模式?)。这将避免虚函数,甚至允许内联存储后端的设置/获取函数。但是,它需要在头文件中实现整个主类,这不是特别整洁......
  3. 使用简单的 C 风格函数来形成存储后端。
  4. 对简单的 set/get 函数使用宏(编译后这应该与选项 2 大致相同,所有 set/get 函数都内联。)
  5. 自己定义存储数据结构并允许使用宏作为数据类型进行自定义。例如RAM_UINT8 table[ROWSIZE][COLSIZE],用户添加#define RAM_UINT8 __attribute__ ((section ("EXTRAM"))) uint8_t这样做的缺点是它需要所有数据都位于 RAM 的相同、连续的部分中——这在嵌入式目标上并不总是可能的。

我想知道是否还有更多选择?现在,我倾向于选项 4,因为它足够整洁,但对实际运行时性能的影响为零。

总结一下:在 Cortex-M4 上实现低/零开销存储抽象层的最佳方式是什么?

0 投票
0 回答
20 浏览

manpage - 区分通用手册页和特定于实现的手册页?

我编写了一套程序,应该可以在 MacOS X 和 GNU/Linux 上运行。对于大多数组件,MacOS X 和 GNU/Linux 的代码是相同的 - 但是有一些低级命令(基于自动检测)安装程序将安装特定于您的操作系统的工具的实现- (正如我所说)暂时是 MacOS X 或 GNU/Linux。

问题是 - 对于这些针对不同系统具有不同实现的低级命令,每个命令都需要安装两个手册页 - 一个描述命令的用法和行为,与您使用的系统/实现无关 -另一个仅记录特定系统执行命令的细节。

所以我的问题是—— man命令是否提供了一种区分两个这样的手册页的方法?如果是这样,那是什么?

当您通过命令自己的--help选项访问手册页时,我已经有了一个解决方案(基本上,通用手册页是您在使用--help选项本身调用命令时看到的- 但通用的手册页包括关于哪个选项将显示特定于实现的手册页的说明),但我现在要开始编写程序安装程序的功能,以便在实际可以安装手册页的位置通过man命令访问,因此,在涉及这些低级命令的地方,我需要知道是否有一种方法可以区分同一命令的这两个不同的手册页。

0 投票
1 回答
3135 浏览

java - 抽象层 (Java)

我目前正在从事一个涉及创建抽象层的项目。该项目的目标是支持服务器软件的多种实现,以防我可能需要切换到它。要抽象的功能列表相当长,所以我想研究一种相当轻松的方法来做到这一点。

其他应用程序将能够与我的项目进行交互并进行调用,最终归结为传递给我正在使用的服务器。

问题就在这里。我在这方面没有太多经验,我真的不知道如何使它不成为死亡三明治。这是一个大致应该是什么样子的链条(以及我想要完成的事情)。

抽象层(显然是最中间的那个)是我努力拼凑的。

现在,我只停留在一个愚蠢的方面。我怎么可能使抽象层不是一系列

(原谅伪代码;另外,想象一下相同的情况,但对于一个开关/案例,因为这可能比每个方法的 if 链更好)每个抽象级类中的每个方法。

这似乎非常基本,但我无法想出一个合乎逻辑的解决方案来解决这个问题。如果我没有清楚地解释我的观点,请解释我需要详细说明的内容。也许我在想这整件事是错的?

0 投票
2 回答
1274 浏览

repository-pattern - 请解释存储库、映射和业务层的关系和职责

我已经阅读了很多关于这些东西的内容,目前我正在开发一个更大的 Web 应用程序及其相应的后端。

但是,我从一个设计开始,我要求存储库从数据库中获取数据并将其映射到 DTO。为什么选择 DTO?仅仅是因为直到现在基本上一切都是简单的东西,没有更多的复杂性是必要的。如果它变得更复杂一点,那么我开始直接在服务层中映射例如 1 对 n 关系。就像是:

这当然可行,但事实证明,有时事情会变得比这更复杂,我开始意识到如果我对此不做任何事情,代码可能看起来很丑陋。

当然我可以wheelMap在. CarRepository_cars wheelsgetCars(Long ownerId)

我显然缺少业务层,对吧?但我根本无法理解它的最佳实践。

假设我有Car一个Owner业务对象。我的代码会是这样的吗:

这看起来很简单,但内部会发生什么?问题特别针对CarOwner#getAllCars().

我想这个函数将使用 Mappers 和 Repositories 来加载数据,并且特别是关系映射部分得到处理:

但是怎么做?是CarMapper提供功能getAllCarsWithWheels()getAllCarsWithoutWheels()?这也会将CarRepositoryWheelRepository移入CarMapper,但这是存储库的正确位置吗?

如果有人可以向我展示上面代码的一个很好的实际示例,我会很高兴。


附加信息

我没有使用 ORM——而是使用 jOOQ。它本质上只是一种编写 SQL 的类型安全的方式(顺便说一句,使用它很有趣)。

这是一个示例:

0 投票
0 回答
100 浏览

c++ - 在(高级)应用程序中使用来自硬件抽象层的低级数据类型

我有一个用 C 编写的 MCU 外围设备的硬件抽象层。应用程序代码通过 C++ 包装器使用外围设备。现在我有一个低级枚举ll_enum和一个函数,它需要一个具有这种数据类型的参数。

我对一个好的架构的理解意味着以下几点:

  • 低级外设驱动程序 (C)
    • 不应该知道还有更高的层次
    • 有枚举的定义
  • C++ 包装器
    • 明明知道底层并且有应用
  • 使用 C++ Wrapper 的应用程序代码
    • 只知道 C++ Wrapper

我现在的解决方案:

我在 C++ Wrapper 中有一个枚举,它与低级枚举具有相同的条目。枚举被强制转换为 C++ Wrapper 中的低级类型。

显然这是一个糟糕的解决方案,因为你必须在两个位置更改代码,如果你错过了就会遇到麻烦。

有更好的解决方案吗?

0 投票
1 回答
215 浏览

c++ - API 抽象层 - 避免 API 接口的混合

我一直在计划为我的渲染引擎编写一个 API 抽象层。我想要包含的两个 API 是 D3D11 和 D3D12。因此,我首先为每个 API 编写了一些接口及其各自的实现。

以下代码片段对此进行了举例说明:

到目前为止,一切都很好。现在到实际问题:如果我有另一个接口,其中的方法需要一个IDevice*as 参数,我如何确保传递“正确”的设备?

我知道我可以每次都调用指针并进行检查,dynamic_cast但这在性能方面既乏味又昂贵。IDevice*nullptr

这个问题有一些优雅的解决方案吗?你们中有人知道专业/商业游戏引擎是如何应对的吗?

0 投票
2 回答
6252 浏览

spring - 存储库与 DAO(再次)

一般来说,这个背景故事并不重要,只是为了解释下面的代码:

服务器处理用户和用户组。用户组能够“发现”地点——此时这些地点完全来自 Google Places API。


当前实施


目前,我的服务层中有很多JpaRepository对象,我称之为Repository 。我强调“存储库”,因为在下面我提出的解决方案中,它们将被降级为 DAO。

但是,我在当前代码中不喜欢的地方,也是我在这里提出问题的原因,是可以在UserGroupService.


一个不起作用的解决方案


什么可以使这段代码更简单,并有可能解决这个混乱,那就是@Inheritance

但是,这不是一个选项,因为那样我就不能拥有一个PlaceRepository只保存一个位置的Hibernate 似乎不喜欢它。.


我的提议


我认为我的困惑始于 Spring 使用的名称。例如JpaRepository- 我不太确定这是否真的是“正确”的名字。因为据我了解,这些对象实际上就像数据访问对象 (DAO) 一样工作。我认为它实际上应该看起来像这样:


概括


我想知道我没有看到什么。我是在与框架作斗争,还是我的数据模型没有意义,这就是我发现自己为此苦苦挣扎的原因?或者我仍然对如何使用“存储库”和“DAO”这两种模式有疑问?

将如何实现这一点?