Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38858
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 634
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-05 07:57
个人简介

天道酬勤。。。

文章分类
文章存档

2015年(4)

我的朋友

分类: C/C++

2015-09-06 16:18:40

编程的永恒追求:时间开销、空间开销,对于程序员来说追求极致没有问题,但在实际项目中往往做一定的取舍,进行折中。
编程的过程其实是组件设计或者利用现有组件的过程,如果有直接拿来可用的,在时空开销都能满足的情况下,拿来主义就很好,如果不能满足,便需要自行定制。这里组件在不同的语言,不同的粒度下,都有对应的体现。
下面以c语言简单的接口函数为例,找出一个数组中第二大的整数。
// 接口设计,为避免修改数组内部数据,应为data进行const修饰
int findSecondBiggerNum(const int data[], int len) {
   if(NULL == data || len < 2) {
       return -1; // need take more effort, which will be mixed with found bigger num -1
   }
   int bigger = biggest = data[0], i;
   for(i = 1; i  < len; ++i) {
       if(data[i] > biggest) {
           bigger = biggest;
           biggest = data[i];
       } else {
           if(data[i] > bigger) {
               bigger = data[i];
           }
       }
   }
   if(bigger == biggest)  { // which means all elem equal
       return -1; // need take effort
   } 
   return bigger;
}  
接口是给别人用的,不同的人调用的方式可能千差万别,尽可能多的涵盖每种条件,不要对调用者做过多的假设。
接口的完完备性:在正常满足需求的前提下,函数原型的合理性与功能实现的全面性。

软件的复用,封闭式复用,开放式复用,所谓封闭就是在一个相对狭小的范畴内,team内,部门内部,相对的开放式可能会被世界范围内任何一个人使用,这中间的差别就要求对接口或者类的设计的要求,以下从几个方向阐述如何设计完备类,如有纰漏,望补漏。
与c相比c++提供了强大的类型系统,自己设计的类型与内置类型得到了同样的支持,甚至得到了加强。

class User
{
    ...
    string GetName();
    void AddFriend(User& newFriend);
private:
    typedef vector UserCont;
    UserCont friends_;
    UserDatabase* pDB_;
};
void User::AddFriend(User& newFriend)
{
    // Add the new friend to the database
    pDB_->AddFriend(GetName(), newFriend.GetName());
    // Add the new friend to the vector of friends
    friends_.push_back(&newFriend);
}
实现异常安全的代码,上述AddFriend的两条语句都会抛出异常,一种解决方案:
class VectorInserter
{
public:
    VectorInserter(std::vector& v, User& u)
    : container_(v), commit_(false)
    {
        container_.push_back(&u);
    }
    void Commit() throw()
    {
        commit_ = true;
    }
阅读(1185) | 评论(0) | 转发(1) |
0

上一篇:编程点滴(一)

下一篇:编程点滴(二)

给主人留下些什么吧!~~