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

这在OOP中会被认为是糟糕的实践吗?

在面向对象编程(OOP)中,以下情况被认为是糟糕的实践:

  1. 过度使用全局变量:全局变量破坏了封装性和可维护性,使得代码难以理解和调试。应该尽量避免使用全局变量,而是使用局部变量或者将变量封装在类的属性中。
  2. 过度复杂的类:一个类应该只负责一项具体的功能,而不是承担过多的责任。过度复杂的类会导致代码难以理解和维护。应该将功能拆分成多个小的类或者模块,每个类只负责一项功能。
  3. 过度耦合的类:类之间的耦合度过高会导致代码的可复用性和可维护性降低。应该尽量减少类之间的依赖关系,使用接口或者抽象类来解耦。
  4. 过度使用继承:继承是一种强耦合的关系,过度使用继承会导致代码的可维护性和可扩展性降低。应该优先考虑使用组合或者接口实现多态性。
  5. 过度使用全局函数:全局函数破坏了封装性和可维护性,使得代码难以理解和调试。应该尽量将函数封装在类的方法中,通过对象调用。
  6. 过度使用硬编码:硬编码将常量或者配置信息直接写入代码中,使得代码难以维护和修改。应该将常量和配置信息提取到配置文件或者常量定义中,以便于修改和管理。
  7. 过度复杂的逻辑:过度复杂的逻辑会导致代码难以理解和调试。应该尽量简化逻辑,将复杂的逻辑拆分成多个小的函数或者方法,提高代码的可读性和可维护性。
  8. 过度使用全局异常处理:全局异常处理会隐藏错误并导致难以调试。应该尽量在局部进行异常处理,以便更好地定位和解决问题。

以上是在OOP中被认为是糟糕的实践,避免这些实践可以提高代码的质量和可维护性。

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

相关·内容

面向对象编程是计算机科学最大错误

人们可以精通各种 OOP 最佳实践,比如依赖注入、测试驱动开发、领域驱动设计等(确实有帮助)。然而,这些都不是编程范式本身所能强制执行(而且也没有这样工具可以强制执行最佳实践)。...在 OOP ,所有的东西都是通过引用传递这在技术上意味着,任何对象都可以被任何其他对象突变(OOP 没有任何限制来阻止这一点)。...过去很多人都抵制停止使用 goto 建议,就像今天很多人抵制函数式编程,和不可变状态理念一样。 但是等等,意大利面条代码呢? 在 OOP ,它被认为是 “优先选择组成而不是继承” 最佳实践。...这取决于你团队初级开发人员是否遵循这样最佳实践,以及这些实践是否在代码审查得到执行(这并不总是发生)。 那函数式编程呢?在函数式编程,函数式组成(和分解)是构建程序唯一方法。...说 OOP 和 FP 是互补,可能就等于说放血和抗生素是互补,是OOP 违反了许多基本 FP 原则: FP 提倡纯净,而 OOP 提倡杂质。 FP 代码基本上是确定性,因此是可预测

60050

36个助你成为专家需要掌握JavaScript概念

你知道在JavaScript,给一个变量赋一个非基本类型值,实际上是赋了一个该值引用?引用指向了存储值内存位置。...这个模型与其他语言(如C和Java)模型有很大不同。 在上述并发模型,消息队列用于处理从最老消息开始消息。只要事件发生,并且有一个事件监听器监听它,消息就会被添加到队列。...这将允许重用现有对象属性和函数,有点像OOP继承概念。 当你使用Object.assign方法,则可以将可枚举自有属性从一个或多个源对象复制到目标对象。...生成器允许你编写代码函数,使你能够暂停和重新启动函数,而不会阻塞其他代码执行,这在JavaScript是非常少见。...虽然这些“好实践是主观,并且在不同工作场所有所不同,但是有一些实践是公认“好”。 通过遵循这些代码原则,你可以确保你代码对每个人都是可读和可维护

70920
  • 要深入 JavaScript,你需要掌握这 36 个概念

    这是有原因,因为 使用Object.create方法时,可以将现有对象用作新创建对象原型。 这样就可以重用现有对象属性和功能,有点像OOP继承概念。...生成器允许我们编写代码函数,从而能够暂停和重新启动函数,而不会阻止其他代码执行,这在JavaScript是很不常见。 25....但是 JS 通过提供原型继承来提供OOP某些功能。 多态是对象、变量或函数可以采用多种形式概念。在 JS ,要看到多态效果有点困难,因为在静态类型系统,多态经典类型更明显。...以上两个概念都可以帮助我们在 JS 实现更好代码重用。 32.设计模式 设计模式(Design pattern)代表了最佳实践,通常被有经验面向对象软件开发人员所采用。...每种编程语言都有一套单独良好实践。 尽管这些“良好”做法是主观,并且在工作场所之间存在差异,但有些惯例被认为是“良好”。 通过遵循这些代码原则,可以确保每个人都可以阅读和维护你代码。

    47010

    开发有效地 Java微服务需要Effective Java

    在执行代码评审时,我总是喜欢问这些问题: 代码是否可读且易于理解可维护代码代码是正确它是否遵循公认最佳实践如果您是一位经验丰富Java开发人员,那么您可能已经具备了帮助您回答这些问题直觉和知识...这两种都是很好技术(如果你要求的话,我更喜欢Spring Boot),可以让你快速交付……这两种技术都不能让你免于编写糟糕代码! 根据我经验,微服务体系结构是相当困难。...所有对象通用方法——处理Java对象ABC。 类和接口——JavaOOP实践良好概述。 泛型——深入研究泛型和多态性。 枚举和注释——解释语言中经常被误解和未充分使用特性。...并发性——Java并发性和最佳实践坚实介绍。 序列化——序列化Java对象。 正如你所看到,书主题领域非常广泛。它与众不同,尽管如此,它仍能保持深刻而深刻见解。...这是通过挑选特定项目并深入研究它们来实现。 举个例子: 44、喜欢使用标准功能接口。在这里,我们深入了解了Java功能接口以及围绕它们使用最佳实践

    41620

    每日一面 - mysql,innodb表里,某一条数据删除了之后,这条数据会被真实擦掉,还是删除了关系?

    innoDB 页大小默认为 16KB,对于一些占用字节数非常多字段,比方说某个字段长度大于了16KB,那么如果该记录在单个页面无法存储时,InnoDB会把一部分数据存放到所谓溢出页,在变长字段长度列表处只存储留在本页面长度...NULL 值列表仅仅针对可以为 NULL 字段,如果一个字段标记了not null,那么这个字段不会进入这个 NUll 值列表 BitMap 。 NULL值列表占用几个字节呢?...并且,每个字段在这个 bitmap ,类似于变长字段长度列表,是逆序排列。...,也可以理解为在堆位置信息 record_type 3 记录类型,普通数据记录为000,节点指针类型为001,伪记录首记录 infimum 行为010,伪记录最后一个记录 supremum 行为011...如果事务回滚的话,则从 undo Log 把原始值读取出来再放到记录中去 这里我们先不详细展开这些列说明,只是先知道这些列即可,只会会在聚簇索引说明以及多版本控制分析章节详细说明。

    83620

    Perl、PHP、Python、Java

    但在实际应用,它们没有Java平台和.NET平台那种整合凝聚力和核心作用,通常作为轻量级解决方案。” 问号想探个究竟:“这是由于它们都是动态语言缘故?”...,你们知道是哪种?”...逗号猜想:“应该是某种OOP语言吧。” “Perl确有不少C++影子,但它对象模型在5.0以后才引入,典型半路出家,远不如前面的特征那么自然。...相比之下Python被认为是Perl有力挑战者,不仅在于它天然OO设计和丰富类库,更重要是它对程序员友好度大大超过Perl。...众人沉思片刻,齐齐挥笔而就―― 叹号――没有最好语言,只有最合适语言。 逗号――没有糟糕语言,只有糟糕程序员。 问号――没有一种语言是万能,只会一种语言是万万不能

    99510

    什么样才算单元测试?谁该负责写?微软和谷歌这么说……

    (2005年以前) 在谷歌早期,工程师驱动测试通常被认为是无关紧要。...2005年,谷歌网络服务( Google Web Server ,简称GWS )服务质量糟糕到了极点,工程师们从早到忙到晚,为了应付生产环境上出现问题和故障,已经疲惫不堪。...甚至在一段时间里,80 % 发布都包含对用户有影响且必须回退缺陷。 因此,当时负责 GWS Tech Lead 要求必须写自动化测试,并执行持续集成实践。...即使每个工程师都只是偶尔写出一个缺陷,那么当你有足够多的人在同一个项目上时,你仍旧会被越来越多缺陷所包围。...这在公司周围引发了很多关于什么是“小”意思?“小测试”意味着单元测试?那么集成测试呢?它们测试规模是大,还是小? 我们得出结论是: 每个自动测试用例有两个不同维度:资源占用和验证范围。

    72830

    面向对象编程是否走向了消亡?

    但是在技术革新日益实践过程,不少人发现面向对象设计会使代码复杂化,难以理解而且难以测试,对此,后来有网友更是将 OOP 称之为是反模块化、反并行,从而开启了一波又一波吐槽模式。...而论 OOP 在各个领域中应用时,其是否真的有想象那么糟糕?接下来,本文将带领大家一读 OOP 兴衰成长史。 ?...通常,编译器通过一系列阶段或“传递”来处理这些数据结构,每一步输出被送到下一步输入。 在过去,我倾向于按照推荐OOP样式为每个操作每个对象设置一些逻辑。...与OOP一样,函数式编程不仅仅是单纯一件事物,而是一套整体风格上原则。然而,它要点是,虽然OOP专注于与对象进行交互或通信,但在FP,重点在于对它们转换。...在我自己编程过程,我更喜欢“混合”方法,在某些地方使用FP技术,而在其他地方使用OOP技术。在解决某些问题上FP确实能大放异彩,但也有另一些问题上OOP是更明智选择。

    65330

    拼夕夕三轮面经:被问到反射bug,你中招了吗?

    若不使用反射,选用哪个重载方法很清晰,比如: 传入666就走int参数重载 传入Integer.valueOf(“666”)走Integer重载 那反射调用方法也是根据入参类型确定使用哪个重载方法?...案例 现在期望在类字段内容变动时记录日志,于是SE想到定义一个泛型父类,并在父类定义一个统一日志记录方法,子类可继承该方法。上线后总有日志重复记录。...有的同学会认为是因为反射API使用错误导致而非重写失败: getMethods 得到当前类和父类所有public方法 getDeclaredMethods 获得当前类所有的public、protected...子类虽指定父类泛型T类型是String,但编译后T会被擦除成为Object,所以父类setValue入参是Object,value也是Object。..." class com.javaedge.oop.genericandinheritance.Sub2 extends com.javaedge.oop.genericandinheritance.Base

    50430

    伙计们,Go 并没有那么简单

    用来删减关键字另一个技巧叫 预定义标识符(Predeclared identifiers),在技术上它不是关键字,但是在实践仍然需要它们,创建一个和它同名变量仍然不是一个好主意,因此,最后看来.....上面链接文档说: 还有种区分内嵌与子类重要手段。当内嵌一个类型时,该类型方法会成为外部类型方法,但当它们被调用时,该方法接收者是内部类型,而非外部。 有差别?...但一旦你做了,做事情和传统 OOP 非常相似,包括方法覆盖 - 这里是个演示。 关于 Go,有件事令我很惊讶 —— 这门所谓简单语言 —— 你甚至可以实现多重继承。确实很糟糕。...这在某种程度上是事实,但我不认为它像有些人描述那么糟糕。似乎那些人已经经历了 C++ 模板痛苦,从那以后,无论何时提及泛型,都会遭受 PTSD(创伤后应激障碍) 攻击。...任务 - “goroutines” 这可能看起来有点显而易见,因为 goroutines 是一个经常被提及特性,就像“简单”一样,所以我觉得需要区分下:我认为这不是通常意义上并发性,它不能认为是 Go

    79160

    我个人对OOP理解

    OOP面向对象思维: pay1:封装 A.避免使用非法数据赋值 B.保证数据完整性 C.避免类内部发生修改时候,导致整个程序修改 pay2:继承 A.继承模拟了现实世界关系...,OOP强调一切皆对象,这符合我们面向对象编程思考方向 B.继承实现了代码复用,这在例子我们已经有所体会,合理地使用继承,会使我们代码更加简洁 C.继承使得程序结构清晰,子类和父类层次结构更清晰...,对于同一个消息(方法调用)做出不同响应行为方式 pay4:接口 A.接口是对继承单根性扩展:请你回想一个我们在第六章继承问题,在C#,一个子类可以继承多个父类?...根据我们学习知识,这是不可以。但 是接口可以说是充某种程度上实现了多重继承功能。在C#,一个类虽然不能实现多重继承,但是一个类可以实现多个接口。...pay5:序列化和反射 A.我们经常需要将对象字段值保存到磁盘,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法

    61330

    理论有何用?不问“何用”,先问“用否”!

    想起同事以前偶尔说OOP(面向对象编程),想起他案头上那本厚厚设计模式,再看看他写代码,我都不相信这是他写。OO有啥用?OOP有啥用?设计模式有啥用?归根结底,“理论有何用”?     ...这些问题,我之前也怀疑过,也迷茫过,但后来我尝试着慢慢去使用,一开始有点“鹦鹉学舌”,有点“画蛇添足”,但后来我慢慢领悟到,理论来自实践,理论指导实践,并非理论无用,而是要先学习理论,继而使用理论,然后检验理论...,发展理论,甚至找到新理论并实践出巨大成就。...自从OO理论提出以来,近20年软件取得了飞速发展,各种具有OO特点高级语言层出不穷,比如 C++,Java,C#等等,但并不是我们有了这些OO工具和语言,就等于我们开发软件就是符合OOP,如果我们拥有...OO理论,而不到实践中去使用它,那等于我们没有理论,等于我们永远处在小作坊式软件开发水平,这是我们学习理论目的

    63070

    Android 开发者如何函数式编程 (三)

    我们甚至不需要匿名内部类,因为在 Kotlin 函数是「一等公民」: var x = 5 view.setOnClickListener { println(x) } 这在 Kotlin 是完全有效...Kotlin 函数都是闭包。他们可以跟踪和响应其环境更新。 第一次触发 click listener 时, 会打印 5。...**这种用法经常出现在函数式编程语言编程实践,在那里你可能需要用到一些 OOP(面向对象编程)编程方法,但是所使用语言并不支持。...我们能用闭包来描述相同行为?...如果把 5 传递给这个返回函数,它将把狗狗体重增加到 10 + 5 = 15 并打印出来。 所以结合闭包和高阶函数,我们没有使用 OOP 就有了对象。 ?

    1.3K80

    应该在JavaScript中使用Class

    看似无处不在OOP OOP 即 面向对象编程 (Object Oriented Programming)毫无疑问是软件设计和发展一大进步。...事实上,一些编程语言如 Java 、C++ 就是基于 OOP 核心概念 class 开发出来。 在高校 CS 相关专业,无论教授什么编程语言,OOP学习是绝对不会被落下。...同时,OOP在业界也的确被大量使用,尤其是的后端服务领域、桌面软件、移动APP开发等。...“ 当然这是因为实习生基础问题,他需要更多学习历练,但话说回来**这样心智负担真的有必要吗?为什么不让程序更简单明了一点?**仅仅是为了让代码看起来更 OOP ?...接下来我会继续写一篇后续相关文章,接着讨论 JavaScript 和 OOP 碰撞另一簇火花 —— 原来不使用 class ,JavaScript 依然能借鉴前人OOP最佳实践和经验!

    1.1K10

    函数式编程后期架构

    他说,函数式编程组件本质上仅是数据类型和函数,这些函数在没有可变状态情况下工作。与典型 OO(面向对象)组件相比,这使得依赖关系更显式化,并且耦合更松散。...InfoQ 采访了 Michael Sperber,探讨了当前架构技术工具箱是如何使我们更倾向于做出糟糕决策,而这些决策在以后很难更改,以及如何解决这个问题。...Sperber:在架构界,我们似乎忘了如何在有界上下文或单体实现模块化,这就是为什么会有“模块化”这个新术语原因,这意味着常规单体在默认情况下是非模块化,其内部是紧密耦合。...InfoQ:所以你意思是说我们不知道如何在单体实现松耦合? Sperber:是的。这是因为 OO(面向对象)架构基础是使用可变状态进行编程,即在适当位置更改对象。...这些状态变化导致了不可见依赖关系,这些依赖关系很难被看见,并且会使构建块纠缠在一起。这不仅会影响项目的功能,还会影响其他质量目标。 InfoQ:你能举个例子

    16410

    PHP12个魔术方法

    PHP中有一些特殊函数和方法,这些函数和方法相比普通方法特殊之处在于: 用户代码通常不会主动调用, 而是在特定时机会被PHP自动调用(这些方法在php特定事件下将会被触发)。...__construct  构造器是一个魔术方法,当对象被实例化时它会被调用。在一个类声明时它常常是第一件做事但是没得必要他也像其他任何方法在类任何地方都可以声明,构造器也能像其他方法样继承。...如果我们想到以前继承例子从介绍到oop,我们能添加构造方法到Animal 类,如: class Animal{ public function __construct(){ $this->...由于并没有构造方法,PHP 会参考父类方法定义 信息来使用它因此我们能覆盖父类方法,或者不,在我们新类-很便利。 __destruct 你发现文件句柄也是构造器一部分?...__call 进行友善错误处理,这在需要别人整合调用你方法库代码中非常有用。

    91340

    OushuDB小课堂丨提高数据素养 12 步计划

    艾肯最重要教训之一是,数据组织问题必须作为一项战略而不是一个项目来管理。回到恢复类比,长期最佳实践不是通过消除症状来一劳永逸地彻底改变,而是通过不断地修改全公司习惯。...创建一个明确说明新价值观公司原则可能会有所帮助:例如,当前“遵循计划”原则可能会被“响应变化”所取代。...“是的,我们过去常常这样做很糟糕,这就是糟糕代价。”...“大多数组织一直在说,'数据是每个人责任,'”艾肯开玩笑说。“嗯,结果不是很好,是?‘每个人责任’通常最终意味着这是别人责任!”...“这在很大程度上是一项团队运动,”艾肯说。 第八步:列出数据受益人 将程序越来越多地从“我”转向“我们”轨迹,这一步是改进关键因素 数据管理,您和您团队会在其中列出最能从您数据获益的人。

    18710

    124道全面且精准大厂Java面试题分享

    多线程、并发及线程基础问题 1)Java 能创建 volatile 数组? 2)volatile 能使得一个非原子操作变成原子操作? 3)volatile 修饰符有过什么实践?...Java 最佳实践面试问题 包含 Java 各个部分最佳实践,如集合,字符串,IO,多线程,错误和异常 处理,设计模式等等。 76)Java ,编写多线程程序时候你会遵循哪些最佳实践?...79)说出 5 条 IO 最佳实践 80)列出 5 个应该遵循 JDBC 最佳实践 81)说出几条 Java 中方法重载最佳实践?...关于 OOP 和设计模式面试题 这部分包含 Java 面试过程关于 SOLID 设计原则,OOP 基础,如类,对象, 接口,继承,多态,封装,抽象以及更高级一些概念,如组合、聚合及关联。...119)描述 Java 重载和重写? 120)Java ,嵌套公共静态类与顶级类有什么不同? 121) OOP 组合、聚合和关联有什么区别?

    1.1K00

    在 Golang 依赖注入是 解药 还是 毒药?

    完全面向过程编程,在 go 是可行。 但如果你项目比较大,又是多人协作,我真心建议你使用 DI,OOP 是有它存在意义。...,随便哪里都能用 PS:其实,当初这个项目还有一个 1.0 版本,在 1.0 版本虽然没有使用DI,但是当时是 OOP 思想在做,我们当时开发也一致觉得麻烦,所以没有采用。...以数据库操作举例: 如果是面向过程,你无法保证调用 dao 方法时候,数据库连接已经被初始化完成 如果是面向对象,当你调用这个对象方法前,你一定会 New 这个对象,这个对象相关依赖一定会被传递进去...我也是从 java 过来,在 java spring 框架中就有这个概念,当时我在学习 java 时候就有所了解,但其实当我在 golang 实践了之后有了更深刻认识。...到这里你可能会觉得,那么我自己写不是也可以?没错,在项目小时候几乎看不出来优势,但是当项目大了,有许许多多资源时候初始化就会变得非常复杂。

    1.9K41
    领券