gpt4 book ai didi

java - 服务的访问控制(设计决策)

转载 作者:行者123 更新时间:2023-12-01 16:09:07 26 4
gpt4 key购买 nike

假设我们有一个接口(interface)“IA”,我们有一个实现“A”。在我们的应用程序域中,如果没有容器对象“X”,对象“A”永远不会存在。所以“A”永远不会被直接操作。 “A”聚合在“X”中。

我们不想将“A”暴露给外界。为此,我们采取的方法是不使用公共(public)接口(interface)“IA”,而是直接使用“X”内的实现“A”。不知怎的,我觉得这不是正确的方法。可能我缺少一些基本的面向对象概念。

请发表意见。

PS:不提供“IA”的原因是:人们可能会为 A 提出自己的随机实现并使用系统。

<小时/>

好的。让我把实际问题放在这里。我正在开发一个网络应用程序。我们有几个层——Dao、Doamin、Service、Web。服务层通过DAO为Domain对象提供各种服务。我们有域对象 - Wire 和 WireRequest。 WireRequest 可以有任意数量的Wire。对应这些领域对象,我们有两个服务——WireService和WireRequestService。WireService是使用spring注入(inject)到WireRequestService中。

当我们向客户端公开 service.jar 时,他们可能会独立使用 WireService 并创建没有 WireRequest 对象的 Wire 对象。我们想防止这种情况发生。基本上我们想要控制对某些服务的访问。 (我们可以通过授权 spring 方面来做到这一点,但想使用一些 OO 方式)

-奈恩

最佳答案

做最简单、可行的事情。

除非我遗漏了一些东西,否则隐藏聚合对象的实现细节或类的任何其他属性本质上并不是“非面向对象”的。

正如 Kenaniah 所说,将 A 类标记为“内部”(或您语言中的任何等效项),外部世界将看不到它。然后,您的类上的集合属性可以受到保护(或其他),并且它在该类之外将不可见。

某些语言,例如.NET,还提供“内部类”:

public class X
{
internal class A
{
}

protected IEnumerable<A> ACollection { get; set; }
}

在这里,A 在 X 之外根本不可见。

关于java - 服务的访问控制(设计决策),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1871845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com