- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道,我最近读了一篇文章,它谈到了使用单例模式的弊端,指出了全局变量出现的缺点,并且正确地指出单例违反了我们从 OOP 学校学到的许多规则,单一责任原则,编程到接口(interface)和抽象类而不是具体类......所有这些好东西。我想知道您如何使用类似的数据库连接类,您只需要一个到您的数据库的连接和一个 float 的数据库对象。作者谈到了依赖注入(inject)原则,在我看来,它与依赖倒置规则相得益彰。我如何知道和控制什么对象作为依赖项传递,而不是我创建了类并期望每个使用它的人都表现得很好并确保他们使用正确的资源这一事实?!
最佳答案
编辑:此答案假设您使用的是依赖项注入(inject)容器,可以是您自己编写的容器,也可以是您从库中获得的容器。如果没有,那么使用 DI 容器 :)
How do I know and control what object gets passed around as a dependency other than the fact that I created the class and expect everyone using it play nice and make sure they are using the right resource?!
根据契约(Contract)
口头契约 - 你写了一个设计规范,说“你不能直接实例化这个类”和“你不能传递你从依赖注入(inject)容器中得到的任何对象。如果必须的话传递容器”。
编译器契约——你给他们一个依赖注入(inject)容器,他们通过抽象接口(interface)从中获取实例。如果您只想使用一个实例,您可以为它们提供一个命名实例,它们会提取名称和接口(interface)。
ISomething instance = serviceLocator.ResolveInstance<ISomething>(
"TheInstanceImSupposedToUse");
您还可以将所有具体类设为私有(private)/内部/您拥有什么,并且只为它们提供一个抽象接口(interface)来进行操作。这将阻止他们自己实例化类。
// This can only be instantiated by you, but can be used by them via ISomething
private class ConcreteSomething : ISomething
{
// ...
}
通过代码审查
您制定了公平的团队范围内的编码和设计标准,并确保团队中的每个人都理解这些标准。
您使用源代码控制机制,并在他们 checkin 之前要求代码审查。您仔细阅读他们的代码,了解它们链接到什么、它们包含哪些 header 、它们实例化哪些对象以及它们传递哪些实例。
如果他们在代码审查期间违反了您的规则,在他们修复代码之前,您不会让他们签到。或者,对于屡犯者,你可以让他们付给你一美元,让他们给你买午餐,或者你雇佣一个不同的承包商来代替他们。任何在你的团队中运作良好的东西:)
关于oop - 面向对象编程原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605095/
GitOps描述了一种使用植根于 Git 版本控制系统的方法来操作和管理软件的方法。使用基于 GitOps 的工作流,通过要求将系统的特征定义为 Git 存储库中的文件,可以更轻松地开发、部署、维护和
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
命令行货币转换器应用程序,提示用户输入源货币、源货币代码和目标货币代码,例如 C:\workspace> java CurrencyConverter 100.50 EUR GBP 应用程序返回源金额
得到这个实体: /** * @ORM\Table(name="shop_payment_details") * @ORM\Entity(repositoryClass="Acme\ShopBund
我有一个原则实体,无需调用 persist 或 flush 即可持久保存到数据库中。 我在下面很简单地重现了这个问题。正如您将看到的,此脚本从名为 MyEntity 的数据库表中加载一行,并获取一个以
在我的编程实践中,我经常遇到客户端和服务器端脚本之间数据重复的问题。 在这种情况下,我们可以讨论客户端的 JavaScript 和服务器端的 PHP 或 C# (ASP.NET)。 比方说,我有一段
简介 我在写关于继承问题的硕士论文并解决了一些问题 表明存在继承问题的指标。 像下面的例子: 示例 public static String getAnimalNoise(Animal animal)
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
当我注意到this answer时,我一直在阅读里氏替换原理。 。它有一个 Circle 和一个 ColoredCircle 类型,其中 ColoredCircle 的构造函数需要一个额外的参数; 颜
这段代码是否违反了DRY原则? if (notAuthorized) { return sendErrorCode(new ForbiddenException()) } else if (n
我在查询中使用 Doctrine 2 的结果缓存来检索用户(消息传递应用程序)的新消息数量: $query->useResultCache(true, 500, 'messaging.nb_new_m
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
如何设置包含类名的变量,例如 android.util.Log 中的 TAG,同时尊重 Dont-Repeat-Yourself? 以下是一些可能性: 在 Google 代码中,它的常用用法如下 pu
我有以下查询: $roles = array(); $roles[] = 'ROLE_SUPER_ADMIN'; $roles[] = 'ROLE_ADMIN';
下面的代码违反了哪一条 SOLID 原则? public class A { void hello(){ //some code here } } public class B ext
我目前有一个 Message_Repository 类,它有如下方法: getLocationDetailsByID($messageId), getCustomerDetailsById($mess
我不知道它到底叫什么,但现在我将它称为“非空测试”。在 C# 8 中有一个新的行为允许测试一个对象是否不为空,例如: Foo foo = new Foo(); if(foo is { }) {
我正在学习 Doctrine。我在多对多关系中有两个实体 Article 和 Category,我正在尝试获取所有不是特定文章的类别。 文章实体: class Article extends Base
在阅读了一本书和一篇在线文章中有关 SOLID 代码的内容后,我想重构一个现有的类,使其与“SOLID”兼容。 但我想我迷路了,尤其是依赖注入(inject):当我想实例化类的一个对象时,我需要“注入
我的项目中有类似的东西,这个项目已经完成了(它正在运行)我只想知道 SOLID 原则是否可以接受 static public class Tools { static public GetPr
我是一名优秀的程序员,十分优秀!