Codejie's C++ Space

Using C++

随笔:对象思想 VS. 过程思想


    下面是昨天和同事讨论一个函数了的实现时的对话。(为了简化,减去了其中我由于‘着急上火’而导致‘高音’部分的言语...) 
  
    C(同事):现在需要由你提供一个Sample()函数。
    J(我):OK,功能是否是为了完成必要的数据采集工作?
    C: 是的,最终数据要放到文件中。 
    J: 放到文件中?那是当然。但你的意思是整个Sample()都要我这边的代码实现吗?
    C: 当然,你应该会写文件吧? 
    J: 等等,不是会不会写的问题,而是文件要我来写吗?现在的分工上是否是我负责数据处理,你完成流程调度?
    C: 有什么数据、流程之分吗,我们写的是一个程序啊。如果你非要区分一下,那应该是这样的。
    J: 那你看文件存储和数据处理有什么关系吗?
    C: 数据最终不是要放到文件中吗?你数据获取后,保存到文件中,这有什么不对吗?
    J: 你没有发现有什么没考虑的问题吗?像是要保存的文件名称我这边怎么知道?具体数据该如何存储?
    C: 文件名称在调用是我会传给你的,需要什么都会传给你的了;至于存储,按照现在的规范,字符串格式!
    J: 都传过来?你确信以后不会被改成二进制方式存储吗?好吧,先说说你想Sample()该如何实现吧?
    C: 不用考虑二进制了,再说如果改了,我们到时跟着改就是了。好,你看,我想应该这样做,先Open个文件,然后获取数据的结果,变成字符串保存到文件中,然后Cose。很清晰的过程,是吧? 
    int Sample()
    
{
        OpenFile();
        
        str 
= GetResult();
        Save(str);
        
        CloseFile();        
    }

    J: OK, 你看这些代码跟我现在实现的数据部分有多少关系?而且我们的‘数据’的Result并不都是string类型,而且已经为不同的Result都定义了相应类型了,难道这里你要GetResult都转换为string吗?要是那天存储改为二进制了,我们来改GetResult()吗?而且这个Save()接口参数也要改,是吧?
    C: 如果需要改,我们跟着改就是了,这不是问题。
    J: 是的,改不是问题,但改多改少,和改动的影响的大小应该是问题吧?最主要的一个问题是,这样的过程将数据和存储紧紧耦合在一起了。这种做法对于分解工作很不利的。
    C: 我并没有觉得有什么不妥,你打算如何做?
    J: 首选我们看一下,你需要的是File,Result(数据)和Save三个部分代码,是吧?我们能看出Result是数据部分的操作,而File,Save两部分是流程上的操作,把这样的代码都加到‘数据’部分去,是不是有些乱?要不把GetResult()加到‘流程’部分?
    J: 其次,简单地举个列子说,如果有需求要我们获得Result后,不保存到文件,而只是显示在屏幕上,那么对于这种需要,我们要再写个GetResult()函数吧?
    J: 你看,如果涉及Sample()的修改,我们需要修改的地方涉及太多功能块了。所以根据功能的不同,分离这些函数是必要的。Sample()不应该能过作为一个‘原子’操作,提供出去,应该把它分解开。 在分解功能时,或者设计函数时,应该是功能该是什么样子的,就按照什么样子去做,做自己能做的和该做的,而不是为了问了迎合另一个功能的需求而改变自己;功能间的连接我们可以通过传递结果或者添加‘适配器’等等方法。
    int Sample()
    
{
        Result 
= GetResult();
        
        ResultProc(Result);    
    }

    
    
int ResultProc(filename, result)
    
{
        str 
= ResultToStr(result);
        OpenFile(filename);
        Save(str);
        CloseFile();
    }

    J: 因此,look,Sample()不是我们需要的,我们需要的是GetResult()和ResuoltToStr(), 而Sample()只是对它们的再封装而已。如果发生前面说到的更改需求,GetResult()就不用动了。所以,数据处理是我这边要做的,而写文件。。。。是吧?


<----- 吐血的分割线 ---->
 
    C: 写到了再说。。。

posted on 2009-11-27 16:27 codejie 阅读(179) 评论(2)  编辑 收藏 引用 所属分类: 随笔而已

评论

# re: 随笔:对象思想 VS. 过程思想 2009-11-27 17:37 OwnWaterloo

感觉…… 有点文不对题……
文中的重点在于一个函数应该只完成一件事情。
这"一件事情"如何定义…… 可能把它说成"一个需求"更恰当。

一个函数应该只实现一个需求,这个需求一个整体的,要么不变,要么整体改变,不会只变一部分。
目的还是在于能更好的应对需求变化。


这跟"过程" vs "对象"没什么关系吧?

  回复  更多评论   

# re: 随笔:对象思想 VS. 过程思想[未登录] 2009-11-28 17:52 codejie

@OwnWaterloo
恩,说的不错,只是起这个标题是有些背景的。。。
前些时候,本来由于工作环境中碰到的一些事情,我想写个系列东东,叫做“如何设计”,后来想想自己还没有到那么高的水平,告诉别人该如何做设计,也就没有去写。后来的这个跟同事的讨论,让我很“上火”,觉得做设计和做一件工艺品一样,是一件技术和艺术相结合的工作,怎么能“凑合”呢?这种思想让我很“气愤”啊。。。
“过程”和“对象”本身没有可比性,两者都只是设计的手段,也都能作出好的设计,名字来由只是同事说我是C++的,而C的设计是没有对象的,都是过程的(这个思想就很“怪异”),所以才有这要的标题。当然设计和语言是没有关系的,这里只是“引用”了一下。。。
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜