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@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution


_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to