首页 > 其他分享 >重构经历_编写代码生成器

重构经历_编写代码生成器

时间:2025-01-17 19:35:46浏览次数:1  
标签:代码生成 Name 框架 重构 代码 编写

我的重构经历:编写代码生成器

概述

背景
多年前,我开发了一个基于C#的Windows程序——代码生成器,并在此后十多年间持续优化。该程序能够根据数据库表结构生成代码,并将结果显示在文本框中。最初是从同事那里接手的一个简单项目,经过不断扩展和重构,最终实现了通过数据库自动生成具备完整增删改查功能的网站。

数据库结构读取的SQL语句

  • MySQL
    • 获取表的列信息:
SELECT Table_Name AS TableName, Column_Name AS ColumnName, Data_Type, Column_Default, Is_Nullable, Column_Comment, CHARACTER_MAXIMUM_LENGTH, COLUMN_KEY, EXTRA, NUMERIC_PRECISION, NUMERIC_SCALE

FROM COLUMNS

WHERE TABLE_SCHEMA='{0}'

 

 

    • 获取外键信息:
SELECT Constraint_Name AS FKName, Table_Name AS TableName, Column_Name AS ColumnName, Referenced_Column_Name AS RColumnName, Referenced_table_Name AS ParentTableName

FROM Key_Column_USAGE

WHERE Constraint_schema='{0}' AND Referenced_table_Name IS NOT NULL

 

    • 获取表名称信息:

 

SELECT table_Name AS TableName, table_Comment AS script, 'U' AS tableType

FROM tables

WHERE TABLE_SCHEMA='{0}'

UNION

SELECT table_Name AS TableName, table_Name AS script, 'V' AS tableType

FROM views

WHERE TABLE_SCHEMA='{0}'

 

效果

  1. 支持MySQL、SQL Server、Oracle等多种数据库。
  2. 自动生成具备增删改查功能的网站,无需额外修改即可运行。
  3. 在MyBatis流行之前,已实现类似功能的框架。

编写的过程也是重构的过程

从缩减代码开始
代码生成器最初通过拼接字符串实现,代码量大且重复较多。我的重构从缩减代码开始,将相似代码抽离成通用函数,符合《程序员修炼之道》中的DRY原则(Don’t Repeat Yourself)。

将数据与展示分离
随着代码量的增加,我意识到代码与数据库结构有天然关联,于是将数据与展示分离,将通用语句封装到数据类中,形成函数。这一改动大幅缩减了代码量,并提升了逻辑清晰度。

代码生成器的思考
最初的代码生成器仅生成简单的业务对象和逻辑代码。随着改进,逐渐增加了数据交互、SQL语句和前台页面代码的生成功能。

代码生成器与框架
在编写过程中,我发现需要引入框架来进一步缩减代码量。于是,我开发了一个C#数据库访问框架,将通用功能抽象到父类中,仅生成子类代码。

重构与读书
在重构过程中,我通过阅读《C# Primer Plus》等书籍,不断学习新知识并应用到代码生成器中。这种边学边实践的方式让我对面向对象编程有了更深的理解。

重构与组件
随着前台页面代码生成的引入,代码量大幅增加。为了减少重复代码,我开始编写和扩展ASP.NET组件,例如扩展表格组件以支持排序、翻页等功能。

重构与通用功能(小的框架)
为了简化前台页面的数据验证逻辑,我扩展了页面控件并编写了一个JavaScript小框架,统一处理数据验证。

重构与面向对象
在重构过程中,我曾过度使用继承和多态,导致代码复杂化。后来意识到错误,调整了设计思路,避免不必要的继承。

使用模板
随着代码生成器中重复代码的增加,我引入了模板技术,使用模板语言(如vtemplate)进一步简化代码生成逻辑。

重构与新技术
在编写代码生成器的过程中,我不断学习新技术,例如定制特性和模板语言。某些设计与后来的MyBatis框架不谋而合。

重构与开源项目
开源项目DotNetNuke对我的代码生成器开发有很大帮助。我借鉴了其中的CBO类,并学习了策略模式等设计模式。

重构与功能扩展
随着代码生成器的不断重构,功能也逐渐扩展,支持更多场景和需求。

重构与框架演进
配套的框架从最初的三层架构逐步演进,最终将功能拆分为独立组件,提升了灵活性和可维护性。

其他开发语言实现
为了加深对新语言的理解,我用Python重新实现了代码生成器的核心部分,并用Java实现了框架组件。


思考

重构的理解
重构是整理代码的过程,旨在提升代码的可读性、可维护性和性能。通过重构,我逐渐理解了设计模式的本质,并意识到模式并非固定不变,而是根据需求自然产生的。

我的重构步骤

  1. 注释检查:确保注释清晰、充分且与代码一致。
  2. 命名检查:确保类、函数和变量命名准确且风格一致。
  3. 方法复杂度检查:拆分过长或过于复杂的方法。
  4. 相似类检查:抽象出基类和公共函数,减少重复代码。
  5. 类成员可见性检查:合理设置成员的访问权限。
  6. 类关系检查:进一步抽象类之间的关系,提升代码结构。
  7. 代码评审:请他人阅读代码并提供改进建议。

重构与单元测试
重构应从设计接口时开始。通过编写测试用例,可以发现接口设计中的问题,例如功能不单一或依赖外部条件。

重构的风险
重构可能带来风险,例如代码无法编译或功能失效。因此,建议使用版本控制工具,并频繁进行编译和测试。

重构的原则和方法

  • DRY原则:避免重复代码。
  • 正交性:确保代码模块之间的独立性。
  • 隐藏秘密:封装实现细节,降低耦合度。
  • 源代码即文档:通过清晰的代码结构和命名提升可读性。
  • 《代码大全2》中的建议:强调代码的可读性和可维护性。

标签:代码生成,Name,框架,重构,代码,编写
From: https://www.cnblogs.com/Rong-/p/18677552

相关文章

  • 说说你对重构的理解
    在前端开发中,重构是指对现有代码进行结构性调整和优化,以提高代码的可读性、可维护性、可扩展性和性能,同时确保代码的功能不发生变化。重构是一个持续的过程,旨在改善代码的内部结构,使其更加健壮和灵活,以适应未来的需求变化。以下是我对前端开发中重构的一些理解:提高代码质量:重......
  • JAVA-Exploit编写(5)--http-request库使用
    目录1.http-request简介2.依赖导入3.GET请求方式3.1test.php3.2基本使用代码实现 3.2请求时请求参数URL编码实现 3.3携带多参数请求3.Post请求方式3.1基本使用3.2携带单个参数请求 3.3携带多个参数请求4.设置代理请求 4.1方式一4.2方式二1.ht......
  • 在实际编写css中你有遇到过哪些浏览器兼容性的问题?怎么解决的?
    在实际编写CSS过程中,我遇到过多种浏览器兼容性问题。以下是一些常见问题及其解决方法:不同浏览器对CSS属性的支持差异:某些CSS属性(如flexbox布局、grid布局、CSS变量等)在新版浏览器中得到良好支持,但在旧版浏览器或某些特定浏览器中可能不支持或存在bug。解决方法:使用CanIuse......
  • Java个人驾校预约管理系统web驾校教练预约系统springboot/ssm代码编写
    Java个人驾校预约管理系统web驾校教练预约系统springboot/ssm代码编写基于springboot(可改ssm)+html+vue项目开发语言:Java框架:springboot/可改ssm+vueJDK版本:JDK1.8(或11)服务器:tomcat数据库:mysql5.7(或8.0)数据库工具:Navicat/sqlyog开发软件:eclipse/idea依赖管理......
  • EpiCoder:基于特征树的代码生成框架——提升代码大语言模型的多样性与复杂性
    引言:代码生成领域的挑战与机遇近年来,大语言模型(LLMs)在代码理解和生成领域展现了巨大的潜力。通过对大规模代码数据进行预训练,这些模型能够生成功能强大的代码片段。然而,现有的代码生成方法主要依赖于代码片段作为种子数据,这些片段在功能性和结构上存在局限性,难以捕捉真实编......
  • 圆弧路径规划C重构
    参数currentPos:命名元组Coord(x=-155.0,y=0.0,z=0.4,e=0.0)targetPos:[0.0,-155.0,0.3]offset:[155.0,0.0]圆心坐标clockwise:True顺时针,Fasle逆时针mm_per_arc_segment:默认值1.0,支持配置文件动态获取输入和输出,和python代码的实现保持一致。C代码实现......
  • 如何编写有效的网站修改方案?
     编写网站修改方案时,需要详细列出修改的目标、步骤、预期效果以及时间表。以下是一个示例模板:部分描述引言简述修改方案的目的和背景。目标明确修改的具体目标,如提升用户体验、优化SEO等。当前状况描述网站的现状,包括存在的问题和不足之处。修改方案详细......
  • 自动化运维脚本编写规范是指在编写运维自动化脚本时,遵循的一系列最佳实践和标准。这些
    自动化运维脚本编写规范是指在编写运维自动化脚本时,遵循的一系列最佳实践和标准。这些规范确保脚本的可读性、可维护性、可靠性和一致性,同时减少出错的机会,并增强团队之间的协作效率。1. 是什么自动化运维脚本编写规范是为了确保脚本在自动化运维过程中能够高效、清晰、安全地......
  • 代码生成器CodeGenerator
    CodeGenerator是一款用C#开发的ExcelCOM加载项,功能是基于已有的字符串有规律地生成多个字符串。该插件可用于Excel2010及其以上版本,32位、64位均可使用。插件安装方法:第1步:右键以管理员身份运行RegAsm.bat第2步:双击CodeGenerator.Connect.reg第3步:启动Excel,可以看到出现了自定......
  • 想在linux平台拥有和vs一样的体验模式吗?只需配置一下你的vim便可以轻松达到,让你日常
            ......