# edev-c-helloworld **Repository Path**: mooodo/edev-c-helloworld ## Basic Information - **Project Name**: edev-c-helloworld - **Description**: 用C语言演示软件重构的过程 - **Primary Language**: C - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-11 - **Last Updated**: 2024-05-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: Refactor, C语言 ## README # 用C语言进行重构的过程 这是一个示例代码,演示了用C语言进行软件重构的过程。当年Martin Fowler提出了重构的概念,让我们可以更加安全地修改代码,而不用担心会引入新的bug。然而,这个软件重构的方法是在面向对象的语言上提出的,那么在C语言上如何进行重构呢?本示例给出了答案。 ## 函数的重构 在第一次重构中,我们演示了“抽取方法”的重构过程,它可以广泛地应用于C语言的重构中。它将一个代码杂乱而难以阅读的大函数,拆分成多个短小而清晰的小函数,让代码更加清晰,易于阅读,更易于维护和变更。 ## 对象的重构 在软件重构的方法中,更重要的是“抽取类”的重构方法。然而,在C语言中并没有类的概念,那么如何进行重构呢?答案是将对象与c文件进行对应。在真正的面向对象的语言中(如Java),每个类都是一个独立的文件。因而,在C语言中,“抽取类”的重构方法就变成了,通过“单一职责原则”,将一个大的c文件拆分成多个小的c文件,每个c文件都是一个独立的职责(相当于一个类)。然后,它们之间通过头文件进行关联。这样,就可以在C语言中实现“抽取类”的重构方法了。第二次重构就演示了这样的重构过程。 ## 接口的重构 在重构方法中,对接口的重构就是“抽取接口”的重构方法。然而,在C语言中没有接口的概念,我们可以通过头文件来实现与接口相同或者相似的效果。在本案例中,当greetToUser和greetAboutTime通过头文件抽取出来以后,我们的客户可能会有2种不同甚至相互矛盾的需求,一个是用中文问候,一个是用英文问候。那么如何在同一版本中,同时满足这2类用户的需求呢?通过抽取头文件,然后为其写2个不同的实现,就可以在设计期用一个版本满足不同用户需求。 这里特别要注意重构的过程。按照“两顶帽子”的方法,在添加新功能时,应当在不添加新功能的前提下先进行重构,以适应新功能,然后再添加新功能。这样,才可以保证重构的安全性。 因此,我们首先通过重构抽取出一个头文件,以及它原有的实现,保证程序的正常运行。然后,在头文件中定义一个宏,用来控制不同的实现。这样,我们可以在不同的c文件中,通过修改这个宏的值,来实现不同的实现。这样,在编译期通过修改宏程序的值,就可以为不同的用户编译出不同版本的程序,满足不同客户的需求。通过这种方式,就实现了与接口类似的功能,并且让程序变得易于维护和变更。第三次重构就演示了这样的重构过程。