讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬磊同学_8011

冬磊同学_8011

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

|

849人浏览过

|

来源于dev.to

转载

(d): aplicando o \

概念

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

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

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

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

dip 解决的问题

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

实际应用

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

TypeScript
TypeScript

{"answer":"编写类型安全的 TypeScript,合理运用类型收窄、推断模式与严格模式最佳实践。"}

下载

爪哇

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工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

252

2026.02.13

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

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

460

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

311

2026.03.13

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

226

2026.06.03

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

478

2026.06.16

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

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

5195

2025.09.05

java面向对象
java面向对象

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

302

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

304

2026.04.09

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

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

共21课时 | 1.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn