[问题] 纯C下的结构化跟函数指标问题

楼主: icetofux   2019-02-19 23:12:27
开发平台(Platform): (Ex: Win10, Linux, ...)

编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
在纯C(目前编译器有支援到C99)的环境下,我试着以下述方式进行资料封装:
void DoorOpen(void) {
// ...
}
typedef struct {
void (*open)(void);
void (*close)(void);
} CAR_DOOR;
CAR_DOOR car_door = {
.open=,DoorOpen
.close=NULL,
}
typedef struct {
CAR_DOOR* door;
CAR_ENGINE* engine;
} CAR;
CAR car = {
.door=&car_door,
.engine=NULL
};
使用时就以下面的方式操作
car.door.open();
car.engine.enable();
优点:
1.使用时感觉比较结构化。
2.如果有另外一个主结构叫home,只要把car跟home放在不同的档案(.h/.c),
DoorOpen这类函式只要宣告成static,命名就可以相同,不用为了取名字烦
恼,或是把函式名字拉得很长。
缺点:
1.写起来有够麻烦。
2.door、engine都必须宣告出来,其他结构的指标才能指向它。
3.如上面例子中,CAR_ENGINE结构或是CAR_DOOR下的close函式我还没想到要怎么实现
前,如果只给NULL,不小心存取到会发生问题。
4.比起直接呼叫函式效率应该会差一些,不过在我的应用上这些差异可以忽略。
请问是不是有什么方法可以改善克服这些缺点,或是有更好的做法写出较具维护性的
code呢?
谢谢大家。
喂入的资料(Input):

预期的正确结果(Expected Output):

错误结果(Wrong Output):

程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)

补充说明(Supplement):
作者: Lipraxde (Lipraxde)   2019-02-20 00:19:00
研究一下C语言的历史,然后改用C++
作者: chuegou (chuegou)   2019-02-20 00:31:00
我好像有一篇是跟你有一样的困扰 你参考看看#1NPKqGmO (C_and_CPP)
作者: tjjh89017 (伊达政宗)   2019-02-20 02:15:00
你CAR那边可以考虑不用CAR_DOOR*,而直接用CAR_DOOR然后再搭配一些init function或是init macro应该可以解决你的问题
作者: IhateOGC (我讨厌)   2019-02-20 06:09:00
我会写init ,marco 几年后谁来维护手边十个bug还要花时间弄懂你写的对团队来说是地雷太多fuction根本不是问题,ide就解决了
作者: eye5002003 (下一夜)   2019-02-20 11:35:00
比起物件导向的思维,函数式(FP)的作风更适合C用C写OO只要一个结构配一堆函式就好了,想太多都是徒劳
作者: Lipraxde (Lipraxde)   2019-02-20 12:50:00
你在呼叫open, close ...的时候如果要指定哪个门或哪台科的门,最后还是要把指标传进去,C这样用真的会比较方便吗?
作者: loveme00835 (发箍)   2019-02-20 13:55:00
你先从 Abstract Data type (ADT) 去设计, 我发现很多书在教人写扣的时候都忽略抽象化这个观念, 先提供足够的抽象化, 其他封装什么的都是在这个前提下去作的, 方法各异. 简单的例子可以看 fopen/fclose 系列的挡案操作https://en.cppreference.com/w/c/io
作者: Neisseria (Neisseria)   2019-02-20 14:56:00
Stroustrup 博士曾经有类似的困扰,他最后做了新语言要不要考虑直接用他做的语言,还蛮多人用的认真回,把结构当 this 指标,永远摆在函式第一个参数
作者: descent (“雄辩是银,沉默是金”)   2019-02-20 17:50:00
所以才有 c++, 其他人写的也是这样, 不会有更好的写法了你的 open 还没有把 door * 传进去加上后, 会更冗长
作者: Neisseria (Neisseria)   2019-02-20 23:46:00
网络上找 C 语言 物件导向 有一些文章会展示手法本来就不是语言内建的东西,用一些概念去写得像 OO

Links booklink

Contact Us: admin [ a t ] ucptt.com