分类: 软件开发 |
预览模式: 普通 | 列表

十条不错的编程观点

1) The only “best practice” you should be using all the time is “Use Your Brain”.

唯一的“Best Practice”并不是使用各种各样被前人总结过的各种设计方法、模式,框架,那些著名的方法、模式、框架只代码赞同他们的人多,并不代表他们适合你,你应该更多的去使用你的大脑,独立地思考那些方法、模式、框架出现的原因和其背后的想法和思想,那才是“best practice”。事实上来说,那些所谓的“Best Practice”只不过是限制那些糟糕的程序员们的破坏力。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 208

strcpy ,strncpy ,strlcpy的用法

1. strcpy

我们知道,strcpy 是依据 \0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9):

程序代码 程序代码

char *
strcpy(char *to, const char *from)
{
char *save = to;

for (; (*to = *from) != '\0'; ++from, ++to);
return(save);
}

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 202

Subversion与CVS的对比

一、Subversion包含绝大部分CVS功能

Subversion 作为CVS 的重写版和改进版,其目标就是作为一个更好的版本控制软件,取代目前流行的CVS。Subversion 的主要开发人员都是业界知名的CVS 专家。Subversion支持绝大部分的CVS 功能/命令;Subversion 的命令风格和界面也与CVS 非常接近。当然,不同的地方正是对CVS 的改进。

二、全局性的版本编号

一个新的版本,并得到一个自增量的版本号N+1,该版本号并不针对某个特定的文件,而是全局性的、针对整个版本库的。因此,我们可以将Subversion 的版本库看作是一个文件系统或文件目录树的数组。

从技术的角度来说,在Subversion 中,“文件foo.c 的第5 版本”这个说法是错误的;正确的说法应该是:”文件foo.c 在版本库被修改了5 次,即执行5 次commit 后是什么样子?”。显然,在Subversion 中,版本库被修改5 次后foo.c 的内容,和被修改了6 次后foo.c 的内容很可能完全一样,因为版本库的第6 次修改很可能只修改了版本库的其他部分,而并没有对foo.c 的进行修改。相反,在CVS 中,文件foo.c 的第1.1 版本和第1.2 版本总是不同的。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 152

软件可靠性工程述评

1 软件危机

随着计算机技术迅猛发展,软件的销售量和使用量呈几何级数增长,软件的规模也越来越大,复杂性急剧提高。例如,航天飞机的飞行软件达50万行源代码,F-22战斗机更达150多万行源代码,软件失效已成为系统瘫痪的主要原因。根据美国国防部和NASA的统计,当今武器系统和航天项目中的软件可靠性比硬件系统大约低一个数量级。因软件故障而造成的重大事故也不乏其例,如F-18战斗机在海湾战争中,飞行控制软件共发生了500多次故障,爱国者导弹因软件问题误伤了28名美国士兵;阿里安5型火箭的发动机控制系统软件的错误导致飞行试验失败等。软件危机使得软件可靠性研究在国际上十分活跃。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 155

写出漂亮代码的七种方法

1, 尽快结束 if语句

例如下面这个JavaScript语句,看起来就很恐怖:
程序代码 程序代码

function findShape(flags, point, attribute, list) {
    if(!findShapePoints(flags, point, attribute)) {
        if(!doFindShapePoints(flags, point, attribute)) {
            if(!findInShape(flags, point, attribute)) {
                if(!findFromGuide(flags,point) {
                    if(list.count() > 0 && flags == 1) {
                          doSomething();
                    }
                }
            }
       }
    }  
  }

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 152

Java异常

转自:http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html

六种异常处理的陋习

你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗?

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 314

记住这张图

使用svn以后,电脑变慢。

估计是这里的问题。。

具体操作步骤如下:

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 354

VC time事件

Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。
1、SetTimer定义在那里?

SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 462

有关耦合

非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的
数据耦合:一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。
标记耦合:一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。
控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。
外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 460

序列化

原贴:http://baike.baidu.com/view/160029.htm
序列化 (serialization)
  将对象的状态信息转换为可以存储或传输的窗体的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
  序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Intranet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。
  通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 461

线程

原贴:http://baike.baidu.com/view/1053.htm
    线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
  线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
  线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU
  线程的周期

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 388

进程

原贴:http://baike.baidu.com/view/19746.htm
    对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。
  进程是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。是可并发执行的程序。在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径或任务,它有两方面性质:活动性、并发性。进程可以划分为运行、阻塞、就绪三种状态,并随一定条件而相互转化:就绪--运行,运行--阻塞,阻塞--就绪。
  进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。
  进程为应用程序的运行实例,是应用程序的一次动态执行。看似高深,我们可以简单地理解为:它是操作系统当前运行的执行程序。在系统当前运行的执行程序里包括:系统管理计算机个体和完成各种操作所必需的程序;用户开启、执行的额外程序,当然也包括用户不知道,而自动运行的非法程序(它们就有可能是病毒程序)。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 397

多进程与多线程

进程是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

如果系统采用分布式架构设计,多半是多进程了。可以考虑进程与线程混合模式。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 447

四种软件商业模式的分析

转自:http://news.csdn.net/n/20090326/124484.html
其实不只是在中国,在美国的一些软件先驱也认为软件这样收费是不合理的,他们认为软件应该把代码开放给所有人,不应该靠软件使用许可挣钱,软件公司应该靠对软件的服务挣钱,比如你可以免费使用我们的软件,当你需要自动升级服务的时候,需要向我们付费。SaaS可以说是更加务实的软件商业模式。

第一种、软件企业的传统商业模式:
微软为首的软件商业模式成功引领了近20年的辉煌,即使现在看来都有点像一本万利:首先要有一批高素质的人来开发软件,开始时成本很高,但是当软件开发出来后,每个使用这种软件的计算机都需要付费,如果软件的价格为一千元,一万台计算机使用软件,营业额是一千万,十万台计算机使用,营业额扩大十倍,但是开发成本并没有增加,而微软的软件每天都有几亿人在使用。这种商业模式最精彩的是,成本并没有随着营业额扩大而线性增加,只要你的软件产品好,利润似乎是无止境的。而我们熟识的ThinkPad笔记本,SONY电视机,IBM服务器,奔驰汽车能不需要投入就复制出另外一个吗?肯定不行,而软件可以!所以它缔造出了最强几个软件公司---微软、甲骨文、IBM。当然这种商业模式的成功有两个最基本的条件:

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 428

Windows API函数

1. API之网络函数
WNetAddConnection 创建同一个网络资源的永久性连接
WNetAddConnection2 创建同一个网络资源的连接
WNetAddConnection3 创建同一个网络资源的连接
WNetCancelConnection 结束一个网络连接

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 408

追MM与设计模式

创建型模式

1、FACTORY —追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

查看更多...

分类:软件开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 430