0

0

(D): Aplicando o "Princípio da Inversão de Dependências" com Typescript e Java

霞舞

霞舞

发布时间:2024-11-26 08:06:00

|

829人浏览过

|

来源于dev.to

转载

(d): aplicando o \

概念

solid 是一个缩写词,代表面向对象编程的五个基本原则,由 robert c. martin(鲍勃大叔)提出。在这里您可以阅读有关他的文章的更多信息。
这些原则旨在改进代码的结构和维护,使其更加灵活、可扩展且更易于理解。这些原则可以帮助程序员创建更有组织的代码、划分职责、减少依赖、简化重构过程并促进代码重用。

缩写中的“d”代表“依赖倒置原则”。 bob叔叔用来定义这个原则的一句话是:

“高层模块不应该依赖于低层模块。两者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象”

依赖倒置原则旨在减少系统组件之间的耦合,提高灵活性、可维护性和可测试性。

dip 解决的问题

  • 紧密耦合:当一个模块直接依赖于具体实现时,对该实现的更改可能会影响其他模块。
  • 测试难度:测试直接耦合到特定实现的代码单元更加复杂,因为它需要使用这些具体实现,因此很难创建模拟或存根。
  • 可重用性低:与具体细节高度耦合的模块在其他上下文中的可重用性较低。

实际应用

我们将创建一个代码负责通过电子邮件发送通知,以分析问题和可能的解决方案

遨虾
遨虾

1688推出的跨境电商AI智能体

下载

爪哇

class emailservice {
    public void sendemail(string message) {
        system.out.println("sending email: " + message);
    }
}

class notification {
    private emailservice emailservice;

    public notification() {
        this.emailservice = new emailservice();
    }

    public void notify(string message) {
        this.emailservice.sendemail(message);
    }
}

// uso
public class main {
    public static void main(string[] args) {
        notification notification = new notification();
        notification.notify("welcome to our service!");
    }
}

打字稿

class emailservice {
    sendemail(message: string): void {
        console.log(`sending email: ${message}`);
    }
}

class notification {
    private emailservice: emailservice;

    constructor() {
        this.emailservice = new emailservice();
    }

    notify(message: string): void {
        this.emailservice.sendemail(message);
    }
}

// uso
const notification = new notification();
notification.notify("welcome to our service!");

问题:

  • notification 类直接依赖于具体实现(emailservice)。
  • 如果我们想更改通知渠道(例如:短信),我们需要更改通知代码。

解决方案和优点:

  • 通知不需要知道消息如何发送的详细信息。
  • 易于更换或添加新的沟通渠道。
  • 我们可以单独测试通知,而不需要依赖实际的实现。

爪哇

public interface messageservice {
    void sendmessage(string message);
}

public class emailservice implements messageservice {
    @override
    public void sendmessage(string message) {
        system.out.println("sending email: " + message);
    }
}

public class smsservice implements messageservice {
    @override
    public void sendmessage(string message) {
        system.out.println("sending sms: " + message);
    }
}

public class notification {
    private final messageservice messageservice;

    public notification(messageservice messageservice) {
        this.messageservice = messageservice;
    }

    public void notify(string message) {
        messageservice.sendmessage(message);
    }
}

// uso
public class main {
    public static void main(string[] args) {
        notification emailnotification = new notification(new emailservice());
        emailnotification.notify("welcome via email!");

        notification smsnotification = new notification(new smsservice());
        smsnotification.notify("welcome via sms!");
    }
}

打字稿

interface messageservice {
    sendmessage(message: string): void;
}

class emailservice implements messageservice {
    sendmessage(message: string): void {
        console.log(`sending email: ${message}`);
    }
}

class smsservice implements messageservice {
    sendmessage(message: string): void {
        console.log(`sending sms: ${message}`);
    }
}

class notification {
    private messageservice: messageservice;

    constructor(messageservice: messageservice) {
        this.messageservice = messageservice;
    }

    notify(message: string): void {
        this.messageservice.sendmessage(message);
    }
}

// uso
const emailnotification = new notification(new emailservice());
emailnotification.notify("welcome via email!");

const smsnotification = new notification(new smsservice());
smsnotification.notify("welcome via sms!");

3. 单元测试

爪哇

public class mockmessageservice implements messageservice {
    @override
    public void sendmessage(string message) {
        system.out.println("mock message sent: " + message);
    }
}

// teste com o mock
public class main {
    public static void main(string[] args) {
        messageservice mockmessageservice = new mockmessageservice();
        notification mocknotification = new notification(mockmessageservice);
        mocknotification.notify("test message");
    }
}

打字稿

class MockMessageService implements MessageService {
    sendMessage(message: string): void {
        console.log(`Mock message sent: ${message}`);
    }
}

// Teste com o mock
const mockNotification = new Notification(new MockMessageService());
mockNotification.notify("Test message");

结论

依赖倒置原则(dip)是灵活而健壮的项目的基本支柱。它允许您减少类之间的耦合,促进代码重用并提高应用程序的可测试性。通过依赖抽象,您的系统变得更能适应变化并可通过新功能进行扩展。实际示例展示了小的设计调整如何解决经常出现的维护问题。将 dip 与其他 solid 原则结合应用可确保更清晰的代码,为增长做好准备。采用这些概念对于寻求卓越软件架构的开发人员至关重要。

立即学习Java免费学习笔记(深入)”;

参考书目

  • martin,robert c. 敏捷软件开发、原则、模式和实践。普伦蒂斯·霍尔,2002 年。
  • 蒂亚戈·莱特和卡瓦略。 面向对象。 casa do code,2014。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

42

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

91

2026.02.25

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

57

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

61

2025.11.27

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

22

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

15

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

23

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

16

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

17

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
TypeScript 教程
TypeScript 教程

共19课时 | 3.2万人学习

TypeScript——十天技能课堂
TypeScript——十天技能课堂

共21课时 | 1.2万人学习

TypeScript-45分钟入门
TypeScript-45分钟入门

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号