首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用一个主类可以在我的组件中包含我需要的所有类。这是不是很糟糕?

是的,使用一个主类包含所有需要的类是一个糟糕的设计。这种设计违反了单一职责原则和开闭原则,导致代码的可维护性和可扩展性变差。

单一职责原则要求一个类只负责一个功能或职责,而不是承担过多的责任。如果一个主类包含了所有需要的类,那么它的职责就会非常庞大,难以理解和维护。

开闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。如果使用一个主类包含所有需要的类,那么每次需要添加或修改功能时,都需要修改主类,这违反了开闭原则。

相反,更好的设计是使用模块化和面向对象的思想,将不同的功能和职责分解到不同的类中。每个类只负责一个特定的功能,通过类之间的组合和协作来实现复杂的功能。这样可以提高代码的可读性、可维护性和可扩展性。

对于组件化开发,可以使用依赖注入等技术来管理组件之间的依赖关系,避免一个主类包含所有需要的类。这样可以更好地解耦组件,提高代码的可测试性和可复用性。

总结起来,使用一个主类包含所有需要的类是一个糟糕的设计,应该采用模块化和面向对象的设计思想,将不同的功能和职责分解到不同的类中,提高代码的可维护性和可扩展性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

编写模块化CSS——BEM

不是应该把所有的都用一遍,是不是只有一种方法才适合,或者不是应该参考它们做一个自己架构?。 开始只用一种方法。...必须 立即知道一个组件是否使用了 JavaScript,所以如果改变了它 CSS,不会意外地破坏任何组件探索发现 BEM 和 命名空间 符合寻找标准。...BEM 使用 .form 而不是 元素原因是因为 允许无限可重用性,而即使是最基本元素也可能改变样式。 按钮很好地阐释了可以包含不同样式块。...如果设置了一个 .button 按钮,则可以在任何 元素上选择是否使用 .button 。...但是有两种方法可以编写简洁 CSS,而不需要额外 class! 方法 1:使用 mixin 第一种方式,如果使用 Sass 或任何其他预处理器,则 使用mixin来封装 需要重用 所有代码。

2.1K70

测试策略说了算

每次添加新功能时,都会感谢已经编写好测试,特别是包含了众多功能大型服务无法想象手动去验证每一个功能点意味着什么,那可能是个无稽之谈。...一个使用 Spring 实现后端应用程序,通常会看到生产和测试之间一对一映射,如图所示: “包含主要逻辑”通常被叫作“服务”。...由于不需要模拟内部类,因此减少了工作量。 我们不需要模拟很多,而是模拟模块和框架组件,因此测试时不需要启动应用程序。 缺点: 需要更多思考。进行有意义命名和分组是复杂。...分离领域和框架逻辑一种扩展做法是将每个功能领域逻辑放在一起,以实现内聚性。与每个功能相关所有逻辑都在同一个模块实现,而不是分散多个模块。...已经经历了一场噩梦,从一个单体代码库找出所有需要修改地方。我们密集调试了几个月,而主要改动两天内就完成了。

15220

Web前端进阶之路: 提升代码质量篇

高质量代码重要性 高质量代码体现在两个方面: 易于维护。 Bug少。 当需求发生变化,或出Bug需要改时,易于维护代码改起来更容易,更快。改那些糟糕代码,费时费力不说,心情也变得糟糕。...2 语义化CSS名 根据模块功能来命名,而不是根据样式来命名。如:给红色提示文字起名。可以叫 tip,不应该叫 color-red。...除此之外,JavaScript 标准代码风格没有涉及规则,但我觉得要验证可以用 ESLint 来补充验证。觉得需要遵守规则,见这里。...指通过命名规则之类约束来减少程序配置,旨在减少软件开发人员需要做决定数量,获得简单好处,而又不失灵活性。 写组件时,对属性设计,可以用约定优于配置做法。...代码评审可以一个人 Review 其他人代码,也可以是一群人一起 Review 代码。 代码评审好处: 项目的早期发现缺陷,将损失降至最低。

1.6K20

React Hooks 还不如

一个 hooked 函数并不是一个常规函数,因为它具有状态,有一个看上去奇怪 this(也就是 useRef),并且可以具有多个实例。...到目前为止,这里说区别还是清楚——如果需要状态或生命周期方法,则使用,否则,使用函数或都行。...就个人而言,喜欢这样想法:当我偶然碰到一个函数组件时,可以立即知道这是一个没有状态“哑组件”。然而引入 Funclass 之后,就再也没这么简单明了了。 2....很难组件之间重用有状态逻辑 React 没有提供一种将可重用行为“附加”到组件方法(例如,将其连接到一个存储)……React 需要更好原语来共享状态逻辑。 讽刺不是吗?...[……]hooks 使你可以根据各个部分相关性(例如设置订阅或获取数据)来将一个组件拆分为一些较小函数,而不是根据生命周期方法强行拆分。 如果你使用存储,那么上面这段话基本没意义。

82210

Flash WebGame 开发经验心得和PureMVC框架细说

你现在是不是点晕了,这是正常,其实也有点晕!当你代码写到一定规模后,你会更晕。...2,UIFLA层 次结构是这样:第一层是文档或者与UI关联某个MC,我们选用是MC方式,因为MC方式更灵活;第二层是这个MC里所有组件,这些组件 大部分是根据功能划分在一起一组元件...对应FLA层次结构,AS结构如 下:文档或者MC关联是第一层,这个里持有所有的界面元件引用;第二层是这些界面元件对应组件CLASS,组件功能都是在这里实现,比 如个人面板MC将会对应一个...正是MC对应UI,比如当获得MyPanel对应MC后,就会立刻public var myPanel:MyPanel = new MyPanel(myPanel_mc);当所有组件注册完成后...,这个UI就持有了所有组件引用,可以方便主程序调用;代码第三层其实就是共用 组件,比较特殊是,共用组件,比如滚动条,也是用代理模式写

58920

每个程序员要注意 9 种反模式

如何避免 把整洁、可读性强、能运行代码放在首位,使用已知和测试过算法和工具。当需要找到瓶颈和决定优化优先级时,使用分析工具。依赖于测量而不是臆想和推断。 例子和标志 找瓶颈之前做缓存。...花大量时间来辩论和决定琐碎、太主观问题这种趋势。 糟糕原因 这是浪费时间。Poul-Henning Kamp 在这封邮件里进行了深入讨论。...如何避免 注意,什么时候可以简化设计新增,以及解耦代码不必要耦合部分 棘手部分 新增不是魔法弹。通过分解大型来简化设计需要深入考虑分析责任和需求。...使用未命名数字或字符串字面量,而不是代码里命名为常量。 糟糕原因 主要问题是由于没给数字或字符串字面量一个描述命名或其他形式注解,而导致它们语义被部分或完全隐藏了。...糟糕原因 数字很棒。避免本文提及两个反模式(提前优化和单车车库)策略是分析或做A/B测试,来帮助你根据数字优化或做决策,而不是光靠凭空想。然而,盲目的信任数字也危险。

1.8K20

随心自然地整理Python代码

精心设计函数可以节省空间并且用作句子、组件或逻辑单元,精心设计可以极大地扩展项目里词汇量,这两者结合可以让你用段落来表述,而不是胡乱地叫喊命令。...⚠️ 在下一个示例使用称为pyttsx3文字转语音库。...最后是执行,这与前一级结构非常相似: 1_VVhWGKQcbSkLyuvIcw6uJw.png 在这种模式,有几点值得注意:如果你使用作为对象,则需要持有一个全局引用,以便在函数和函数与它们进行交互...虽然这次节省下来重读代码时间遗憾地花在了第一次整理代码上,但是如果你想让更多的人参与到你代码来,这是至关重要。...视情况而定,在工作通常会使用Template/Boilerplate;对于我自己项目,通常从单个文件上和函数开始,随着项目的进展,通常开始制作单个文件结构,如果项目扩大,它最终会变成一个文件层次结构

95195

【译】编写高质量JavaScript模块4个最佳实践

`; } } 随着时间推移,注意到了重构默认导出(或函数)困难。重命名原始时,使用者模块名没有改变。 更糟糕是,编辑器没有提供有关要导入自动完成建议。...`; } } 使用命名导出,编辑器可以更好地进行重命名:每次更改原始名时,所有使用者模块也会更改名。 自动完成功能还会建议导入: ?...4.避免较长相对路径 发现很难理解一个模块路径包含一个,甚至更多父文件夹: import { compareDates } from '../.....5.结论 JavaScript模块非常适合将您应用程序逻辑拆分为多个独立小块。 通过使用命名导出而不是默认导出,可以导入命名组件时更轻松地重命名重构和编辑器自动完成帮助。...一个组件应该有多少个函数或,这些组件应该如何与每个组件相关联?支持高内聚模块:它组件应该紧密相关并执行一个共同任务。 包含许多父文件夹../长相对路径很难理解。将它们重构为绝对路径。

94120

下一代音视频SDK方案设计

我们需要处理一些绕不开困难。 2. 一座塔故事 一个比较喜欢讲故事的人,将从一座塔故事开始分享一些感受。 2.1 《圣经》巴比伦塔 《圣经·旧约》中讲的是犹太教故事。...软件研发过程常见,一群人聚在一起,立项后进入敏捷迭代,快速上线,不断地升级一个一个版本,功能堆积,出现维护困难,直到发现实在难以维护,一致要求重构。...3.2 挑战二:RT-Cube™ 版本管理 第二个挑战是版本问题,提供功能非常多,不是所有客户都需要所有功能,要组合需要功能。我们需要面对要有多少版本问题。...我们给出一些比较容易选择档位,对于会议通讯场景可以使用Speech模式;对于不太确定场景可以使用Default,比较“万金油”;对于打音乐可以用Music音质模式;还提供如游戏般全定制设置,自定义所有想要参数...上图中可以看出云和端一体,整个系统都不是单独模块战斗,是由很多模块共同协助。控大脑做了多轮基于数据改进。 4.3.2 推流 网络模块还有一些较为细节部分。我们把场景主要分成两种直播和通讯

49920

常青:下一代音视频SDK方案设计

文 | 常青 整理 | LiveVideoStack 我们团队腾讯云主要做音视频通讯SDK,这一部分包含功能相对比较丰富,包括RTC通讯、直播推流、播放器、短视频录制、音视频特效处理、还包括IM...软件研发过程常见,一群人聚在一起,立项后进入敏捷迭代,快速上线,不断地升级一个一个版本,功能堆积,出现维护困难,直到发现实在难以维护,一致要求重构。...3.2 挑战二:RT-Cube™ 版本管理 第二个挑战是版本问题,提供功能非常多,不是所有客户都需要所有功能,要组合需要功能。我们需要面对要有多少版本问题。...我们给出一些比较容易选择档位,对于会议通讯场景可以使用Speech模式;对于不太确定场景可以使用Default,比较“万金油”;对于打音乐可以用Music音质模式;还提供如游戏般全定制设置,自定义所有想要参数...上图中可以看出云和端一体,整个系统都不是单独模块战斗,是由很多模块共同协助。控大脑做了多轮基于数据改进。 4.3.2 推流 网络模块还有一些较为细节部分。我们把场景主要分成两种直播和通讯

63430

如何在现有的 Web 应用中使用 ReactJS

从 jQuery 到 React 最近任务是用 React 重构一个使用 jQuery 写功能。这个过程困难重重,因为大量 jQuery 分散代码段。...因为我们希望组件之间通信,所以我们将它们放置父级组件,然后向下传递属性来更新每个子组件这是 ReactJS 最基本工作方式。 这种方式适用于多个 UI 组件一个组件包裹情况。...使用 Redux 分享状态 类似 Redux(flux 另一种实现)可以容易实现应用不同组件之间通信。...总结 希望这篇文章可以让你更好地了解需要关注内容以及如何将 ReactJS 运用到现有的应用。...主要解决方法就是,如果你使用 jQuery 处理 UI 片段,那么你可以将容器元素替换成一个 React 组件。如果你需要在多个组件中分享状态,那么你可以使用容器方法或者类似 Redux 库。

7.7K40

狂野 #imports: 如何驯服文件依赖关系

所有基于 C 语言语言一样,Objective-C 文件通常成对出现:有一个头文件和一个实现文件。头文件和实现文件都可以使用 #import 指令来包含其他头文件。...当你一个项目中工作时,这并不是什么大问题,但当你开始一个新项目并想重复使用一些源文件时,这就会立刻带来麻烦。 但是,.h 文件不必要 #imports 会更糟糕:问题会呈指数级增长!...这也是为什么把协议声明放在自己头文件,而不是与它们合作放在一起。这样可以保持依赖关系图简洁。...但是,即使你放弃了所有不必要 #import,你仍然会在一个长长列表中看到一个一个#import。开发过程容易将越来越多东西集中到一个。...以下是管理文件依赖关系时需要注意事项: 头文件 #import: #import 你要继承,以及你要实现协议。 前置声明其他所有内容(除非来自框架头文件)。

13810

清晰前端架构

嗯~如果没有定义规则,那么开发者可能会在他们组件直接使用 DTOs 或者与服务层进行通信而不使用存储层。或者说糟糕是,组件直接与服务层通信,这是多愚蠢。 我们怎么预防这些错误呢?...SOLID 还有一个原则 -> 里氏替换原则(Liskov Substitution Principle):子类应该能够替换掉父而不导致程序错误行为。...笔记:这些原则可以通过使用 Bit 容易实现。... Bit Workspace ,我们可以独立构建,测试,版本控制和文档化重用组件(函数、UI 元素或者数据模型),然后将它们发布到 Bit component-sharing platform...但是一个人如何确保代码可维护性呢?因为众所周知,业务逻辑随着时间推移而增长。简而言之,经常听到下面说法。 代码历史逐渐增长。

23320

如何在已有的 Web 应用中使用 ReactJS

这并不是使用 jQuery 更改 DOM 唯一策略,但常见。...因为我们希望组件之间通信,所以我们将它们放置父级组件,然后向下传递属性来更新每个子组件这是 ReactJS 最基本工作方式。 这种方式适用于多个 UI 组件一个组件包裹情况。...使用 Redux 分享状态 类似 Redux(flux 另一种实现)可以容易实现应用不同组件之间通信。...总结 希望这篇文章可以让你更好地了解需要关注内容以及如何将 ReactJS 运用到现有的应用。...主要解决方法就是,如果你使用 jQuery 处理 UI 片段,那么你可以将容器元素替换成一个 React 组件。如果你需要在多个组件中分享状态,那么你可以使用容器方法或者类似 Redux 库。

14.5K00

「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构,CQRS整合架构

要使此模式正常工作,最重要是创建适合应用程序核心需求端口,而不是简单地模仿工具api。 适配器或驱动适配器 适配器或驱动适配器围绕一个端口,并使用它来告诉应用程序核心要做什么。...为了解耦,我们使用依赖注入,将依赖注入到不是实例化,依赖倒置,使依赖于抽象(接口和/或抽象)而不是具体。...共享内核将包含应用程序和域事件之类功能,但它也可以包含规范对象,以及任何需要共享内容,请记住,共享内核任何更改都将影响到应用程序所有组件,因此共享内核应该尽可能少。...例如,它将包含事件描述,而不是包含事件共享内核。名称、属性、甚至方法(尽管这些JSON之类不可知语言中可能更有用),这样所有组件/微服务都可以解释它,甚至自动生成它们自己具体实现。...然而,这并不总是需要,事实上大多数情况下,处理程序将包含用例所有逻辑。如果需要在另一个处理程序重用相同逻辑,则只需要将逻辑从处理程序提取到单独应用程序服务

1.9K30

【译】Understanding SOLID Principles - Single Responsibility

比如,方法仅完成某家独立事情,而不是两件,如下: class UserComponent { // 这是第一件事情,获取用户详情数据 getUserInfo(id) {...(译者注:理解意思应当是,应当尽可能让已有的或者方法变得简单、轻量,不需要所有事情都亲自为之) 总之,不要让你对象成为上帝对象。...举个例子,如果一段客户端代码调用class A过程,必须要先了解有关class B细节,那么我们说A和B耦合在了一起。通常来说,这是一件糟糕事情。...code } } 之后过了一段时间,某一天,你经理要求你增加一个新功能,比如说去调用别的class每个函数,从而可以使当前这个组件完成更多工作。...追踪依赖 对于一个,检查它构造方法是否包含了太多参数,因为每一个参数都作为这个依赖存在,同时这些参数也拥有自身依赖。如果可能的话,使用DI机制来动态注入它们。

32310

你写注释吗?写你就输了

某些情况下,敢说,注释可以弥补我们代码没有完全表达出来意思。因此,写注释不值得赞美,而是应该停下来问问自己,是否有更好方式可以用代码来表达自己。 ?...本例,开发人员让读者知道,当与回调函数一起使用时,QT 函数不是线程安全。一般来说,如果一条注释可以避免某个人在编程时陷入绝望,那么它就是有用。 """ 许多 Qt 函数都不是线程安全。...它可能是要求其他人想一个更好名字,或者是提醒他们根据计划事件做出修改。 请记住,TODO 注释不是系统留下糟糕代码借口。本质上,每一行代码都是一种负担——最安全、最快代码是根本没有代码。...注释掉代码 团队准备好删除代码之前先将其注释掉似乎是一个好主意,但是不要这样做。注释代码是一种弊端,团队其他成员不会删除它,因为他们会认为它很重要。我们不是都在使用源码控制吗?...在这个例子,注释数量比代码数量还多——这让恼火。 class ComplexNumber: """ 这是一个用于复数数学运算

44120

Android工程模块化平台设计

另外再举个使用例子:一个订单模块,订单模块需要播放铃声,比如大家饭店经常听到“您有新饿了么订单,请及时处理”。...那作为服务提供方需要做些什么事呢,非常简单,你只需要给你对象提供public static方法,并加上一个@Creator注解,告诉IronBank这是一个创建器方法就可以了,其他任何事情,都不需要考虑...,当前最新构建SNAPSHOT是哪个,以及每个版本更新日志;这样做了以后,跨团队协作上沟通就大大降低了,如果你已经接入或者即将接入模块是另一个团队开发模块组件,那你可以直接关注它,它所有版本变动日志...首先看submodule:这种结构是Android默认多模块结构,一个工程下面有多个模块。图上每个绿色方块都代表了一个git仓库,然后我们看到所有子模块都包含工程模块内。...当然,他也有不适合,就是协作开发时候,所有人都在app module上测试自己模块,容易互相影响,工程git分支也会非常繁杂。

36640

「首席看软件架构」DDD,六边形,洋葱,干净,CQRS整合架构

要使此模式正常工作,最重要是创建适合应用程序核心需求端口,而不是简单地模仿工具api。 适配器或驱动适配器 适配器或驱动适配器围绕一个端口,并使用它来告诉应用程序核心要做什么。...为了解耦,我们使用依赖注入,将依赖注入到不是实例化,依赖倒置,使依赖于抽象(接口和/或抽象)而不是具体。...共享内核将包含应用程序和域事件之类功能,但它也可以包含规范对象,以及任何需要共享内容,请记住,共享内核任何更改都将影响到应用程序所有组件,因此共享内核应该尽可能少。...例如,它将包含事件描述,而不是包含事件共享内核。名称、属性、甚至方法(尽管这些JSON之类不可知语言中可能更有用),这样所有组件/微服务都可以解释它,甚至自动生成它们自己具体实现。...然而,这并不总是需要,事实上大多数情况下,处理程序将包含用例所有逻辑。如果需要在另一个处理程序重用相同逻辑,则只需要将逻辑从处理程序提取到单独应用程序服务

5K22

Android工程模块化平台设计

另外再举个使用例子:一个订单模块,订单模块需要播放铃声,比如大家饭店经常听到“您有新饿了么订单,请及时处理”。...那作为服务提供方需要做些什么事呢,非常简单,你只需要给你对象提供public static方法,并加上一个@Creator注解,告诉IronBank这是一个创建器方法就可以了,其他任何事情,都不需要考虑...,当前最新构建SNAPSHOT是哪个,以及每个版本更新日志;这样做了以后,跨团队协作上沟通就大大降低了,如果你已经接入或者即将接入模块是另一个团队开发模块组件,那你可以直接关注它,它所有版本变动日志...首先看submodule:这种结构是Android默认多模块结构,一个工程下面有多个模块。图上每个绿色方块都代表了一个git仓库,然后我们看到所有子模块都包含工程模块内。...当然,他也有不适合,就是协作开发时候,所有人都在app module上测试自己模块,容易互相影响,工程git分支也会非常繁杂。

49230
领券