home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / comp / sys / next / programm / 7288 < prev    next >
Encoding:
Text File  |  1992-11-18  |  19.1 KB  |  372 lines

  1. Newsgroups: comp.sys.next.programmer
  2. Path: sparky!uunet!dtint!usenet
  3. From: nevin@dtint.dtint.com
  4. Subject: Re: Coding Rules/Suggestions (RTF)
  5. Message-ID: <1992Nov18.211313.25652@dtint.uucp>
  6. Sender: usenet@dtint.uucp
  7. Reply-To: nevin@dtint.dtint.com
  8. Organization: Digital Technology, International
  9. Date: Wed, 18 Nov 92 21:13:13 GMT
  10. Lines: 360
  11.  
  12. In comp.sys.next.programmer article  
  13. <1992Nov14.203954.19528@dtint.uucp> you wrote:
  14. > I'm hoping to stimulate a lively discussion on this.
  15. > I'll start out with my own list.  Tell me what you think...
  16. > Coding Rules and Suggestions for the NeXT
  17. > by Nevin Pratt
  18. > nevin@dtint.dtint.com
  19.  
  20.  
  21. Interesting stuff and a lot of good point, some of which end up being  
  22. applicable only to the NeXT environment. Consider what kind of  
  23. porting problems you may run into if you implement your standards.
  24.  
  25. More that a particular standard, it probably is important for a group  
  26. of people to agree on a standard implementation. This includes  
  27. subproject setup, object naming conventions, code outlining, file  
  28. commenting and organization, method/function commenting, line or  
  29. cluster commenting, etc.
  30.  
  31. I've been the route of extremely strict conventions (see Charles  
  32. Symoni, MIT/Microsoft on type naming calculus commonly referred to as  
  33. "Hungarian"), and I find the middle ground more appealing (i.e. a  
  34. 'relaxed' but enforceable, democratic group of standards).
  35.  
  36.  
  37. > All panels and windows should be in a separate NIB file, one per  
  38. NIB, with a separate Class object to control and manage each NIB.   
  39. For example, for the Info NIB file, there should also be files Info.h  
  40. and Info.m that manages the NIB file.  The panel or window in the NIB  
  41. file should have the name of it's NIB file (and associated class  
  42. files) as the name of the panel/window (this is setable via the  
  43. Inspector panel of I.B. I'm talking about the name that will appear  
  44. in the title bar of the panel/window, not the name as it might appear  
  45. in the "Objects" part of the NIB).
  46.  
  47. This doesn't account for sub-panels or micro-panel management. Also,  
  48. if you have a large collection of NIBs it means a propagation of  
  49. objects/classes. Again, a standard method within the application may  
  50. be what's really called for, not a standard approach to all  
  51. applications.
  52.  
  53. >    
  54. > Or, at the very least, the name of the NIB file (and therefore the  
  55. associated class files) should be obvious to determine simply by  
  56. looking at the panel (or window) name.  In this way, simply running  
  57. the program will give another programmer a very good idea of the  
  58. object structure of the program, since he can plainly see all of the  
  59. panels and windows, and their names, while the program is running.
  60.  
  61. Again, many nibs don't show titles. Another (possible) consideration:  
  62. information hiding. If you are distributing source for public  
  63. consumption then is probably not what you want to do. If you are  
  64. selling an application, you may wish to encode some things. Some  
  65. venders do consider it appropriate.
  66.  
  67. > *****************************
  68. > When given a choice of fewer objects that do more, versus more  
  69. objects that are smaller and do less, favor the use of smaller  
  70. objects.  You'll find that your objects will grow larger during  
  71. development anyway.
  72.  
  73. Generally I'd agree. However, if you're talking about managing say,  
  74. 1000 classes, you'll find a certain redundancy starts to creep in.  
  75. OOP in general has to do with the management of information. Do you  
  76. want to manage more or less things within a file? Do you want to  
  77. manage more or less things among files?
  78.  
  79. People are still enamored enough with OOP enough to not see the  
  80. second situation:  objects allow a encapsulization of related code so  
  81. we can avoid situations of tightly wrapped coding. Object systems  
  82. still end up being tightly bound among sets of objects. OOP has not  
  83. 'solved' the problem, only pushed it further back, at which stage the  
  84. problem becomes even bigger. Consider the impacts of favoring smaller  
  85. objects when your objects become interdependent and abundant.
  86.  
  87. I'm neither for or against large/small objects; I'm for applying what  
  88. best suits the big picture.
  89.  
  90. > *****************************
  91. >     
  92. > I have not, as yet, seen a single convincing situation where public  
  93. instance variables were necessary or even desirable, although I am  
  94. hesitant to say that there are none. ...
  95. Unless otherwise convinced for special occassions, all instance  
  96. variables should only be modifiable by a class method (i.e., NOT be  
  97. public).  It should also not be modifiable by more than one class  
  98. method.
  99.  
  100. It depends on how "purist" or theoretical vs. practical you want to  
  101. get. Within the same module/class it may be acceptable to refer to  
  102. the instance variable vs. the method, especially where speed is  
  103. concerned.
  104.  
  105. >  
  106. > *****************************
  107. >      
  108. > Reality Checking in 'C' code (as well as all of the 'C' language  
  109. derivatives, such as Objective-C) is accomplished with the assert()  
  110. macro.  Brad Cox, the creator of Objective-C, recommends using  
  111. asserts (p. 98 and 99 of his book, Object-Oriented Programming, An  
  112. Evolutionary Approach, 2nd Edition) for Reality Checking (he calls it  
  113. something else, though) and clustering the checks into two groups:  
  114. (1) preconditions, and (2) postconditions.  The advantage of using  
  115. assert() is that this debugging code can be turned off with a  
  116. compile-time switch.
  117. > I don't entirely agree with this approach, for a couple of reasons:
  118. >    
  119. > A precondition assert should verify that the argument values and/or  
  120. types are as they should be for the method to work properly.   
  121. Interestingly enough, except possibly with really obscure code (and I  
  122. can't even think of an example), the compiler and/or runtime system  
  123. will do this for you, so why do you need an assert for this case?   
  124. (Objective-C has a unique runtime system that almost no other  
  125. language has).
  126.  
  127. You might be able to gain a fuller appreciation for preconditions by  
  128. reading "Object Oriented Design" by Bertrand Meyer, which is where  
  129. Brad Cox picked up the notion of preconditions and postconditions.
  130.  
  131. There are several things that your discussion misses. A compiler can  
  132. check type information (is this an int, a const char*, the correct  
  133. object), but it cannot guarantee the condition of that argument (is  
  134. this int between values A and B, is the const char* a unique string,  
  135. is this object initialized to the proper state). Furthermore,  
  136. preconditions may extend to implicit arguments (global state, object  
  137. state), which also needs to be verified. For example; are we  
  138. currently printing? Is the associated nib for this object already  
  139. loaded.
  140.  
  141. Postconditions are treated in a similar fashion (the method operates  
  142. on state to produce a range of results; are the results in the  
  143. expected range?).
  144.  
  145. A third checking that is left out (I'll have to re-read Cox, as I  
  146. believe he misses this as well), is invarients. That is, what are  
  147. those states which may effect outcome which have nothing to do with  
  148. inputs. This includes environment conditions (memory, disk, threads,  
  149. etc), globals and some local state.
  150.  
  151. ..
  152.  
  153. protocols are cool, but not supported outside NeXT :-(
  154.  
  155. >  
  156. > *****************************
  157. > Methods must appear in both the implementation-module and  
  158. interface-module in the same order that they appear in standard NeXT  
  159. class documentation ...
  160.  
  161. Seeing as NeXT keeps tweaking their own definitions (witness 3.0  
  162. docs), and knowing some of the shortcomings (like delegate method  
  163. lookup) I'm not enamored with the suggestion. We break things into  
  164. logical groupings (existence, accessor, i/o, etc) within the header  
  165. and module files. This allows a programmer quick access to related  
  166. regions (which we deem pretty important). In fact, I'd wager you'll  
  167. encounter more production problems (i.e. bugs) by code that is spread  
  168. out alphabetically that clustered into logical groups.
  169.  
  170.  
  171. --
  172. Nevin Pratt, Digital Technology, Int'l    Orem, Ut
  173. NeXTmail preferred, but ONLY at my REAL email address:  
  174. nevin@dtint.dtint.com
  175.  
  176.  
  177.  
  178. -- NewsGrazer, a NeXTstep(tm) news reader, posting --
  179. M>UQR=&8P7&%N<VE[7&9O;G1T8FQ<9C!<9G-W:7-S($AE;'9E=&EC83M<9C%<
  180. M9FUO9&5R;B!#;W5R:65R.WT*7&UA<F=L,3(P"EQM87)G<C$R,`I[7&-O;&]R
  181. M=&)L.UQR960P7&=R965N,%QB;'5E,#M]"EQP87)D7'1X-3(P7'1X,3`V,%QT
  182. M>#$V,#!<='@R,3(P7'1X,C8V,%QT>#,R,#!<='@S-S(P7'1X-#(V,%QT>#0X
  183. M,#!<='@U,S(P7&8P7&(P7&DP7'5L;F]N95QF<S(T7&9C,%QC9C`@26X@8V]M
  184. M<"YS>7,N;F5X="YP<F]G<F%M;65R(&%R=&EC;&4@/#$Y.3).;W8Q-"XR,#,Y
  185. M-30N,3DU,CA`9'1I;G0N=75C<#X@>6]U('=R;W1E.EP*/B!))VT@:&]P:6YG
  186. M('1O('-T:6UU;&%T92!A(&QI=F5L>2!D:7-C=7-S:6]N(&]N('1H:7,N7`H^
  187. M(%P*/B!))VQL('-T87)T(&]U="!W:71H(&UY(&]W;B!L:7-T+B`@5&5L;"!M
  188. M92!W:&%T('EO=2!T:&EN:RXN+EP*/B!<"CX@0V]D:6YG(%)U;&5S(&%N9"!3
  189. M=6=G97-T:6]N<R!F;W(@=&AE($YE6%1<"CX@8GD@3F5V:6X@4')A='1<"CX@
  190. M;F5V:6Y`9'1I;G0N9'1I;G0N8V]M7`I<"EP*26YT97)E<W1I;F<@<W1U9F8@
  191. M86YD(&$@;&]T(&]F(&=O;V0@<&]I;G0L('-O;64@;V8@=VAI8V@@96YD('5P
  192. M(&)E:6YG(&%P<&QI8V%B;&4@;VYL>2!T;R!T:&4@3F585"!E;G9I<F]N;65N
  193. M="X@0V]N<VED97(@=VAA="!K:6YD(&]F('!O<G1I;F<@<')O8FQE;7,@>6]U
  194. M(&UA>2!R=6X@:6YT;R!I9B!Y;W4@:6UP;&5M96YT('EO=7(@<W1A;F1A<F1S
  195. M+EP*7`I-;W)E('1H870@82!P87)T:6-U;&%R('-T86YD87)D+"!I="!P<F]B
  196. M86)L>2!I<R!I;7!O<G1A;G0@9F]R(&$@9W)O=7`@;V8@<&5O<&QE('1O(&%G
  197. M<F5E(&]N(&$@<W1A;F1A<F0@:6UP;&5M96YT871I;VXN(%1H:7,@:6YC;'5D
  198. M97,@<W5B<')O:F5C="!S971U<"P@;V)J96-T(&YA;6EN9R!C;VYV96YT:6]N
  199. M<RP@8V]D92!O=71L:6YI;F<L(&9I;&4@8V]M;65N=&EN9R!A;F0@;W)G86YI
  200. M>F%T:6]N+"!M971H;V0O9G5N8W1I;VX@8V]M;65N=&EN9RP@;&EN92!O<B!C
  201. M;'5S=&5R(&-O;6UE;G1I;F<L(&5T8RY<"EP*22=V92!B965N('1H92!R;W5T
  202. M92!O9B!E>'1R96UE;'D@<W1R:6-T(&-O;G9E;G1I;VYS("AS964@0VAA<FQE
  203. M<R!3>6UO;FDL($U)5"]-:6-R;W-O9G0@;VX@='EP92!N86UI;F<@8V%L8W5L
  204. M=7,@8V]M;6]N;'D@<F5F97)R960@=&\@87,@(DAU;F=A<FEA;B(I+"!A;F0@
  205. M22!F:6YD('1H92!M:61D;&4@9W)O=6YD(&UO<F4@87!P96%L:6YG("AI+F4N
  206. M(&$@)W)E;&%X960G(&)U="!E;F9O<F-E86)L92P@9&5M;V-R871I8R!G<F]U
  207. M<"!O9B!S=&%N9&%R9',I+EP*7`I<"@I<:5QL:34T,%QF8S%<8V8Q(#X@06QL
  208. M('!A;F5L<R!A;F0@=VEN9&]W<R!S:&]U;&0@8F4@:6X@82!S97!A<F%T92!.
  209. M24(@9FEL92P@;VYE('!E<B!.24(L('=I=&@@82!S97!A<F%T92!#;&%S<R!O
  210. M8FIE8W0@=&\@8V]N=')O;"!A;F0@;6%N86=E(&5A8V@@3DE"+B`@1F]R(&5X
  211. M86UP;&4L(&9O<B!T:&4@26YF;R!.24(@9FEL92P@=&AE<F4@<VAO=6QD(&%L
  212. M<V\@8F4@9FEL97,@26YF;RYH(&%N9"!);F9O+FT@=&AA="!M86YA9V5S('1H
  213. M92!.24(@9FEL92X@(%1H92!P86YE;"!O<B!W:6YD;W<@:6X@=&AE($Y)0B!F
  214. M:6QE('-H;W5L9"!H879E('1H92!N86UE(&]F(&ET)W,@3DE"(&9I;&4@*&%N
  215. M9"!A<W-O8VEA=&5D(&-L87-S(&9I;&5S*2!A<R!T:&4@;F%M92!O9B!T:&4@
  216. M<&%N96PO=VEN9&]W("AT:&ES(&ES('-E=&%B;&4@=FEA('1H92!);G-P96-T
  217. M;W(@<&%N96P@;V8@22Y"+M!))VT@=&%L:VEN9R!A8F]U="!T:&4@;F%M92!T
  218. M:&%T('=I;&P@87!P96%R(&EN('1H92!T:71L92!B87(@;V8@=&AE('!A;F5L
  219. M+W=I;F1O=RP@;F]T('1H92!N86UE(&%S(&ET(&UI9VAT(&%P<&5A<B!I;B!T
  220. M:&4@(D]B:F5C=',B('!A<G0@;V8@=&AE($Y)0BDN7`H*7&DP7&QI,%QF8S!<
  221. M8V8P(%P*5&AI<R!D;V5S;B=T(&%C8V]U;G0@9F]R('-U8BUP86YE;',@;W(@
  222. M;6EC<F\M<&%N96P@;6%N86=E;65N="X@06QS;RP@:68@>6]U(&AA=F4@82!L
  223. M87)G92!C;VQL96-T:6]N(&]F($Y)0G,@:70@;65A;G,@82!P<F]P86=A=&EO
  224. M;B!O9B!O8FIE8W1S+V-L87-S97,N($%G86EN+"!A('-T86YD87)D(&UE=&AO
  225. M9"!W:71H:6X@=&AE(&%P<&QI8V%T:6]N(&UA>2!B92!W:&%T)W,@<F5A;&QY
  226. M(&-A;&QE9"!F;W(L(&YO="!A('-T86YD87)D(&%P<')O86-H('1O(&%L;"!A
  227. M<'!L:6-A=&EO;G,N7`I<"CX@("`@7`H*7&E<;&DU-#!<9F,Q7&-F,2`^($]R
  228. M+"!A="!T:&4@=F5R>2!L96%S="P@=&AE(&YA;64@;V8@=&AE($Y)0B!F:6QE
  229. M("AA;F0@=&AE<F5F;W)E('1H92!A<W-O8VEA=&5D(&-L87-S(&9I;&5S*2!S
  230. M:&]U;&0@8F4@;V)V:6]U<R!T;R!D971E<FUI;F4@<VEM<&QY(&)Y(&QO;VMI
  231. M;F<@870@=&AE('!A;F5L("AO<B!W:6YD;W<I(&YA;64N("!);B!T:&ES('=A
  232. M>2P@<VEM<&QY(')U;FYI;F<@=&AE('!R;V=R86T@=VEL;"!G:79E(&%N;W1H
  233. M97(@<')O9W)A;6UE<B!A('9E<GD@9V]O9"!I9&5A(&]F('1H92!O8FIE8W0@
  234. M<W1R=6-T=7)E(&]F('1H92!P<F]G<F%M+"!S:6YC92!H92!C86X@<&QA:6YL
  235. M>2!S964@86QL(&]F('1H92!P86YE;',@86YD('=I;F1O=W,L(&%N9"!T:&5I
  236. M<B!N86UE<RP@=VAI;&4@=&AE('!R;V=R86T@:7,@<G5N;FEN9RY<"@I<:3!<
  237. M;&DP7&9C,%QC9C`@7`I!9V%I;BP@;6%N>2!N:6)S(&1O;B=T('-H;W<@=&ET
  238. M;&5S+B!!;F]T:&5R("AP;W-S:6)L92D@8V]N<VED97)A=&EO;CH@:6YF;W)M
  239. M871I;VX@:&ED:6YG+B!)9B!Y;W4@87)E(&1I<W1R:6)U=&EN9R!S;W5R8V4@
  240. M9F]R('!U8FQI8R!C;VYS=6UP=&EO;B!T:&5N(&ES('!R;V)A8FQY(&YO="!W
  241. M:&%T('EO=2!W86YT('1O(&1O+B!)9B!Y;W4@87)E('-E;&QI;F<@86X@87!P
  242. M;&EC871I;VXL('EO=2!M87D@=VES:"!T;R!E;F-O9&4@<V]M92!T:&EN9W,N
  243. M(%-O;64@=F5N9&5R<R!D;R!C;VYS:61E<B!I="!A<'!R;W!R:6%T92Y<"EP*
  244. M/B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*EP*/B!<"@I<:5QL:34T
  245. M,%QF8S%<8V8Q(#X@5VAE;B!G:79E;B!A(&-H;VEC92!O9B!F97=E<B!O8FIE
  246. M8W1S('1H870@9&\@;6]R92P@=F5R<W5S(&UO<F4@;V)J96-T<R!T:&%T(&%R
  247. M92!S;6%L;&5R(&%N9"!D;R!L97-S+"!F879O<B!T:&4@=7-E(&]F('-M86QL
  248. M97(@;V)J96-T<RX@(%EO=2=L;"!F:6YD('1H870@>6]U<B!O8FIE8W1S('=I
  249. M;&P@9W)O=R!L87)G97(@9'5R:6YG(&1E=F5L;W!M96YT(&%N>7=A>2Y<"@I<
  250. M:3!<;&DP7&9C,%QC9C`@7`I'96YE<F%L;'D@22=D(&%G<F5E+B!(;W=E=F5R
  251. M+"!I9B!Y;W4G<F4@=&%L:VEN9R!A8F]U="!M86YA9VEN9R!S87DL(#$P,#`@
  252. M8VQA<W-E<RP@>6]U)VQL(&9I;F0@82!C97)T86EN(')E9'5N9&%N8WD@<W1A
  253. M<G1S('1O(&-R965P(&EN+B!/3U`@:6X@9V5N97)A;"!H87,@=&\@9&\@=VET
  254. M:"!T:&4@;6%N86=E;65N="!O9B!I;F9O<FUA=&EO;BX@1&\@>6]U('=A;G0@
  255. M=&\@;6%N86=E(&UO<F4@;W(@;&5S<R!T:&EN9W,@=VET:&EN(&$@9FEL93\@
  256. M1&\@>6]U('=A;G0@=&\@;6%N86=E(&UO<F4@;W(@;&5S<R!T:&EN9W,@86UO
  257. M;F<@9FEL97,_7`I<"E!E;W!L92!A<F4@<W1I;&P@96YA;6]R960@96YO=6=H
  258. M('=I=&@@3T]0(&5N;W5G:"!T;R!N;W0@<V5E('1H92!S96-O;F0@<VET=6%T
  259. M:6]N.B`@;V)J96-T<R!A;&QO=R!A(&5N8V%P<W5L:7IA=&EO;B!O9B!R96QA
  260. M=&5D(&-O9&4@<V\@=V4@8V%N(&%V;VED('-I='5A=&EO;G,@;V8@=&EG:'1L
  261. M>2!W<F%P<&5D(&-O9&EN9RX@3V)J96-T('-Y<W1E;7,@<W1I;&P@96YD('5P
  262. M(&)E:6YG('1I9VAT;'D@8F]U;F0@86UO;F<@<V5T<R!O9B!O8FIE8W1S+B!/
  263. M3U`@:&%S(&YO="`G<V]L=F5D)R!T:&4@<')O8FQE;2P@;VYL>2!P=7-H960@
  264. M:70@9G5R=&AE<B!B86-K+"!A="!W:&EC:"!S=&%G92!T:&4@<')O8FQE;2!B
  265. M96-O;65S(&5V96X@8FEG9V5R+B!#;VYS:61E<B!T:&4@:6UP86-T<R!O9B!F
  266. M879O<FEN9R!S;6%L;&5R(&]B:F5C=',@=VAE;B!Y;W5R(&]B:F5C=',@8F5C
  267. M;VUE(&EN=&5R9&5P96YD96YT(&%N9"!A8G5N9&%N="Y<"EP*22=M(&YE:71H
  268. M97(@9F]R(&]R(&%G86EN<W0@;&%R9V4O<VUA;&P@;V)J96-T<SL@22=M(&9O
  269. M<B!A<'!L>6EN9R!W:&%T(&)E<W0@<W5I=',@=&AE(&)I9R!P:6-T=7)E+EP*
  270. M7`H^(%P*/B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*EP*/B`)7`H*
  271. M7&E<;&DU-#!<9F,Q7&-F,2`^($D@:&%V92!N;W0L(&%S('EE="P@<V5E;B!A
  272. M('-I;F=L92!C;VYV:6YC:6YG('-I='5A=&EO;B!W:&5R92!P=6)L:6,@:6YS
  273. M=&%N8V4@=F%R:6%B;&5S('=E<F4@;F5C97-S87)Y(&]R(&5V96X@9&5S:7)A
  274. M8FQE+"!A;'1H;W5G:"!)(&%M(&AE<VET86YT('1O('-A>2!T:&%T('1H97)E
  275. M(&%R92!N;VYE+B`N+BY<"@I<9F,P7&-F,"!5;FQE<W,@;W1H97)W:7-E(&-O
  276. M;G9I;F-E9"!F;W(@<W!E8VEA;"!O8V-A<W-I;VYS+"!A;&P@:6YS=&%N8V4@
  277. M=F%R:6%B;&5S('-H;W5L9"!O;FQY(&)E(&UO9&EF:6%B;&4@8GD@82!C;&%S
  278. M<R!M971H;V0@*&DN92XL($Y/5"!B92!P=6)L:6,I+B`@270@<VAO=6QD(&%L
  279. M<V\@;F]T(&)E(&UO9&EF:6%B;&4@8GD@;6]R92!T:&%N(&]N92!C;&%S<R!M
  280. M971H;V0N7`H*7&DP7&QI,"!<"DET(&1E<&5N9',@;VX@:&]W(")P=7)I<W0B
  281. M(&]R('1H96]R971I8V%L('9S+B!P<F%C=&EC86P@>6]U('=A;G0@=&\@9V5T
  282. M+B!7:71H:6X@=&AE('-A;64@;6]D=6QE+V-L87-S(&ET(&UA>2!B92!A8V-E
  283. M<'1A8FQE('1O(')E9F5R('1O('1H92!I;G-T86YC92!V87)I86)L92!V<RX@
  284. M=&AE(&UE=&AO9"P@97-P96-I86QL>2!W:&5R92!S<&5E9"!I<R!C;VYC97)N
  285. M960N7`I<"CX@(%P*/B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*EP*
  286. M/B`@("`@(%P*"EQI7&QI-30P7&9C,5QC9C$@/B!296%L:71Y($-H96-K:6YG
  287. M(&EN("=#)R!C;V1E("AA<R!W96QL(&%S(&%L;"!O9B!T:&4@)T,G(&QA;F=U
  288. M86=E(&1E<FEV871I=F5S+"!S=6-H(&%S($]B:F5C=&EV92U#*2!I<R!A8V-O
  289. M;7!L:7-H960@=VET:"!T:&4@87-S97)T*"D@;6%C<F\N("!"<F%D($-O>"P@
  290. M=&AE(&-R96%T;W(@;V8@3V)J96-T:79E+4,L(')E8V]M;65N9',@=7-I;F<@
  291. M87-S97)T<R`H<"X@.3@@86YD(#DY(&]F(&AI<R!B;V]K+"!/8FIE8W0M3W)I
  292. M96YT960@4')O9W)A;6UI;F<L($%N($5V;VQU=&EO;F%R>2!!<'!R;V%C:"P@
  293. M,FYD($5D:71I;VXI(&9O<B!296%L:71Y($-H96-K:6YG("AH92!C86QL<R!I
  294. M="!S;VUE=&AI;F<@96QS92P@=&AO=6=H*2!A;F0@8VQU<W1E<FEN9R!T:&4@
  295. M8VAE8VMS(&EN=&\@='=O(&=R;W5P<SH@*#$I('!R96-O;F1I=&EO;G,L(&%N
  296. M9"`H,BD@<&]S=&-O;F1I=&EO;G,N("!4:&4@861V86YT86=E(&]F('5S:6YG
  297. M(&%S<V5R="@I(&ES('1H870@=&AI<R!D96)U9V=I;F<@8V]D92!C86X@8F4@
  298. M='5R;F5D(&]F9B!W:71H(&$@8V]M<&EL92UT:6UE('-W:71C:"Y<"@I<:3!<
  299. M;&DP7&9C,%QC9C`@/B!<"CX@22!D;VXG="!E;G1I<F5L>2!A9W)E92!W:71H
  300. M('1H:7,@87!P<F]A8V@L(&9O<B!A(&-O=7!L92!O9B!R96%S;VYS.EP*/B`@
  301. M("!<"CX@02!P<F5C;VYD:71I;VX@87-S97)T('-H;W5L9"!V97)I9GD@=&AA
  302. M="!T:&4@87)G=6UE;G0@=F%L=65S(&%N9"]O<B!T>7!E<R!A<F4@87,@=&AE
  303. M>2!S:&]U;&0@8F4@9F]R('1H92!M971H;V0@=&\@=V]R:R!P<F]P97)L>2X@
  304. M($EN=&5R97-T:6YG;'D@96YO=6=H+"!E>&-E<'0@<&]S<VEB;'D@=VET:"!R
  305. M96%L;'D@;V)S8W5R92!C;V1E("AA;F0@22!C86XG="!E=F5N('1H:6YK(&]F
  306. M(&%N(&5X86UP;&4I+"!T:&4@8V]M<&EL97(@86YD+V]R(')U;G1I;64@<WES
  307. M=&5M('=I;&P@9&\@=&AI<R!F;W(@>6]U+"!S;R!W:'D@9&\@>6]U(&YE960@
  308. M86X@87-S97)T(&9O<B!T:&ES(&-A<V4_("`H3V)J96-T:79E+4,@:&%S(&$@
  309. M=6YI<75E(')U;G1I;64@<WES=&5M('1H870@86QM;W-T(&YO(&]T:&5R(&QA
  310. M;F=U86=E(&AA<RDN7`I<"EEO=2!M:6=H="!B92!A8FQE('1O(&=A:6X@82!F
  311. M=6QL97(@87!P<F5C:6%T:6]N(&9O<B!P<F5C;VYD:71I;VYS(&)Y(')E861I
  312. M;F<@(D]B:F5C="!/<FEE;G1E9"!$97-I9VXB(&)Y($)E<G1R86YD($UE>65R
  313. M+"!W:&EC:"!I<R!W:&5R92!"<F%D($-O>"!P:6-K960@=7`@=&AE(&YO=&EO
  314. M;B!O9B!P<F5C;VYD:71I;VYS(&%N9"!P;W-T8V]N9&ET:6]N<RY<"EP*5&AE
  315. M<F4@87)E('-E=F5R86P@=&AI;F=S('1H870@>6]U<B!D:7-C=7-S:6]N(&UI
  316. M<W-E<RX@02!C;VUP:6QE<B!C86X@8VAE8VL@='EP92!I;F9O<FUA=&EO;B`H
  317. M:7,@=&AI<R!A;B!I;G0L(&$@8V]N<W0@8VAA<BHL('1H92!C;W)R96-T(&]B
  318. M:F5C="DL(&)U="!I="!C86YN;W0@9W5A<F%N=&5E('1H92!C;VYD:71I;VX@
  319. M;V8@=&AA="!A<F=U;65N="`H:7,@=&AI<R!I;G0@8F5T=V5E;B!V86QU97,@
  320. M02!A;F0@0BP@:7,@=&AE(&-O;G-T(&-H87(J(&$@=6YI<75E('-T<FEN9RP@
  321. M:7,@=&AI<R!O8FIE8W0@:6YI=&EA;&EZ960@=&\@=&AE('!R;W!E<B!S=&%T
  322. M92DN($9U<G1H97)M;W)E+"!P<F5C;VYD:71I;VYS(&UA>2!E>'1E;F0@=&\@
  323. M:6UP;&EC:70@87)G=6UE;G1S("AG;&]B86P@<W1A=&4L(&]B:F5C="!S=&%T
  324. M92DL('=H:6-H(&%L<V\@;F5E9',@=&\@8F4@=F5R:69I960N($9O<B!E>&%M
  325. M<&QE.R!A<F4@=V4@8W5R<F5N=&QY('!R:6YT:6YG/R!)<R!T:&4@87-S;V-I
  326. M871E9"!N:6(@9F]R('1H:7,@;V)J96-T(&%L<F5A9'D@;&]A9&5D+EP*7`I0
  327. M;W-T8V]N9&ET:6]N<R!A<F4@=')E871E9"!I;B!A('-I;6EL87(@9F%S:&EO
  328. M;B`H=&AE(&UE=&AO9"!O<&5R871E<R!O;B!S=&%T92!T;R!P<F]D=6-E(&$@
  329. M<F%N9V4@;V8@<F5S=6QT<SL@87)E('1H92!R97-U;'1S(&EN('1H92!E>'!E
  330. M8W1E9"!R86YG93\I+EP*7`I!('1H:7)D(&-H96-K:6YG('1H870@:7,@;&5F
  331. M="!O=70@*$DG;&P@:&%V92!T;R!R92UR96%D($-O>"P@87,@22!B96QI979E
  332. M(&AE(&UI<W-E<R!T:&ES(&%S('=E;&PI+"!I<R!I;G9A<FEE;G1S+B!4:&%T
  333. M(&ES+"!W:&%T(&%R92!T:&]S92!S=&%T97,@=VAI8V@@;6%Y(&5F9F5C="!O
  334. M=71C;VUE('=H:6-H(&AA=F4@;F]T:&EN9R!T;R!D;R!W:71H(&EN<'5T<RX@
  335. M5&AI<R!I;F-L=61E<R!E;G9I<F]N;65N="!C;VYD:71I;VYS("AM96UO<GDL
  336. M(&1I<VLL('1H<F5A9',L(&5T8RDL(&=L;V)A;',@86YD('-O;64@;&]C86P@
  337. M<W1A=&4N7`I<"BXN+EP*7`IP<F]T;V-O;',@87)E(&-O;VPL(&)U="!N;W0@
  338. M<W5P<&]R=&5D(&]U='-I9&4@3F585"`Z+2A<"EP*/B`@7`H^("HJ*BHJ*BHJ
  339. M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ7`H*7&E<;&DU-#!<9F,Q7&-F,2`^($UE
  340. M=&AO9',@;75S="!A<'!E87(@:6X@8F]T:"!T:&4@:6UP;&5M96YT871I;VXM
  341. M;6]D=6QE(&%N9"!I;G1E<F9A8V4M;6]D=6QE(&EN('1H92!S86UE(&]R9&5R
  342. M('1H870@=&AE>2!A<'!E87(@:6X@<W1A;F1A<F0@3F585"!C;&%S<R!D;V-U
  343. M;65N=&%T:6]N("XN+EP*"EQI,%QL:3!<9F,P7&-F,"!<"E-E96EN9R!A<R!.
  344. M95A4(&ME97!S('1W96%K:6YG('1H96ER(&]W;B!D969I;FET:6]N<R`H=VET
  345. M;F5S<R`S+C`@9&]C<RDL(&%N9"!K;F]W:6YG('-O;64@;V8@=&AE('-H;W)T
  346. M8V]M:6YG<R`H;&EK92!D96QE9V%T92!M971H;V0@;&]O:W5P*2!))VT@;F]T
  347. M(&5N86UO<F5D('=I=&@@=&AE('-U9V=E<W1I;VXN(%=E(&)R96%K('1H:6YG
  348. M<R!I;G1O(&QO9VEC86P@9W)O=7!I;F=S("AE>&ES=&5N8V4L(&%C8V5S<V]R
  349. M+"!I+V\L(&5T8RD@=VET:&EN('1H92!H96%D97(@86YD(&UO9'5L92!F:6QE
  350. M<RX@5&AI<R!A;&QO=W,@82!P<F]G<F%M;65R('%U:6-K(&%C8V5S<R!T;R!R
  351. M96QA=&5D(')E9VEO;G,@*'=H:6-H('=E(&1E96T@<')E='1Y(&EM<&]R=&%N
  352. M="DN($EN(&9A8W0L($DG9"!W86=E<B!Y;W4G;&P@96YC;W5N=&5R(&UO<F4@
  353. M<')O9'5C=&EO;B!P<F]B;&5M<R`H:2YE+B!B=6=S*2!B>2!C;V1E('1H870@
  354. M:7,@<W!R96%D(&]U="!A;'!H86)E=&EC86QL>2!T:&%T(&-L=7-T97)E9"!I
  355. M;G1O(&QO9VEC86P@9W)O=7!S+EP*7`H*7'!A<F1<='@Q,34R7'1X,C,P-%QT
  356. M>#,T-39<='@T-C`X7'1X-3<V,%QT>#8Y,3)<='@X,#8T7'1X.3(Q-EQT>#$P
  357. M,S8X7'1X,3$U,C!<9C%<9F,P7&-F,"!<"BTM7`I.979I;B!0<F%T="P@1&EG
  358. M:71A;"!496-H;F]L;V=Y+"!);G0G;"`@("!/<F5M+"!5=%P*3F585&UA:6P@
  359. M<')E9F5R<F5D+"!B=70@3TY,62!A="!M>2!214%,(&5M86EL(&%D9')E<W,Z
  360. =(&YE=FEN0&1T:6YT+F1T:6YT+F-O;5P*7`H*?0I,
  361. `
  362. -- 
  363. ---
  364. root                                   root@dtint.dtint.com
  365. Digital Technology Int.                (801)226-2984    
  366. 500 W. 1200 South, Orem UT, 84057      FAX (801) 226-8438
  367.