- 主题:[供给侧]一个开源项目(xserver)18年前的一次重构 (转载)
【 以下文字转载自 SoftEng 讨论区 】
发信人: darkk (darkk体国经野 义尚光大), 信区: SoftEng
标 题: [供给侧]一个开源项目(xserver)18年前的一次重构
发信站: 水木社区 (Sun Aug 29 21:37:18 2021), 站内
(1) 这个项目的简要信息(参考)
=================================
维毒百科:
** Graphical User Interface **
The graphical user interface (GUI jee-you-eye or) is a form of user interface that allows users to interact with electronic devices through graphical icons and audio indicator such as primary notation, instead of text-based user interfaces, typed command labels or text navigation. GUIs were introduced in reaction to the perceived steep learning curve of command-line interfaces (CLIs), which require commands to be typed on a computer keyboard.
** X.Org Server **
X.Org Server is the free and open-source implementation of the X Window System display server stewarded by the X.Org Foundation. Implementations of the client side of the protocol are available e.g. in the form of Xlib and XCB.
简单来说, xserver 是开源业界广泛使用的一套图形用户界面解决方案,特别的,是一种广泛使用、历史悠久的基础设施级别的一个跨硬件、跨硬件体系架构、跨操作系统平台、面向不同的图形化用户应用程序的整体解决方式。
(2) 这次重构的相关代码
=========================
这里只讨论一点,即 mi/miinitext.c 中的 InitExtensions 函数的实现。
这次重构并没有改变 InitExtensions 的在C语言中的“声明”,仍然是:
void
InitExtensions(argc, argv)
int argc;
char *argv[];
但是他们具体的实现方式改变了。在重构之前:
https://gitlab.freedesktop.org/xorg/xserver/-/blob/9508a382f8a9f241dab097d921b6d290c1c3a776/mi/miinitext.c#L153
在重构之后:
https://gitlab.freedesktop.org/xorg/xserver/-/blob/d568221710959cf7d783e6ff0fb80fb43a231124/mi/miinitext.c#L507
具体是这样子的:
① 在重构之前, void InitExtensions(argc, argv) 的函数本体主要大概是这个样子的:
```
InitExtensions(argc, argv) {
#ifdef Extension_A_MACRO
Extension_A_Init();
#endif
#ifdef Extension_B_MACRO
Extension_B_Init();
#endif
...
}
```
这是“指令序列”(A series of Order)
② 重构之后:
重构引入了一个静态化的结构体数组 staticExtensions :
```
static ExtensionModule staticExtensions[] = {
#ifdef Extension_A_MACRO
{ Extension_A_Init_FUNPTR, "Extension_A_Named", Extension_A_settings... },
#endif
#ifdef Extension_B_MACRO
{ Extension_B_Init_FUNPTR, "Extension_B_Named", Extension_A_settings... },
#endif
...
}
```
并且通过迭代这个数组来具体调用 Extension_α_Init 了:
```
void
InitExtensions(argc, argv)
int argc;
char *argv[];
{
int i;
ExtensionModule *ext;
static Bool listInitialised = FALSE;
if (!listInitialised) {
/* Add built-in extensions to the list. */
for (i = 0; staticExtensions[i].name; i++)
LoadExtension(&staticExtensions[i], TRUE);
/* Sort the extensions according the init dependencies. */
LoaderSortExtensions();
listInitialised = TRUE;
}
for (i = 0; ExtensionModuleList[i].name != NULL; i++) {
ext = &ExtensionModuleList[i];
if (ext->initFunc != NULL &&
(ext->disablePtr == NULL ||
(ext->disablePtr != NULL && !*ext->disablePtr))) {
(ext->initFunc)();
}
}
}
```
是不是有点“多态”、“封装”的感觉?
这种实现方式实际上是通过定义一个声明式的链表,然后通过将这个链表作为数据结构,然后建立算法。
(3) 一些结论
==============
-- 这次重构将指令序列改成了声明式链表及相关函数
-- 这次重构之后代码更长了,但可读性提高了,而且函数中的“过程”被转化为了“数据结构”
我认为这个重构非常切合 xserver 这样子的软件,极大地提高了其可维护性。
堪称一次史诗级的重构!
--
修改:darkk FROM 36.102.208.*
FROM 36.102.208.*
小朋友,我劝你谦虚一点
【 在 xieyf 的大作中提到: 】
: 无语,一把重构了了事,这点破事还整出一次“史诗级”重构
:
--
FROM 223.72.63.*
其实不能一概而论的。。
这里涉及到 xserver 的实现思路,总得来说他们好像是不断地扩充了“插件”的内涵,直到当年已经有一大堆了。。然后估计他们意识到性质变了,已经不是 hello windows, hello mac , hello linux 那种事了。。
a series of order 也有优点的,尤其是一些完整性是内聚的不能“扩展”的场合,保持 a series of order 甚至是正确性和算法可以结束的基础。(一时半会我也说不出来)
【 在 DoorWay 的大作中提到: 】
: 你说的对。
: 我也在尽量避免混淆,引用了其中一句,“将过程转化为数据结构”
: a series of order —> data structure (and the algorithm that operates them)
: ...................
--
FROM 223.72.63.*
这里是史诗级的重构的原因在于,这次重构标志着他们对 xserver 这样子一个项目的理解接近承认,其内部的功能已经被认为是清晰的(不然无法改成数据结构)
这跟那种一上来先搞一套“数据结构+算法”没有太大关系。主要的意义在于面向过程和面向对象的关系如何被把握,这个被把握的问题才是“史诗级”的前提。
简单来说,这里体现了一种深邃的辩证法,作为结果的代码的变革的背后的思想的变化才是我评价的关键,不是设计模式的“应用”的问题,而是“设计模式”的原理的问题。
--
FROM 223.72.63.*
反正我写不出来。。
源码有个文档的,感觉可以看一下……
由于需求已经梳理了,肯定比他们当年从0开始简单。。但是没有机器学习啥的,主要是熟悉各种硬件软件的接口,然后健壮性和兼容性怎么能搞好……
反正我现在做不出来……
跟设计模式没啥关系,就算知道全部设计模式了,也就是有了个框架,其他的不懂还是一行都写不了……
【 在 hgoldfish 的大作中提到: 】
: 弱问。重写一个 xserver 难吗?
:
附件(1012.7KB) 2508618--
FROM 223.72.63.*
这就是十八年前的代码啊 = = 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
【 在 alextooter 的大作中提到: 】
: 十几年前C项目里面也是这样写的。
: 这个很稀奇吗?当年一堆书介绍过这种写法,什么c oop, c interface之类的
--
FROM 36.102.208.*
这个说法有点问题……
应该是“都会抽象到涉及到数学群、对称、可分性、关系”这些数学上还在努力的概念……
Common Lisp 当然能够实现这些,但是其实在 feature positioning 上面 lisp 非常的乱的……
【 在 tgfbeta 的大作中提到: 】
: "格林斯潘第十定律"(Greenspun's Tenth Rule):
: "任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。"
:
--
FROM 36.102.208.*
没有没有,没有跟你说的东西比的意思。。
主要觉得对 xserver 这个项目来说,有标志性的意义……
【 在 DoorWay 的大作中提到: 】
: 你这个史诗级,是红军二万五千里的史诗,还是敏捷开发里的epic?
: 这个被把握的问题,是“Plugin”即插即用的架构设计吗?
: 没懂你为何这么拔高。
--
FROM 36.102.208.*
我的标题就说了这是18年前的一次重构!!
18年前!
18年前!
18年前!
18年前!
2003年的xserver的一次重构!
2003年的xserver的一次重构!
2003年的xserver的一次重构!
2003年的xserver的一次重构!
【 在 alextooter 的大作中提到: 】
: 所以没啥奇怪的,为什么你跟发现新大陆似的
: 这是很早以前的通用写法
--
FROM 36.102.208.*
Javascript 的 constructor 似乎应该视为已经冲破了 lisp 因为他重新定义了什么是“定义”
【 在 xiaoju 的大作中提到: 】
: 与时俱进版应该改成javascript
:
--
FROM 117.136.0.*