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

[复制链接]
呆板书生 发表于 2013-11-10 20:00 | 显示全部楼层
分层设计造成的开销增大和效率下降............吗?


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

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

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

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

评论

要少很多太对 至少一半。对于相对复杂一点的,代码越多,code越少。  发表于 2013-12-19 20:30
lirunze 发表于 2013-11-10 21:27 | 显示全部楼层
路过学习
 楼主| sedatefire 发表于 2013-11-11 11:39 | 显示全部楼层
呆板书生 发表于 2013-11-10 18:24
对于编译系统来说,只要是全局变量,不管你有没有写上 extern,一样是public,

understand?

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

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

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



评论

能加static的,可以不叫全局变量。  发表于 2013-12-19 20:31
 楼主| 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
杜绝任何其他模块的非法访问。
 楼主| sedatefire 发表于 2013-11-11 11:44 | 显示全部楼层
呆板书生 发表于 2013-11-10 20:00
楼主的分层设计原理是对的,分层只要做的好,就可以事半功倍,

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

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

呆板书生 发表于 2013-11-11 13:43 | 显示全部楼层
sedatefire 发表于 2013-11-11 11:44
分层的效果,在50个文件以下的项目看不出来效果的。
我目前在维护的案子,700+个文件,17万+ 行代码。
架 ...

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

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

我曾经试过,即使是一个最后编译完成后,代码量不到1k的小项目,我把它分成三层来设计,感觉非常很好。
呆板书生 发表于 2013-11-11 13:49 | 显示全部楼层
sedatefire 发表于 2013-11-11 11:39
感觉一口血郁在心中,难过得很。

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

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

这个我真的不懂,可能是编译系统设计的时候就故意留着这个漏洞
y651503148 发表于 2013-11-11 18:07 | 显示全部楼层
马克  占个座
czdo 发表于 2013-12-17 18:49 | 显示全部楼层
学习了!!!!
nixianmin 发表于 2013-12-19 15:26 | 显示全部楼层
躺枪,楼主介绍本书吧,C语言的教材没看到过文件的组织相关的内容,都太笼统
xlsbz 发表于 2013-12-19 20:39 | 显示全部楼层
sedatefire 发表于 2013-11-10 09:58
不过话说回来,我就是要赤果果地嘲笑。
嘲笑方能引人注意,才能有愤青按奈不住与我对骂,我才能度化更多 ...

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

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

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

当然如果全局变量 过多 这样似乎也不大合适
 楼主| 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;
}
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也是默许的。



 楼主| 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)
   }
..........
}

评论

这个批量数据传递 还是用断言比较好吧? 况且那个misra也说了 少用库里给的函数 自己从网上炒个也更靠谱  发表于 2013-12-20 01:05
 楼主| 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窥视/**写入。

评论

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

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

评论

多谢 哈哈  发表于 2013-12-20 00:49
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】
rocdove 发表于 2013-12-20 00:53 | 显示全部楼层
不错,等待中
rocdove 发表于 2013-12-20 01:00 | 显示全部楼层
学习
 楼主| sedatefire 发表于 2013-12-20 11:08 | 显示全部楼层
xlsbz 发表于 2013-12-20 00:48
我也乱讲几句

MDK

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

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部