软件设计, 程序设计
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)会大大简化设计思路。
模块化无处不在, 但是是否你的入手思考就已经模块化了呢?
浙公网安备 33010602011771号