Previous | Contents | Index |
It is a proven fact that the maintenance of existing software accounts for 80% of software costs. Therefore, the key to writing efficient code is to keep routines short, simple and easy to maintain.
See Appendix A, Coding Principles and Standards and Appendix I, Developing Professional Applications with Sheerpower for more on writing professional code in Sheerpower. |
Sheerpower has powerful features that make it easy to write short, simple routines:
See Section 3.4, ROUTINE/END ROUTINE for more on Routines and Private Routines in Sheerpower. |
Each variable in a program belongs to a NAMESPACE. By default, they belong to a "namespace" called MAIN. So:
abc = 123 print abc |
is the same as:
abc = 123 print main$abc |
is the same as:
main$abc = 123 print abc |
Sheerpower supports both ROUTINES that use the MAIN "namespace," and PRIVATE ROUTINES that have their own "namespace." For example:
Example M-1 Routine With Default "Main Namespace" |
---|
show_display routine show_display abc = 123 print main$abc end routine |
In this ROUTINE, the variable "abc" belongs to the "namespace" of MAIN-sharing its variable names with the main program.
However in this PRIVATE ROUTINE:
do_totals private routine do_totals abc = 123 print abc end routine |
the variable "abc" belongs to the "namespace" of "do_totals":
do_totals private routine do_totals abc = 123 print do_totals$abc end routine |
Now, let's look at a more complex example:
Example M-2 Private Routines and Namespace |
---|
abc = 123 do_totals stop private routine do_totals abc = 999 print 'The DO_TOTALS version: '; abc print 'The MAIN version : '; main$abc end routine end |
In many programming languages it is difficult to take a large segment of code and break it into separate routines or functions. This difficulty arises from determining how parameters will get passed into and out of the newly created routine. Sheerpower ROUTINES make this task very easy because, by default, ROUTINES have full access to all variables in the code that calls them. For example:
Example M-3 Long code to segment into smaller routines |
---|
email_image$ = "c:\sheerpower\samples\emailicon.jpg" do email_form$ = '<sheerpower color=#ffaaaa persist>' email_form$ = email_form$ + '<form><title>Send Email</title>' email_form$ = email_form$ + '<img src="' + email_image$ + '"><p>' email_form$ = email_form$ + '<table align=center>' email_form$ = email_form$ + '<tr><td align=left><b>From:</b> ' email_form$ = email_form$ + '<td><input type=text name=from ' + 'value="Type in sender email address here"></tr>' email_form$ = email_form$ + '<tr><td align=left><b>To:</b> ' email_form$ = email_form$ + '<td><input type=text name=to ' + 'value="Type in recipient email address here"></tr>' email_form$ = email_form$ + '<tr><td align=left><b>Subject:</b> ' email_form$ = email_form$ + '<td><input type=text name=subject ' + 'value="Type in a subject here"></tr>' email_form$ = email_form$ + '<tr><td align=left><b>Body:</b> ' email_form$ = email_form$ + '<td><br><textarea name=body rows=10 cols=30>' + 'Type in the body of the email here</textarea><p>' email_form$ = email_form$ + '</textarea><p></tr>' email_form$ = email_form$ + '</table>' email_form$ = email_form$ + '<p><center>' + '<input type=submit name=submit value="Send Email">' email_form$ = email_form$ + '<input type=submit name=exit value="Quit Email">' email_form$ = email_form$ + '</center></form>' line input dialogbox email_form$: info$ if _exit then exit do for item = 1 to pieces(info$, chr$(26)) z0$ = piece$(info$, item, chr$(26)) name$ = element$(z0$, 1, '=') value$ = element$(z0$, 2, '=') select case name$ case 'from' mailfrom$ = value$ case 'to' sendto$ = value$ case 'body' text$ = value$ case 'subject' subject$ = value$ end select next item if pos(mailfrom$,'@') = 0 or pos(sendto$,'@') = 0 then repeat do // send_email // commented out so sample program works loop |
This code is hard to follow because it has too much detail that the maintenance programmer is forced to read through. So, we can easily segment this code into distinct ROUTINES by:
See Section F.2, Programming Keystrokes for a complete list of special programming keystrokes available in Sheerpower. |
This results in code that looks like:
Example M-4 Correct Program Segmentation |
---|
email_image$ = "c:\sheerpower\samples\emailicon.jpg" do show_email_form if _exit then exit do parse_results if pos(mailfrom$,'@') = 0 or pos(sendto$,'@') = 0 then repeat do // send_email loop stop routine show_email_form email_form$ = '<sheerpower color=#ffaaaa persist>' email_form$ = email_form$ + '<form><title>Send Email</title>' email_form$ = email_form$ + '<img src="' + email_image$ + '"><p>' email_form_table email_form$ = email_form$ + '<p><center>' + '<input type=submit name=submit value="Send Email">' email_form$ = email_form$ + '<input type=submit name=exit value="Quit Email">' email_form$ = email_form$ + '</center></form>' line input dialogbox email_form$: info$ end routine routine email_form_table email_form$ = email_form$ + '<table align=center>' email_form$ = email_form$ + '<tr><td align=left><b>From:</b> ' email_form$ = email_form$ + '<td><input type=text name=from ' + 'value="Type in sender email address here"></tr>' email_form$ = email_form$ + '<tr><td align=left><b>To:</b> ' email_form$ = email_form$ + '<td><input type=text name=to ' + 'value="Type in recipient email address here"></tr>' email_form$ = email_form$ + '<tr><td align=left><b>Subject:</b> ' email_form$ = email_form$ + '<td><input type=text name=subject ' + 'value="Type in a subject here"></tr>' email_form$ = email_form$ + '<tr><td align=left><b>Body:</b>' email_form$ = email_form$ + '<td><br><textarea name=body rows=10 col30>' + 'Type in the body of the email here</textarea><p>' email_form$ = email_form$ + '</textarea><p></tr></table>' end routine routine parse_results for item = 1 to pieces(info$, chr$(26)) z0$ = piece$(info$, item, chr$(26)) name$ = element$(z0$, 1, '=') value$ = element$(z0$, 2, '=') select case name$ case 'from' mailfrom$ = value$ case 'to' sendto$ = value$ case 'body' text$ = value$ case 'subject' subject$ = value$ end select next item end routine |
Notice how the program is now easy to follow and therefore easy to maintain.
Unlike the ROUTINE feature whose primary purpose is to break down program code into smaller, more manageable segments, the PRIVATE ROUTINE feature is used to write routines that will be used in a number of different applications. Here is a simple PRIVATE ROUTINE that is used to write messages to a message file:
private routine write_message with msg if msg_ch = 0 then open file msg_ch: name 'message.log', access output print #msg_ch: time$; ' '; msg end routine |
WRITE_MESSAGE has a single named parameter called "msg." The first time WRITE_MESSAGE is called, msg_ch will be zero, so a new message.log file is created and msg_ch receives the channel#. Then WRITE_MESSAGE writes out the current time and the message.
This PRIVATE ROUTINE can be called from any application without the programmer worrying about variable name conflicts.
write_message with msg "this is a test" private routine write_message with msg if msg_ch = 0 then open file msg_ch: name 'message.log', access output print #msg_ch: time$; ' '; msg end routine |
The PRIVATE ROUTINE feature of Sheerpower is designed to assist in writing routines that will be used in a number of different programs. Variable name conflicts are not an issue because all variable names in PRIVATE ROUTINES have their own private "namespace."
Previous | Next | Contents | Index |