首页 > 其他分享 >反模式 DI anti-patterns

反模式 DI anti-patterns

时间:2024-05-25 23:11:35浏览次数:16  
标签:repository DI 代码 模式 patterns anti new SqlProductRepository public

反模式 DI anti-patterns

反模式DI anti-patterns

一、一、反模式 DI anti-patterns

1. 控制狂 Control freak

在程序设计中,"Control freak"(控制狂)通常指的是一种反模式,即过度控制和过度管理代码的设计和执行流程。这种情况下,程序员试图通过过度的控制和指令来达到对代码的绝对控制,而忽视了灵活性、可扩展性和可维护性。

控制狂在程序设计中可能表现为以下行为:

  1. 过度复杂的控制逻辑:设计过于复杂的控制逻辑,使得代码难以理解和维护。

  2. 过度使用全局状态:滥用全局变量或全局状态,使得代码之间的依赖关系变得混乱和难以追踪。

  3. 过度依赖条件语句:过多地使用条件语句(如if-else语句),导致代码逻辑分散、冗长和难以扩展。

  4. 过度使用硬编码:将具体数值、路径或配置直接硬编码到代码中,而不是使用配置文件或参数来实现灵活性。

这些行为会导致代码的可读性、可维护性和可扩展性下降,增加了代码的复杂性和脆弱性。相反,良好的程序设计应该追求简洁、模块化和松耦合的原则,以实现可维护、可扩展和易于理解的代码。

1-1. 示例:

  1. ... 
  2. private readonly IProductRepository _productRepository; 
  3.  
  4. public ProductService() 

  5. //反模式范例,直接new一个SqlProductRepository,导致紧耦合 
  6. _productRepository = new SqlProductRepository(); 

  7. ... 

1-2. 工厂模式下的反模式

实体工厂可以解决一些复杂物件建立逻辑封装在工厂中,可以避免写重复的代码。 但是在DI架构下,工厂模式没有带来益处。

  1. public class ProductRepositoryFactory 

  2. public static IProductRepository CreateProductRepository() 

  3. //工厂模式反模式范例,程序变复杂,只是控制狂换了个位置 
  4. return new SqlProductRepository(); 


即便将上述代码改为读取外部配置的静态工厂,仍然是对问题换了个地方。ProductServiece依赖ProductRepositoryFactoryProductRepositoryFactory又依赖于SqlProductRepositoryAzureProductRepository,因此依赖传递导致ProductServiece对后两者的依赖。

  1. public static IProductRepository Create() 

  2. IConfigurationRoot configuration = new ConfigurationBuilder() 
  3. .SetBasePath(Directory.GetCurrentDirectory()) 
  4. .AddJsonFile("appsettings.json") 
  5. .Build(); 
  6. string repositoryType = configuration["productRepository"]; 
  7. switch (repositoryType) 

  8. case "sql": return new SqlProductRepository(); 
  9. case "azure": return AzureProductRepository(); 
  10. default: throw new InvalidOperationException("..."); 


IProductRepository
IProductRepository

1-3. 构造重载时的控制狂

下面案例中无参构造将SqlProductRepository作为外部预设,造成业务层对SQL数据层的依赖耦合

  1. private readonly IProductRepository repository; 
  2. public ProductService()  
  3. : this(new SqlProductRepository())  
  4. {  
  5. }  
  6. public ProductService(IProductRepository repository)  
  7. {  
  8. if (repository == null)  
  9. throw new ArgumentNullException("repository");  
  10.  
  11. this.repository = repository;  

标签:repository,DI,代码,模式,patterns,anti,new,SqlProductRepository,public
From: https://www.cnblogs.com/Firepad-magic/p/18213144

相关文章

  • 赛克oj The diameter of a rectangle(笛卡尔树)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)这题是hduoj1506的加强版,区别在于宽度不是固定为1了,思路差不多,也是使用笛卡尔树。参考hduoj1506(笛卡尔树)-Venux-博客园(cnblogs.com)1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebu......
  • 创建3D 视频:CreateStudio 3.X Crack
    轻松创建皮克斯风格的3D视频像皮克斯一样构建您自己的3D角色,只需点击一下即可制作动画并制作令人惊叹的视频。 (不需要技术或设计技能)。......
  • 学习redis问题记录
    2024年5月25日倒腾了很长时间突然发现的问题ide提示改为toList()我顺便就改过去了但是实际业务中redis序列化会产生无法反序列化的问题造成缓存挂壁业务直接Gcollect(Collectors.toList())不能缩写为.toList()序列化会炸问题解析:这个问题其实跟代码本身没有直接......
  • 论文笔记:Inf-DiT: Upsampling Any-Resolution Image with Memory-Efficient Diffusion
    论文链接:[2405.04312]Inf-DiT:UpsamplingAny-ResolutionImagewithMemory-EfficientDiffusionTransformer(arxiv.org)论文代码:THUDM/Inf-DiT:OfficialimplementationofInf-DiT:UpsamplingAny-ResolutionImagewithMemory-EfficientDiffusionTransformer(gi......
  • Gradio存在任意文件读取漏洞(CVE-2024-1561)
    漏洞描述该漏洞是Gradio应用中的一个高危漏洞,其出现在'component_server'端点,允许攻击者调用'Component'类的任意方法,并利用'Block'类的'move_resource_to_block_cache()'方法在文件系统上复制任意文件到临时目录,随后可将其检索。这是的攻击者能够在未经授权的情况下读取本地文件......
  • springboot3.0+shardingsphere5.2 最简单的分库分表
    先看表结构两个数据库test1,test2每个库有4张sys_user表分别命名sys_user_0-4maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>......
  • Android Studio下载Gradle超时
    在AndroidStudio打开项目时,出现了下载Gradle超时,导致项目无法运行.首先在gradle-wrapper.properties文件中,查看Gradle版本和zipStorePath:然后查看Gradle包存放的位置:到https://mirrors.cloud.tencent.com/gradle/下载相应的Gradle包:下载路径是Gradle包存放的位置和z......
  • Redis基本数据结构
    String数据结构如果存储的是整型,直接把值存储在RedisObject里面,数据类型为int。如果存储的数据量不大(早期版本,32字节),采用动态字符串SDS存储,存储类型是embstr。超过32字节,采用动态字符串SDS进行存储,存储类型是raw。embstr和raw类型的区别在于,RedisObject和embstr是连续存......
  • 企业生产环境中的麒麟V10(ARM架构)操作系统部署jdk和redis三主三从交叉版集群
    前言:麒麟ARM操作系统是国企和政务机关推行信创化选择率比较高的一款操作系统,然而ARM操作系统非主流的X86系统,除了命令一样,在架构方面差别极大,初次接触多多少少会踩坑,下面我将在公司中部署的实例列举出来,供大家参考,ip和设计机密信息不方便展示,统用虚拟信息代替。经过多次验证,用了......
  • 基于Android Studio图书管理,图书借阅系统
    目录项目介绍图片展示运行环境获取方式项目介绍用户书架:搜索书籍,查看书籍,借阅书籍,收藏书籍,借阅书籍必须在一个月之内还书;我的:可以修改密码,退出登录,查看收藏,查看借书记录管理员书架:搜索书籍,查看书籍,借阅书籍,收藏书籍,借阅书籍必须在一个月之内还书;我的:可以修改密码......