软件设计, 程序设计

 

11.01.14

开关: 模块最临近边界处控制: 增减变量, 开关变量.

例子1:  o: 层数记录, 很紧凑.  入加出减.  x: 而非远处, 流程不变, 只在真正进入层前后加减.

do_travel(struct trie_node_st *rootp)
{
static char worddump[WORDLENMAX+1];
static int pos=0;
int i;

if (rootp == NULL) {
return 0;
}
if (rootp->count) {
worddump[pos]
='\0';
printword(worddump, rootp
->count);
}
for (i=0;i<TREE_WIDTH;++i) {
worddump[pos
++]=i;   //入层时加
do_travel(rootp->next[i]);
pos
--;            //出层时减
}
return 0;
}

 

例子2: o: 在POPUP时, 判断iEnable类别.  x: 在bmfh变的地方修改iEnable, 或远处修改. 流程是正常的, 只是在此判断, 流程满足什么条件时, 设置iEnable.

if (bmfh == NULL)          //每次popup时判断
iEnable
= MF_GRAYED;     
else
iEnable
= MF_ENABLED;

EnableMenuItem(hMenu, ID_FILE_Save_p620, iEnable);
EnableMenuItem(hMenu, ID_FILE_Print_p620, iEnable);
EnableMenuItem(hMenu, ID_EDIT_Cut_p620, iEnable);
EnableMenuItem(hMenu, ID_EDIT_Copy_p620, iEnable);
EnableMenuItem(hMenu, ID_EDIT_Delete_p620, iEnable);

 

例子3: o: 只能远程变量记录, 不能随时最根源的获取状态( x: 也可以随时获取: 通过查看每个item是否checked. 这样效率会低很多. )

 

static WORD wShow= ID_SHOW_Original_p620;
case ID_SHOW_Isotropically_p620:
CheckMenuItem(hMenu, dwCheckedStyle, MF_UNCHECKED);
dwCheckedStyle
= LOWORD(wParam);
CheckMenuItem(hMenu, dwCheckedStyle, MF_CHECKED);
InvalidateRect(hwnd, NULL, TRUE);

 

 

 

11.01.14

样例:

BITMAPFILEHEADER* DibLoadImage(TCHAR *szFileName)
{
HANDLE hFile;
BITMAPFILEHEADER
* pbmfh;
DWORD dwFileSize, dwHighSize, dwByteReaded;
BOOL bSuccess;

hFile
= CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(hFile==INVALID_HANDLE_VALUE)
return NULL;

dwFileSize
= GetFileSize(hFile, &dwHighSize);
pbmfh
= (BITMAPFILEHEADER*)calloc(1, dwFileSize);
if(pmfh==NULL)
{
CloseHandle(hFile);
return NULL;
}

bSuccess
= ReadFile(hFile, pbmfh, dwFileSize, &dwByteReaded, NULL);
CloseHandle(hFile);
if (!bSuccess || pbmfh == NULL
|| pbmfh->bfSize != dwFileSize
|| pbmfh->bfType != *(WORD*)"BM")
{
free(pbmfh);
return NULL;
}
return pbmfh;
}

1. 封装函数:  windows中对一些操作的封装使得程序清晰, 简明.

  (1) 传入参数尽量少

  (2) 外部引用参数尽量少

2. 封装函数的错误记录:  直接返回NULL, 上层判断出错, 不用每点都记录.  

 

10.11.01

1. 流程设计: 先设计出流畅的流程, 再编码.  流程流畅很重要。

2. 功能模块化后, 思考流程: 功能模块化能大大降低算法流程设计的难度。

    eg :判断1-2-3.jpg, 1-3-3.jpg 是否连续, 单一判断较容易, 但数量大了之后, 还带着strcmp, atoi的方方法很麻烦,如果封装出GetiNum(char* name, int i);    比较GetiNum(a, 1)==GetiNum(a, 2)会大大简化设计思路。

    模块化无处不在, 但是是否你的入手思考就已经模块化了呢?

posted on 2011-01-14 12:24  oleeceo  阅读(208)  评论(0)    收藏  举报

导航