Making the move...

Geoff Canyon gcanyon at inspiredlogic.com
Tue Mar 21 11:40:40 EST 2006


Wow -- so what does this do?

On Mar 20, 2006, at 9:28 AM, Rob Cozens wrote:

> 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, 
> searchCriteria,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,setPosition,searchForward,searchCr 
> iteria,cutoffKey,recordDelimiter,unlockRecord)
>     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)
>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your  
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
>




More information about the Use-livecode mailing list