Expand Cut Tags

No cut tags
norian: (Default)
[personal profile] norian
Уровень качества

Когда картёжник создаёт карту проблемной области и улучшает её, он должен понять, когда остановиться. Это относится ко всем уровням разработки. Обычно существует решение, которое существенно проще других и очевидно минимально. Может быть несколько способов его выражения, но они обозначают по сути одно и то же. Хотя высказывания типа "вы это узнаете, когда увидите" несомненно правильны, они не говорят, куда смотреть.

В качестве примера можно привести функцию для Win32 из книги Рихтера, которая, несмотря на попытку достичь максимальной ясности, не была упрощена в силу принятых соглашений:

DWORD WINAPI SecondThread (LPVOID lpwThreadParm) {
BOOL fDone = FALSE;
DWORD dw;

while (!fDone) {
// Wait forever for the mutex to become signaled.
dw = WaitForSingleObject(g_hMutex, INFINITE);

if (dw == WAIT_OBJECT_0) {
// Mutex became signalled.
if (g_nIndex >= MAX_TIMES) {
fDone = TRUE;
} else {
g_nIndex++;
g_dwTimes[g_nIndex - 1] = GetTickCount():
}

// Release the mutex.
ReleaseMutex(g_hMutex);
} else {
// The mutex was abandoned.
break;// Exit the while loop.
}
}
return(0);
}

Однако мы можем сделать это и достичь максимального уровня качества

DWORD TheThread(void *ThreadParm)
{
while(Index < MAX_TIMES &&
WaitForSingleObject(Mutex, INFINITE) == WAIT_OBJECT_0)
{
if (Index < MAX_TIMES)
Times[Index++] = GetTickCount():
ReleaseMutex(Mutex);
}
return(0);
}

Причём вместо

hThreads[0] = CreateThread(..., FirstThread, ...);
hThreads[1] = CreateThread(..., SecondThread, ...);

можно писать

hThreads[0] = CreateThread(..., TheThread, ...);
hThreads[1] = CreateThread(..., TheThread, ...);

и тем самым избежать поддержки нескольких версий одного и того же кода.

Date: 2009-10-08 11:41 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
рихтер - ламер, но ваша программа делает не то же самое (хотя я с ее логикой согласен больше, чем с рихтеровой версией).

Date: 2009-10-08 01:05 pm (UTC)
From: [identity profile] norian.livejournal.com
мопед не совсем мой

это попытка более человеческого перевода на русский

http://www.datamodel.co.uk/Reciprocality/www.reciprocality.org/Reciprocality/r0/index.html

там есть поскипанная полная версия рефакторинга с комментариями

Date: 2009-10-09 10:21 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
дело не совсем в рефакторинге, а в изменении смысла MAX_TIMES. в рихтеровской версии количество вызовов WaitForSingleObject будет не менее 1 и не менее MAX_TIMES+1. в вашей версии вызовов WaitForSingleObject ровно MAX_TIMES

Profile

norian: (Default)
Norian

January 2026

S M T W T F S
    1 2 3
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Page generated Jan. 9th, 2026 04:01 am
Powered by Dreamwidth Studios