Making the move...
Rob Cozens
rcozens at pon.net
Mon Mar 20 12:28:55 EST 2006
Hi Geoff,
> Out of curiosity, do you have an example handy of a long handler that
> you think makes more sense to keep together than to break up? Or one
> that you think can't be broken up without significant effort to do it?
>
on findSDBRecord
@sdbBuffer,exactKey,fieldDelimiter,itemList,setPosition,searchForward,se
archCriteria,cutoffKey,recordDelimiter,unlockRecord
-- 28 Feb 04:RCC
if ipcMode is not "dc" then -- "dc" = single user direct connection
replace return with numToChar(29) in itemList
replace return with numToChar(29) in searchCriteria
requestSDBService
sdbBuffer,"find",packArguments(9,exactKey,fieldDelimiter,itemList,setPos
ition,searchForward,searchCriteria,cutoffKey,recordDelimiter,unlockRecor
d)
get the result
if not word 1 of it and setPosition then put word 4 of it into
sdbPosition
put it into sdbParameters
return it
else
if invalidSDBClient() then return
true&return&sdbMessage(sdbInvalidClientError,true)
if offset(return&sdbDbId&return,return&(the keys of
indexList)&return) = 0 then return
true&return&sdbMessage(sdbDbIdError,true)
if exactKey is empty then put true into exactKey
put (fieldDelimiter is not empty) into retrieveData
if recordDelimiter is not empty then
put true into multipleRecords
put false into unlockRecords
put false into setPosition
else put false into multipleRecords
put (multipleRecords and not retrieveData) into countOnly
if setPosition is empty or retrieveData then put true into
setPosition
if searchForward is empty then put true into searchForward
put ((sdbWriteAccess is "Shared") and (unlockRecord is true)) into
unlockRecord
put word 2 to 4 of sdbParameters into savedPosition
put justifyString(word 1 of sdbBuffer,4) into theRecordType
getSDBRecord sdbBuffer,exactKey,,,setPosition,retrieveData
get the result
put word 2 to -1 of line 1 of sdbBuffer into recordKey
if word 1 of it or (((recordKey > cutoffKey and searchForward) or
(recordKey < cutoffKey and not searchForward)) and cutoffKey is not
empty) then
put false&&savedPosition into sdbParameters
put false&&"0 0 0" into line 1 of it
return it
else
if unlockRecord and sdbWriteAccess is "Shared" then
deleteDbLock(word 4 of sdbParameters)
if not retrieveData and not multipleRecords then
put it into sdbParameters
return it
end if
end if
put word 4 of sdbParameters into oldPosition
put empty into returnRecord
put 0 into recordCount
repeat
put word 2 to -1 of line 1 of sdbBuffer into recordKey
if (recordKey > cutoffKey and searchForward) or (recordKey <
cutoffKey and not searchForward) then
put false into word 1 of sdbParameters
if countOnly then
put empty into sdbBuffer
return (word 1 to 3 of sdbParameters)&&recordCount
else
put theRecordType&&recordCount&return&returnRecord into
sdbBuffer
return (word 1 to 3 of sdbParameters)&&"0"
end if
end if
delete line 1 of sdbBuffer
if theSDBRecordMatches(sdbBuffer,fieldDelimiter,searchCriteria)
then
add 1 to recordCount
repeat for each line itemNumber in itemList
put sdbFieldNumber(itemNumber) into itemNumber
if itemNumber = 0 then put recordKey&fieldBelimiter after
returnRecord
else put
getItem(itemNumber,fieldDelimiter,sdbBuffer)&fieldDelimiter after
returnRecord
end repeat
if multipleRecords then put recordDelimiter after returnRecord
else
put theRecordType&&recordKey&return&returnRecord into
sdbBuffer
return (word 1 to 3 of sdbParameters)
end if
end if
set cursor to busy
if searchForward then
if word 2 of sdbParameters < word 3 of sdbParameters then
put "+" into sdbBuffer
getSDBRecord sdbBuffer,exactKey,,,true,retrieveData
put the result into sdbParameters
else put true into sdbParameters
else
if word 2 of sdbParameters > 1 then
put "-" into sdbBuffer
getSDBRecord sdbBuffer,exactKey,,,true,retrieveData
put the result into sdbParameters
else put true into sdbParameters
end if
if word 1 of sdbParameters then
put false into word 1 of sdbParameters
put oldPosition into word 4 of sdbParameters
if countOnly then
put empty into sdbBuffer
return (word 1 to 3 of sdbParameters)&&recordCount
else
put theRecordType&&recordCount&return&returnRecord into
sdbBuffer
return (word 1 to 3 of sdbParameters)&&"0"
end if
else if not setPosition then put oldPosition into word 4 of
sdbParameters
end repeat
end if
end findSDBRecord
Note:
stack local variables and constant declarations excluded.
application requirement: calling syntax at server and client apps must
be identical...
and identical with single user syntax
> When you think of a long handler, do you generally think of it as
> having a single identifiable task, or do you think of it as being
> several tasks performed in sequence in one handler?
I think of it as a task handler coordinating and calling on the various
subtasks necessary to complete the entire logical transaction.
I write one-line handlers too, if the logic is to be used in several
places:
on mouseTrapOn -- 3 Mar 04:RCC
insert the script of field "Mouse Trap" of card 1 of stack
"Serendipity_Library.rev" into front
end mouseTrapOn
>
> On Mar 19, 2006, at 3:57 PM, Chipp Walters wrote:
>
>> Yep, I've heard that before, but frankly, for me, I'd rather keep it
>> all in one, unless there's a really good reason to separate into
>> multiple handlers (as in creating more reusability). I find it much
>> easier to debug code I've written this way than hunting through the
>> message path for the 15 or so functions/handlers I've written trying
>> to make things 'more simple.' Just a difference in coding style.
>>
>> In fact, typically I'll write code procedurally in a longer handler,
>> then only break it up if/when I know I need to do part of the same
>> thing again. Like most of us, I'd rather not code twice.
>>
>> Even though, I've got libraries with over 50 handlers/functions.
>>
>> -Chipp
>>
>> Mark Wieder wrote:
>>> Geoff-
>>> Saturday, March 18, 2006, 1:24:50 PM, you wrote:
>>>> I've never seen a hundred-line routine that wouldn't be better as
>>>> five twenty-line routines, each of which could be documented with a
>>>> line of code. Perhaps even ten ten-line routines.
>
>
Rob Cozens
CCW, Serendipity Software Company
"And I, which was two fooles, do so grow three;
Who are a little wise, the best fooles bee."
from "The Triple Foole" by John Donne (1572-1631)
More information about the use-livecode
mailing list