存档

文章标签 ‘程序’

谈谈程序的封装

2011年12月11日 4 条评论

近半年来,团队加入了不少新同学,陆陆续续也看过不少新同学写的代码,一个比较大的感受是,新同学程序的逻辑上问题不会太大,但是代码的封装方面,还是有明显的不足。具体主要包括以下几个方面,一是命名,包括类、函数、变量等的,一个好的名字,可以让读程序的人一看到它就大概知道它是做什么用的;二是函数、类的划分,哪些实体应该抽象为一个类,这个实体的那些功能该抽象成函数,这是程序设计中最为重要的内容;三是线程安全,在多线程环境下,线程安全是一个很重要的话题,很多时候因为封装的不合理,导致使用上的不方便,更为严重的是造成死锁等的问题。下面就分别从这三个方面,谈一些自己的看法,希望能够对初入职场的新同学有所帮助。

第一个方面是命名,这个是最为基本的内容。可以这样讲,把写程序比做写文章,命名对于程序的作用,就相当于措词对于文章,好的措词对于一篇好的文章的作用,不用我再多说。关于程序中的命名,主要包括三种,一是类型名,二是函数名,三是变量名。类型名在C++中应对的包括class, struct, enum等,它们都是抽象出来的一个实体,因此它们的名字最好是一个名词,或者名词词组,比如PCManager,它是一个PC管理器类型。 阅读全文…

谈谈程序的可扩展性

2011年7月30日 5 条评论

光阴如棱,写程序也有好几个年头了。几年来,写过不少程序,也读过不少别人写的代码,各种各样、形形色色的都有。刚开始写程序的人,大都是以完成任务为主,以结果为导向的,很少会注重程序,或者说代码本身。随着写过、读过的程序越来越多,对写程序的人来说,完成任务、实现当前功能不是唯一的目标了,如何能在完成当前任务的同时,考虑一下,如果后面还会有其它的需求的话,我们现在的程序能不能在尽量不修改现有代码的前提下,通过增加一些新的代码,来实现需求、完成任务。这就是所谓程序的“可扩展性”。

为了帮助大家更好的理解,下面看一个例子,来实实在在的体会一下程序的可扩展性。这里首先给出需求:实现一个HtmlParser, 提供解析出页面里所有img链接的功能。

  • 1. 先来看看大家最容易想到的一种实现:
  • 阅读全文…

    分类: 程序人生 标签: , ,

    手把手教你玩转GDB(三)——常用命令

    2010年8月30日 9 条评论

    本文是手把手教你玩转GDB的第三篇,主要内容是介绍一些在程序调试过程中最常用的GDB命令,废话不多话,开始今天的正题。
    1.attach process-id/detach

  • (1)attach process-id: 在GDB状态下,开始调试一个正在运行的进程,其进程ID为process-id
  • (2)detach: 停止调试当前正在调试有进程,与attach配对试用
  • 2.kill

  • (1)基本功能:杀掉当前GDB正在调试的应用程序所对应的子进程
  • (2)如果想不退出GDB而对当前正在调试的应用程序重新编译、链接,可以在GDB中执行kill杀掉子进程,等编译、链接完后,再重新执行run,GDB便可加载新的可执行程序启动调试
  • 3.多线程程序调试相关:

  • (1)thread threadno:切换当前线程到由threadno指定的线程
  • (2)info threads:查看GDB当前调试的程序的各个线程的相关信息
  • (3)thread apply [threadno] [all] args:对指定(或所有)的线程执行由args指定的命令
  • 4.多进程程序调试相关(fork/vfork): 阅读全文…

    介绍几个关于C/C++程序调试的函数

    2010年5月6日 13 条评论

    最近调试程序学到的几个挺有用的函数,分享一下,希望对用C/C++的朋友有所帮助!

    1. 调用栈系列
    下面是函数原型:

    1
    2
    3
    4
    
    #include "execinfo .h"
    int backtrace(void **buffer, int size);
    char **backtrace_symbols(void *const *buffer, int size);
    void backtrace_symbols_fd(void *const *buffer, int size, int fd);

    接下来,对上面三个函数进行介绍:
    (1)backtrace用来获得当前程序的调用栈,把结果存在buffer中。通常,我们用gdb调试程序,设置合适的断点,停下来之后,用backtrace(bt)命令,就可以看到当前的调用栈。但是,有的时候,用到条件断点的时候,gdb的功能就没有程序本身的强大了,这个时候,可以考虑在程序中调用backtrace函数,来获取调用栈。
    (2)backtrace_symbols把用backtrace获取的调用栈转换成字符串数组,以字符串数组的形式返回,使用者需要在外面释放返回的字符串数组所占用的内存
    (3)backtrace_symbols_fd把用backtrace获取的调用栈信息写到fd所指定的文件中 阅读全文…

    分类: 程序人生 标签: , , , , ,

    由SIGPIPE导致程序退出想到的

    2009年7月24日 没有评论

    这几天在写一个发送快照的客户端,写好后测试。刚开始,启动服务端,客户端启动,开始发送快照页面。观察数据,结果,一切正常。基本功能实现了。今天早上,想到如果服务端关闭,客户端的状态会怎么样呢?产生了这个想法,就马上来try一下,结果客户端程序直接退出了,也没有产生core dump文件。很诡异! 于是gdb之,发现是产生了信号SIGPIPE,恩这下明白了。 阅读全文…