打印

一线研发之声 之 C程序的软件分层,看您躺枪没?

[复制链接]
楼主: sedatefire
手机看帖
扫描二维码
随时随地手机跟帖
101
呆板书生| | 2013-11-10 20:00 | 只看该作者 回帖奖励 |倒序浏览
分层设计造成的开销增大和效率下降............吗?


楼主的分层设计原理是对的,分层只要做的好,就可以事半功倍,

我做的项目,即使是 51 项目,一般来说都会分5-20个文件不等,上层调用下层,下层不调用上层,容量也没增大多少,

曾经几次接手过其他公司的项目过来的项目,人家是不分层,然后最后bug巨多,不得已,连源代码一起拿过来给我改写,

但我把他的代码重写,优化,最后编译的代码,反而比没有别人的分层的代码量少。

使用特权

评论回复
评论
xlsbz 2013-12-19 20:30 回复TA
要少很多太对 至少一半。对于相对复杂一点的,代码越多,code越少。 
102
lirunze| | 2013-11-10 21:27 | 只看该作者
路过学习

使用特权

评论回复
103
sedatefire|  楼主 | 2013-11-11 11:39 | 只看该作者
呆板书生 发表于 2013-11-10 18:24
对于编译系统来说,只要是全局变量,不管你有没有写上 extern,一样是public,

understand?

感觉一口血郁在心中,难过得很。

我追求的是,所有全局变量都是static的。
没有也无需任何的extern权限开放。

没有任何前缀的全局变量,对于任何“非同一个文件的使用者”来说,访问它就必须加extern才能访问。



使用特权

评论回复
评论
xlsbz 2013-12-19 20:31 回复TA
能加static的,可以不叫全局变量。 
104
sedatefire|  楼主 | 2013-11-11 11:41 | 只看该作者
呆板书生 发表于 2013-11-10 18:32
看来,不算傻

sys_para.lcd 这个参数本来就放在 lcd_module.c 文件里,你喜欢怎么移植就移植

说到点上了
我强调的是,
如果sys_para只在lcd.c里面使用
请作修改
1.  sys_para名字改成lcd_para
2.  xxx_para前面加static
杜绝任何其他模块的非法访问。

使用特权

评论回复
105
sedatefire|  楼主 | 2013-11-11 11:44 | 只看该作者
呆板书生 发表于 2013-11-10 20:00
楼主的分层设计原理是对的,分层只要做的好,就可以事半功倍,

我做的项目,即使是 51 项目,一般来说都 ...

分层的效果,在50个文件以下的项目看不出来效果的。
我目前在维护的案子,700+个文件,17万+ 行代码。
架构不合理的痛苦,天天都在忍受。

使用特权

评论回复
106
呆板书生| | 2013-11-11 13:43 | 只看该作者
sedatefire 发表于 2013-11-11 11:44
分层的效果,在50个文件以下的项目看不出来效果的。
我目前在维护的案子,700+个文件,17万+ 行代码。
架 ...

勿以小善而不为,勿以小恶而为之,

不管项目大小,不按照分层原则去设计软件,最终都是自吃其果。

我曾经试过,即使是一个最后编译完成后,代码量不到1k的小项目,我把它分成三层来设计,感觉非常很好。

使用特权

评论回复
107
呆板书生| | 2013-11-11 13:49 | 只看该作者
sedatefire 发表于 2013-11-11 11:39
感觉一口血郁在心中,难过得很。

我追求的是,所有全局变量都是static的。

所有全局变量都是static的..................吗?

这个我真的不懂,可能是编译系统设计的时候就故意留着这个漏洞

使用特权

评论回复
108
y651503148| | 2013-11-11 18:07 | 只看该作者
马克  占个座

使用特权

评论回复
109
czdo| | 2013-12-17 18:49 | 只看该作者
学习了!!!!

使用特权

评论回复
110
nixianmin| | 2013-12-19 15:26 | 只看该作者
躺枪,楼主介绍本书吧,C语言的教材没看到过文件的组织相关的内容,都太笼统

使用特权

评论回复
111
xlsbz| | 2013-12-19 20:39 | 只看该作者
sedatefire 发表于 2013-11-10 09:58
不过话说回来,我就是要赤果果地嘲笑。
嘲笑方能引人注意,才能有愤青按奈不住与我对骂,我才能度化更多 ...

外部C文件引用的全局变量 不都放  global.h 放哪?

难道放到单独C文件对应的  。h

我放global 可以清楚的看到 整个工程 开放了几个全局变量 统一维护

当然如果全局变量 过多 这样似乎也不大合适

使用特权

评论回复
112
sedatefire|  楼主 | 2013-12-19 23:06 | 只看该作者
xlsbz 发表于 2013-12-19 20:39
外部C文件引用的全局变量 不都放  global.h 放哪?

难道放到单独C文件对应的  。h

透过函数,可以把所有extern出来的全局变量,都搞成static的。
缩小影响范围、锁住写权限。
也引发思考,是否有必要透过全局变量跨模块传递参数?
static int modue_state;
int  read_module_state(void)
{
     return modue_state;
}

使用特权

评论回复
113
xlsbz| | 2013-12-20 00:28 | 只看该作者
sedatefire 发表于 2013-12-19 23:06
透过函数,可以把所有extern出来的全局变量,都搞成static的。
缩小影响范围、锁住写权限。
也引发思考, ...

单个全局变量只读的,我就是用返回函数。
但是全局数组需要在别的C文件写的话似乎也没什么好的方法?
难道还加曾壳?
void 加壳(i,value) {
     全局(j,value)

这就有点多余。

另外MDK,
一个文件定义
INT8U  kk【100】
另一个文件若只用到读
那么
const INT8U KK[100] 这个MDK也是默许的。



使用特权

评论回复
114
sedatefire|  楼主 | 2013-12-20 00:42 | 只看该作者
xlsbz 发表于 2013-12-20 00:28
单个全局变量只读的,我就是用返回函数。
但是全局数组需要在别的C文件写的话似乎也没什么好的方法?
难 ...

全局数组需要在别的C文件写的话?
那就要反思,大概架构不合理,分层不清晰。
而且我估计你也没做数组越界保护。
如果你全局数组跨模块,就要处处做冗余的数组越界判断,总有疏忽的。
不如
void  send_dat_to_xx_module(char *dat,  uint_fast8_t len)
{
   if (len < sizeof(glabl_array))
   {
         memcpy(glabl_array, dat, len)
   }
..........
}

使用特权

评论回复
评论
xlsbz 2013-12-20 01:05 回复TA
这个批量数据传递 还是用断言比较好吧? 况且那个misra也说了 少用库里给的函数 自己从网上炒个也更靠谱 
115
sedatefire|  楼主 | 2013-12-20 00:44 | 只看该作者
xlsbz 发表于 2013-12-20 00:28
单个全局变量只读的,我就是用返回函数。
但是全局数组需要在别的C文件写的话似乎也没什么好的方法?
难 ...

INT8U  kk【100】
另一个文件若只用到读
那么
const INT8U KK[100] 这个MDK也是默许的。
你应该写错了,const--> extern

是的,但只要加static
static INT8U  kk【100】
就再也不用担心其他模块的extern窥视/**写入。

使用特权

评论回复
评论
xlsbz 2013-12-20 01:08 回复TA
没错。extern const INT8U KK[100]. 虽然这个改变了变量的属性 ,与misra相违背。但也不是不可取 
116
sedatefire|  楼主 | 2013-12-20 00:48 | 只看该作者
xlsbz 发表于 2013-12-20 00:28
单个全局变量只读的,我就是用返回函数。
但是全局数组需要在别的C文件写的话似乎也没什么好的方法?
难 ...

新写了个**,沙发送给你
https://bbs.21ic.com/blog-567930-114688.html

使用特权

评论回复
评论
xlsbz 2013-12-20 00:49 回复TA
多谢 哈哈 
117
xlsbz| | 2013-12-20 00:48 | 只看该作者
sedatefire 发表于 2013-12-20 00:42
全局数组需要在别的C文件写的话?
那就要反思,大概架构不合理,分层不清晰。
而且我估计你也没做数组越 ...

我也乱讲几句

MDK
定义INT8U  KK[100]

如果
你用了KK[101]
那么编译器给警告。
但是如果KK[I++] 这种越界的不警告。
第二 sizeof 本身这玩意就不靠谱

如果 extern  KK【】
siziof(KK)出错
必须 extern KK【101】

使用特权

评论回复
118
rocdove| | 2013-12-20 00:53 | 只看该作者
不错,等待中

使用特权

评论回复
119
rocdove| | 2013-12-20 01:00 | 只看该作者
学习

使用特权

评论回复
120
sedatefire|  楼主 | 2013-12-20 11:08 | 只看该作者
xlsbz 发表于 2013-12-20 00:48
我也乱讲几句

MDK

你可能还没明白我的意思,我的理念是:
从编译角度上,绝不给任何模块,透过extern篡改我模块内全局变量的机会。
换言之,我坚决抵制extern + 变量名的做法。
任何!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则