1) 通用方法
一个方法处理多个业务,比如修改用户传入一个用户对象,方法根据邮箱,手机..是否为空来处理修改手机,邮箱等业务
处理方法:每个业务要分开,单一职责
2) 对象内的平行方法
A(a1,a2,a3),a1,a2,a3方法中有相似功能。
IA(a)ßA(a,abstract b)ßA1(b),A2(b),A3(b)
3) 业务链方法
一个业务的链式判断用方法调用来实现,比如用户登录,先判断是否是用户名-》别名-》密码。
方案二:用责任链或装饰器模式来处理。
两个没有特别明显的优略,但如果是一个业务的重要逻辑,方案二有明显优势。
4) 混乱代码
很多类,对像协调来做一件事,每个类只是一个框子,代码间调用复杂。
最差的一种代码,用面向对象的架子来装下面向过程的代码,过程分的还不清晰。
处理方案:两条线索,1从重复代码入手重构(示例迁徙程序)。2.从不合理调用链条重构(示例画图模型和前台UI耦合重构)。
更进一步再是类的单一职责。
5) 混乱对象
对象转化多次来做一件事。比如转成一个批量Bean的临时对象,再生成批量Bean,再生成一个批量Bean的集合。
处理方法:找出有效转化,去除无效转化。
6) 线程滥用
到处是多线程协作。
处理方法:找到系统瓶颈,多线程的使用原因,去除对系统无贡献的多线程。
7) 提前调一下
调用方法A之前必须调用B方法,如画图前,要调用设置屏幕信息以及画布大小相关的方法。
处理方法:把B做成接口让相关类依赖,调用A时传入相关B接口实现。
8) 双向依赖
解除双向依赖,A->B B-A
方法一:使用依赖倒置原则。(把A中被B依赖的进行抽象放入B中)
方法二:新建立C,把A中被B依赖的放入C。
例:画图程序前台依赖于画图模型,画图模型需要依赖前台像素大小。画图模型依赖于ScreenInfo接口,前台类构建ScreenInfo实现传入模型。
此例子中不适用方法二,因为只有画的时候才能得到屏幕信息。
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:271.5pt; height:60.75pt'> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
9) 业务关注缓存
业务当中耦合缓存相关代码
处理方法:业务不应该关注数据的存储实际介质,下层提供透明的接口,实现Repository有些理想化。可以在缓存和数据库之上简历一个Façade来透明化接口。
10) 分层清晰,对象多
分层清晰,但业务松散,过程化对象多,但调用关系多过所做事情。
处理方法:提高业务对象的内聚性。
此处很有代表性,这类代码应该算是面向过程中比较好的代码了。很好的体现了领域驱动和过程化驱动的差异。对象更合理。
11) ThreadLocal大量使用
代码不好阅读,ThreadLocal能不用就不用。在一些地方能画龙点睛,比如数据库连接。但别代替方法传值。
12) 重构半天跑不起来了
程序混乱,并且无单元测试。重构要小步,先加新功能再删除原来的功能,并且要分成几步(足够小),每步让程序能跑起来可测试。比如用一个传值结构替换原来的传值结构,要先加新的变量,但不要删除原来的变量,然后用新变量一个属性在这个方法中的调用来替换原来的变量引用。 又如,画图程序中新的画图逻辑一个线一个点的替换原有逻辑。先注释原逻辑中的一点代码,让功能消失,用新逻辑实现,再测试。
相关推荐
根据提供的文件信息,我们可以推断出这是一篇关于获取《SQL反模式》这本书PDF版本的文章。下面将基于这个前提,详细展开与该书相关的知识点。 ### SQL反模式概述 SQL反模式是指在数据库设计、查询编写及维护过程中...
### SQL反模式知识点详解 #### 一、SQL反模式概览 **SQL反模式**(SQL Antipatterns)指的是在数据库设计与SQL查询编写过程中常见的错误做法或不良习惯,这些做法可能导致性能问题、数据不一致或其他技术难题。...
用stm32TIM2的CH1和CH2通道作为编码器模式,选择编码器模式1,编码器为A相为512脉冲,dir为方向脉冲,可以实现编码器正转加数,反转减数。
例如,当Z轴的主编码器出现故障时,可以通过Easy Extend将备用的编码器设置为系统当前的主编码器,同时调整相关的反饔回路参数,实现系统的无缝切换。 在实际操作中,配置编码器需要根据设备的具体型号和驱动模块的...
STM32的定时器有多种工作模式,包括计数模式、比较模式、PWM模式等,而编码器模式则是专门用于处理编码器信号的一种模式。在编码器模式下,定时器的输入捕获通道会跟踪编码器脉冲的上升沿或下降沿,根据不同的编码器...
《Java 反模式 卷4》是一本深入探讨Java编程中常见错误做法的书籍,旨在帮助开发者避免在项目中落入这些陷阱,提升代码质量和效率。反模式是指在实践中被证明无效或者低效的设计和实现方式,了解它们可以帮助我们更...
在IT行业中,尤其是在Java企业级应用开发领域,J2EE(Java 2 Platform, Enterprise Edition)反模式是一个重要的话题。反模式是指在特定上下文中,虽然常见但效果不佳的实践或设计选择,它们可能导致系统复杂性增加...
在数据库设计领域,"SQL反模式"是一个重要的概念,它指的是在实践中常见但可能导致性能下降、数据不一致或维护困难的设计方法。理解SQL反模式有助于我们避免这些常见错误,提高数据库系统的效率和可维护性。这里我们...
- **静态检测工具**:如SonarQube、PMD等,这些工具能够对源代码进行深入分析,识别出常见的设计和编码反模式。 - **动态检测工具**:如LoadRunner、JMeter等,这类工具主要用于性能测试,通过模拟实际用户负载来...
- 反模式:在SQL语句中直接使用硬编码的值 - 解析:这使得代码难以维护和复用,且不利于参数化查询,可能导致SQL注入风险。应使用参数化查询或存储过程。 9. **忽视性能监控** - 反模式:不关注查询执行计划和...
《SQL反模式》是一本深入探讨SQL数据库设计与优化的经典之作。这本书中文版的高清PDF电子书,旨在帮助读者理解并避免在数据库设计过程中常见的错误和不良实践,从而提升数据库性能,确保数据的一致性和准确性。 SQL...
在STM32F1中,通常使用TIMx定时器的输入捕获模式来处理编码器脉冲。首先,我们需要选择合适的定时器,如TIM2、TIM3或TIM4,并将其配置为计数器模式。然后,将编码器的A和B信号连接到定时器的捕获输入通道(例如,CH...
### 工程与技术实践-TDD中常见的10大反模式 #### 1. 引言 测试驱动开发(Test-Driven Development, TDD)是一种软件开发方法论,它要求在编写任何生产代码之前,先编写相关的测试用例。TDD的核心原则包括“先测试...
本文将深入探讨华大单片机HC32L136K8TA如何配置编码器接口,特别是利用定时器5(TIM5)的CH0A和CH0B通道实现对编码器输入信号的处理,以实现正反转的检测。 首先,HC32L136K8TA是一款低功耗、高性能的8位单片机,由...
通过给每个标记点设计独特的编码模式,使得在图像拼接过程中能够更加容易地识别和区分它们,从而减少错误匹配的几率,并提高整体的拼接精度。 自适应二值化方法在图像处理中扮演了重要角色。该方法通过分析图像的...
本资料“网络游戏-使用反模式匹配的网络消息处理”主要探讨了一种特殊的消息处理策略——反模式匹配,这种方法在处理大量并发网络请求时能展现出其独特的优势。 网络消息处理通常涉及到协议解析、消息编码与解码、...
通过分析这个“PHP电子邮件反编码调用类”,我们不仅了解了MIME编码的基本原理和PHP类的设计模式,还学习了如何处理和解码MIME编码的字符串。此外,我们也意识到了在编程过程中正确使用语法和有效利用IDE进行调试的...