Каково Ваше соглашение о присвоении имен для функций помощника?

команды должны быть в одной строке удалить разрыв строки в Where (), если вы копируете вставить

0:057> dx -r1 @$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).Where
( ( p=>p.ToDisplayString().Contains("Wait") == true ))

результат команды

@$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).  
Where( ( p=>p.ToDisplayString().Contains("Wait") == true ))                
    [0x9dc]          : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
    [0x480]          : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
    [0xc4]           : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
    [0xae8]          : ntdll!NtWaitForSingleObject + 0xc [Switch To]
    [0xeac]          : ntdll!NtWaitForKeyedEvent + 0xc [Switch To]
    [0xf08]          : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
    [0xdd4]          : ntdll!NtWaitForSingleObject + 0xc [Switch To]
    [0xc64]          : ntdll!NtWaitForSingleObject + 0xc [Switch To]
    [0x89c]          : ntdll!NtWaitForKeyedEvent + 0xc [Switch To]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    [0x162c]         : ntdll!NtWaitForKeyedEvent + 0xc [Switch To]

команда для ложного условия снова должна быть одинарной line

0:057> dx -r1 @$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).Where  
( ( p=>p.ToDisplayString().Contains("Wait") == false ))

result

@$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]). 
Where( ( p=>p.ToDisplayString().Contains("Wait") == false ))                
    [0x208]          : ntdll!NtRemoveIoCompletion + 0xc [Switch To]
    [0x3ec]          : ntdll!NtRemoveIoCompletion + 0xc [Switch To]
    [0xadc]          : user32!NtUserGetMessage + 0xc [Switch To]
    [0x1794]         : ntdll!NtDelayExecution + 0xc [Switch To]
    [0xe78]          : ntdll!NtRemoveIoCompletion + 0xc [Switch To]
    [0x1164]         : ntdll!DbgUiRemoteBreakin + 0x3c [Switch To]

сравнение вывода между! busy от pde, как это было предложено командой Lieven, со встроенной командой, слегка измененной для исключения стеков «RemoveIo» и «Wait» [1110 ]

0:037> dx @$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).Where(    
(p=>p.ToDisplayString().Contains("Wait") != true)).Where(p=>p.ToDisplayString().   
Contains("Remove") != true)

результаты

@$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).  
Where( (p=>p.ToDisplayString().Contains("Wait") !=   
true)).Where(p=>p.ToDisplayString().Contains("Remove") != true)                
    [0xd78]          : user32!NtUserGetMessage + 0xc [Switch To]
    [0xe44]          : user32!NtUserGetMessage + 0xc [Switch To]
    [0x514]          : ntdll!DbgUiRemoteBreakin + 0x3c [Switch To]
0:037> !busy

#  37 TID:0d78 kb kbn kbnL kn knL kpn kPn
 # ChildEBP RetAddr  
00 1737fdd8 770ccde0 ntdll!KiFastSystemCallRet
01 1737fddc 770cce13 user32!NtUserGetMessage+0xc
xxxx
0b 1737ff24 00000000 ntdll!_RtlUserThreadStart+0x1b

   50 TID:0e44 kb kbn kbnL kn knL kpn kPn
 # ChildEBP RetAddr  
00 1fb8fa18 770ccde0 ntdll!KiFastSystemCallRet
01 1fb8fa1c 770c18d9 user32!NtUserGetMessage+0xc
xxxxxx
07 1fb8fb20 00000000 ntdll!_RtlUserThreadStart+0x1b

   53 TID:0514 kb kbn kbnL kn knL kpn kPn
 # ChildEBP RetAddr  
00 144cf778 7780f20f ntdll!DbgBreakPoint
01 144cf7a8 7748ed6c ntdll!DbgUiRemoteBreakin+0x3c
xxxxxxx
05 144cf848 00000000 ntdll!_RtlUserThreadStart+0x1b

Threads: 3 of 54
Frames : 1
Command: knL
Mode   : Basic
10
задан Tim Lesher 6 January 2009 в 22:13
поделиться

7 ответов

Я склонен добавлять "_recurse" в конец. Так "reverse_recurse". Не уверенный, где я получил это от. Мне нравится оставлять основную функцию случая простой, как Вы имеете в своем примере. Это имеет тенденцию быть "общедоступной" функцией и тем, что это использует функцию помощника для выполнения, повторение не важно вызывающей стороне. В JavaScript я иногда иду, насколько скрыть повторяющуюся функцию через закрытие, заставить его действительно очистить его не означает быть назван непосредственно.

3
ответ дан 3 December 2019 в 13:44
поделиться

Можно вызвать функцию помощника что-либо, что Вы хотите, и она не будет иметь значения, пока Вы не помещаете функцию помощника в "глобальное" пространство имен. Просто добавление "начала" кажется обычной практикой.:) Например, в Haskell,

reverse :: [a] -> [a]
reverse = reverse' []
    where reverse' :: [a] -> [a] -> [a]
          reverse' result [] = result
          reverse' result (x:xs) = reverse' (x:result) xs
22
ответ дан 3 December 2019 в 13:44
поделиться

Я всегда использую, делают _, как "do_compute" с "вычисляют". Я нахожу это довольно описательным, поскольку это - эффективно часть функции, которая выполняет действие, тогда как "вычисление", которое получает названные потребности иметь простое описательное имя для внешнего мира.

6
ответ дан 3 December 2019 в 13:44
поделиться

Я соглашаюсь с ShreevatsaR, если Вы не делаете верхний уровень функции помощника (или хуже, поместите его в список экспорта), чем не имеет значения, каково его имя. Я склонен вызывать функции помощника f и g.

reverse :: [a] -> [a]
reverse = f []
  where
    f ys []     = xs
    f ys (x:xs) = f (x:ys) xs

Я просто использую эту схему именования для небольших функций (иначе, я не знаю что f относится к). С другой стороны, почему Вы когда-либо писали бы большие функции?

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

reverseAccumulator

Как Haskell zip и zipWith. Но я не вызвал бы те функции 'помощника', zipWith просто родовая функция и zip реализация по умолчанию (вероятно, тот, который это использовало большинство).

5
ответ дан 3 December 2019 в 13:44
поделиться

Я также соглашаюсь с ShreevatsaR, в этом примере я сделал бы помощника закрытой функцией.

Для других случаев, где мне нужны функции помощника, чтобы быть видимым в целом модуле, но не экспортируемый, я склонен снабжать префиксом функции '_'. Несомненно, существует явный оператор экспорта, но во время разработки я склонен экспортировать все функции для упрощения интерактивного исследования, например, в ghci. Позже я добавляю список экспортируемых функций, и underbar помогает помнить, предназначил ли я функцию, чтобы быть локальным или нет.

3
ответ дан 3 December 2019 в 13:44
поделиться

Я использую aux или foo_aux (для основной функции foo), и вкладывают определение, таким образом, это не внешне видимо.

2
ответ дан 3 December 2019 в 13:44
поделиться

установите и выполнитесь

пример:

function whateverSetup() { ... }
function whateverExecute() { ... }
1
ответ дан 3 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: