模块化和OO有什么不同

脚趾尾拉西 发布于 2013/12/15 02:10
阅读 1K+
收藏 3
OO

如题。本人第一次发问,有什么问题请高手们指教

例子代码是OO还是模块?

// main.c

#include "qwe.h"

int main(...)
{
    if (qwe_init() < 0)
        log && return -1;

    if (qwe_run() < 0)
        log && return -2;

    qwe_uninit();
}



// qwe.h

struct qwe_context_t
{
    int x;
};

extern qwe_context_t g_ctx;

int qwe_init(void);
void qwe_uninit(void);
int qwe_run(void);
// qwe.c

#include "qwe-rec.h"

struct qwe_context_t g_ctx;

int qwe_init(void)
{
   if (qwe_rec_init() < 0)
       log && return -1;
   return 0;
}

void qwe_uninit(void)
{
   qwe_rec_uninit();
}

int qwe_run(void)
{
    if (qwe_rec_run() < 0)
       log && return -1;
    event_loop();
    return 0;
}
// qwe-rec.h
int qwe_rec_init(void); void qwe_rec_uninit(void);
int qwe_rec_run(void);
// qwe-rec.c

struct pri_t
{
    int a;
    int b;
};

struct pri_t pri;

int qwe_rec_init(void)
{
   pri.a = 1;
   return 0; 
}

void qwe_rec_uninit(void)
{
   pri.a = 0;
}

int qwe_rec_run(void)
{
    source_attach();
    return 0;
}

@宏哥

@中山野鬼

加载中
0
gvim
gvim

挺清楚啊,模块化针对功能,OO针对领域。比如文件系统可以分出很多功能,打开,关闭,搜索,这属于一个文件系统的功能,或者说接口,那么一个系统里面你能说最多只有2个文件系统吗?不能。因此非稳定的是文件系统的种类、实现和内部组织,也就是说的变化的,而稳定的是文件系统的操作或接口。如 @中山野鬼 说的操作系统内核用OO的设计无能为力其实是有误的,至少linux里面的具体文件系统功能上是分模块,但文件系统的设计和实现上是用的OO的方法(这里不是说linux用的某具体OOP来实现)。

模块和OO不冲突,前者是功能组织,后者是模型组织。

0
开源无憾
开源无憾
利用OO实现的模块化只是模块化实现方法中的一种
0
pantrick
pantrick
利用oo实现模块化是现有模块化技术思想中最优秀的一种!
0
lcl
lcl
你给出的例子是典型的C程序模块化的的设计方法,楼上说的很对,如果用C++实现 模块化、组件化是OO实现比较好的一些方式。
0
南湖船老大
南湖船老大

语死早。

你这好比问,专家和禽兽有什么区别。。专家本来就是禽兽的一种,OO也是一种模块化的方式。

干嘛非要对立起来,嗯,肯定是受一些OSC的只会面向过程的喷子的影响导致的。那些喷子就这样,使劲黑OO,大谈特谈他们眼中的模块化,非要把模块化说成是他们家的

南湖船老大
南湖船老大
回复 @jie----sdf : 因为他们是喷子
脚趾尾拉西
脚趾尾拉西
我的理解是模块化本身也包含OO的概念,但是看了OSC里的人对于OO的看法之后,我就想问一下他们把OO那么的痛骂,那对于模块化的理解是怎么样的?
0
gvim
gvim

模块化和OO在软件工程中的最大交集是复用,区别是模块化针对的是功能复用,OO针对的是模型复用。模块化面向的是稳定状态下功能的积累,OO面向的是非稳定状态下业务模型的积累。目前不少地方,不少人并不十分清楚OO应该怎么用,因此一概以OO来处理,自然费事费精力,包括一些语言也走这种的极端。

不少人只知道某几样OOP的浅显语法,比如C++,然则到处喷OO,这属于见识问题。

脚趾尾拉西
脚趾尾拉西
模块化面向的是稳定状态下功能的积累,OO面向的是非稳定状态下业务模型的积累 还不太明白,能详细说下吗?
0
中山野鬼
中山野鬼

哈,如果谈oo所对立的模块化,还是有区别的。谈不上谁先进,谁落后,如果认为oo是所谓更优的设计方法,在面对一些问题是,基本就无力了,例如操作系统的内核,数据库的内核,一些编解码器底层内核,包括很多算法以及设备驱动等等。反过来,oo所对立的模块化再应付特别是桌面对象设计时,也是很无能。oo的推广,实际和桌面系统的推广密切相关。

如果 形象的做描述,oo和模块化的差异在于,一个是围绕对象的设计,一个是围绕功能的设计。比如一个下水管道,一个自来水龙头,一个发动机,他们是功能型的,这个非常适合模块化。实际他们的工作,还依赖中间灌入的数据,和水管中的水一样。但这些数据并不是模块本身。这类设计,使用oo强制将数据的存储空间以及和目标功能无关的操作绑定一起形成oo的建模,就会猥琐很多。而另一方面,典型的例子,如3d游戏中每个独立的空间对象,这个是围绕对象的设计,你强制将数据和其上特有的操作割裂开,也只会增加你程序设计的麻烦。

其实oo和模块化,核心是在上面,无非很多系统不是绝对oo和模块化的,自然对自己不足的地方做了些补充。一个比较简单的判定方法是,如果按照人的思维来思考系统设计,那么就用面向对象处理比较合适,如果按照机器的运行原理来思考系统设计,那么用模块化比较合适。

0
中山野鬼
中山野鬼

引用来自“gvim”的答案

挺清楚啊,模块化针对功能,OO针对领域。比如文件系统可以分出很多功能,打开,关闭,搜索,这属于一个文件系统的功能,或者说接口,那么一个系统里面你能说最多只有2个文件系统吗?不能。因此非稳定的是文件系统的种类、实现和内部组织,也就是说的变化的,而稳定的是文件系统的操作或接口。如 @中山野鬼 说的操作系统内核用OO的设计无能为力其实是有误的,至少linux里面的具体文件系统功能上是分模块,但文件系统的设计和实现上是用的OO的方法(这里不是说linux用的某具体OOP来实现)。

模块和OO不冲突,前者是功能组织,后者是模型组织。

哈,这个要怎么看了。单纯的文件系统模型设计,这个本身有对象的概念。并非说模块化就没有对象。但从系统设计,或更明确的,指导具体实现的设计而言,本身不是oo的。我的理解,不能因为存在对象的概念就属于oo,oo里面有很大内容在研究和解决类与类、对象与对象的关联,从属等问题,如同模块化设计中,更多在关注模块之间依赖,调用,互动等问题。你说的文件系统的设计和实现,可以说是对象建模的思想,但我还是不认可是oo的思想。简单说,存在对象的概念的设计方法不代表就是oo了。哈。要看设计重点解决什么问题?貌似文件系统不是解决不同类型文件对象之间的问题。
gvim
gvim
你说的东西,只是分歧在怎么才是面向,怎么才算是思想,比较看到最后的都是代码,其它的我是比较认可的。
0
gvim
gvim

引用来自“中山野鬼”的答案

引用来自“gvim”的答案

挺清楚啊,模块化针对功能,OO针对领域。比如文件系统可以分出很多功能,打开,关闭,搜索,这属于一个文件系统的功能,或者说接口,那么一个系统里面你能说最多只有2个文件系统吗?不能。因此非稳定的是文件系统的种类、实现和内部组织,也就是说的变化的,而稳定的是文件系统的操作或接口。如 @中山野鬼 说的操作系统内核用OO的设计无能为力其实是有误的,至少linux里面的具体文件系统功能上是分模块,但文件系统的设计和实现上是用的OO的方法(这里不是说linux用的某具体OOP来实现)。

模块和OO不冲突,前者是功能组织,后者是模型组织。

哈,这个要怎么看了。单纯的文件系统模型设计,这个本身有对象的概念。并非说模块化就没有对象。但从系统设计,或更明确的,指导具体实现的设计而言,本身不是oo的。我的理解,不能因为存在对象的概念就属于oo,oo里面有很大内容在研究和解决类与类、对象与对象的关联,从属等问题,如同模块化设计中,更多在关注模块之间依赖,调用,互动等问题。你说的文件系统的设计和实现,可以说是对象建模的思想,但我还是不认可是oo的思想。简单说,存在对象的概念的设计方法不代表就是oo了。哈。要看设计重点解决什么问题?貌似文件系统不是解决不同类型文件对象之间的问题。

你的意思就是fs是对象,但是没面向是吧?好吧,看文字描述是没有“解决类与类、对象与对象的关联,从属等问题”的就不是面向吧。linux里 ext2和ext3大家都知道是“父子”关系,ext3里直接复用了不少ext2的代码,FreeBSD kernel里面的ufs,直接复用了lfs不少实现,因为他们也是“父子”。打印号是因为他们没有继承语法,只是逻辑和实现上是父子。这里说的复用不是说拷贝,也不是oop隐式的功能调用,而直接的功能调用。vfs作为抽象基类存在,xfs,jfs作为具体类,当具体类没有实现的时候,可以使用父类的功能,当然也可以接过来直接报ENOSUPP。如果把vfs看作抽象类,ext2作为实现,ext3作为ext2的子类,也就不难看出他们之间的关联和从属吧。面向对象除去OOP好归类之外,OO的设计,思想,建模,都是仁者见仁的东西,因此才会出现重构这一过程。正是由于OO的个人角度,导致不少人看着OOP的面评价OOAD的短见所在,因为这些人只会用封装,多态,继承来框看某东西能不能框进去,也包括一些人自以为知道了OOP的底层实现就到处喷,没错,Linux就是用的这一套手段来部分的支持OOP。。。通过一个局部来否认全局,只能说见识少,呵呵。

乌龟壳
乌龟壳
只要把“一切都是对象”排除掉,包括因此而造成的一些不必要的复杂性给排除掉,面向对象的很多东西是很有用的——但是不得不说,也是显而易见的,很简单的原理。“面向对象设计模式”之所以成为某些程序员中的一门课的负担,就是因为“一切都是对象”导致的很多设计问题解决起来凭空增加复杂性。
乌龟壳
乌龟壳
为什么现在java、c++、c#都逐渐支持闭包了?因为可传递函数+闭包的方便性,它的效果是“避免面向对象设计模式”。
乌龟壳
乌龟壳
代码复用,划分、抽象,这都是显而易见的设计思路,面向对象把这些很多概念也都纳进来了,但是又添加了一些“一切都是对象”的邪说。一般反对OO的是反对显而易见的设计思路以外的部分——那些在java/C++中发挥到极致的,因为“一切都是对象”而使得语言不去支持函数变量和闭包而产生的“巧妙”的“面向对象设计模式”才是要被唾弃的。
0
宏哥
宏哥

一个O 没有问题

两个O 就有问题

过去, 现在已经证明

将来 也继续证明

返回顶部
顶部