首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要使用代理而不是直接调用RealSubject?

为什么我要使用代理而不是直接调用RealSubject?
EN

Software Engineering用户
提问于 2020-09-17 08:00:36
回答 1查看 156关注 0票数 1

我实际上正在阅读关于代理设计模式(https://refactoring.guru/design-patterns/proxy)的文章,我想知道是什么阻止了客户机直接调用RealSubject类。

我给你一个我在这个职位上找到的例子:

我不明白如何防止客户端犯直接调用RealSubject而不是代理对象的错误。

我想做的是让客户端调用代理对象,这样代理对象就可以过滤访问和日志访问等等。

我甚至购买了这本书并阅读了有关代理的部分,并查看了给出的代码示例:

代码语言:javascript
复制
...
Proxy design pattern code
...
echo "Client: Executing the client code with a real subject:\n";
$realSubject = new RealSubject();
clientCode($realSubject);

echo "\n";

echo "Client: Executing the same client code with a proxy:\n";
$proxy = new Proxy($realSubject);
clientCode($proxy);

因此,在这里的代码片段中,它可以在不使用代理的情况下直接调用realSubject。

所以,也许我没有看到好的设计模式,也许有一种模式适合我的要求,即强制客户端调用‘代理’,而不允许调用RealSubject?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2020-09-17 08:31:29

我想知道是什么阻止了客户机直接调用RealSubject类。

一般来说,没有什么能阻止这一点。这并不意味着您没有可以用来防止这种情况的机制,但一般来说,它们本身并不是一个“设计模式”;设计模式并不是所有优秀的软件工程的全部。

有些方法可以防止(或至少减少)直接调用RealSubject

  1. 代码评审。如果您看到除了代理调用RealSubject以外的其他任何内容,则拒绝该代码。
  2. 范围RealSubject,因此它在客户端代码中不可见(在您的语言中可能是可能的,也可能是不可能的)。
  3. 在创建DI容器时,请确保代理已经注册,而RealSubject没有注册--这使得任何人都很难意外地调用RealSubject
  4. 静态代码分析在您的CI系统,错误的任何直接调用的RealSubject

还有更多的,哪些适合你的环境是你必须解决的事情。就我个人而言,我从来没有发现任何其他的教学/提醒开发人员和代码审查的需要。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/415972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档