Difference between revisions of "Local Declaration Guidelines"
(→Feature Arguments) |
(→Local Declarations) |
||
| Line 31: | Line 31: | ||
== Local Declarations == | == Local Declarations == | ||
| + | Routine local declaration should also be prefixed to prevent potential conflicts between routine arguments or class attributes. The prefix ''<e>l_</e>'' is typically used for variable moniker names longer than two character. There are other exceptions, these are discussed below. | ||
| − | <e> | + | === Well Known Variable Names === |
| + | Indexing/counter variables, as used in iteration loops, should not use a local prefix and should be terse. The variable ''<e>i</e>'' should be use to indicate it is an index variable. Additional index variables should follow alphabetically from ''<e>i</e>'' onwards. | ||
| + | |||
| + | Generally, paired with an indexing/counter variable, a stopping condition count or number-of-items variable is also used. There are two conventions used for this, generally used interchangeably; A count will use the same rules for local declarations and be called ''<e>l_count</e>'', a number-of-items variable will use a well-known contracted variable name '<e>nb</e>''. | ||
| + | |||
| + | <e> | ||
| + | f (a_array: ARRAY [INTEGER]) | ||
| + | local | ||
| + | i, nb: INTEGER | ||
| + | do | ||
| + | from | ||
| + | i := a_array.lower | ||
| + | nb := a_array.upper | ||
| + | until | ||
| + | i > nb | ||
| + | loop | ||
| + | ... | ||
| + | i := i + 1 | ||
| + | end | ||
| + | end | ||
| + | </e> | ||
| + | |||
| + | The case will commonly arise when multiple counters/number-of-items variables need to be used. In such cases the counter/number-of-items variable should be suffixed with the associated indexing/counter variable name. This is akin to [http://en.wikipedia.org/wiki/BASIC|BASIC]'s <code>NEXT x</code> instruction: | ||
| + | |||
| + | <e> | ||
| + | f (a_array: ARRAY [ARRAY [INTEGER]]) | ||
| + | local | ||
| + | l_sub_array: ARRAY [INTEGER] | ||
| + | i, nb_i: INTEGER | ||
| + | j, nb_j: INTEGER | ||
| + | do | ||
| + | from | ||
| + | i := a_array.lower | ||
| + | nb_i := a_array.upper | ||
| + | until | ||
| + | i > nb_i | ||
| + | loop | ||
| + | l_item := a_array[i] | ||
| + | if l_item /= Void then | ||
| + | from | ||
| + | j := l_item.lower | ||
| + | nb_j := l_item.upper | ||
| + | until | ||
| + | j > nb_j | ||
| + | loop | ||
| + | ... | ||
| + | j := j + 1 | ||
| + | end | ||
| + | end | ||
| + | i := i + 1 | ||
| + | end | ||
| + | end | ||
| + | </e> | ||
| + | |||
| + | ==== Rescue Clauses ==== | ||
| + | |||
| + | When adding a rescue clause with a retry a state variable, typically used to determine if a <e>retry</e> has been performed, there is no need to use a local declaration prefix. In fact, it's recommended there is no prefix. Instead just use a variable named ''<e>retried</e>'': | ||
| + | |||
| + | <e> | ||
| + | f | ||
| + | local | ||
| + | retried: BOOLEAN | ||
| + | do | ||
| + | if not retried then | ||
| + | ... | ||
| + | end | ||
| + | rescue | ||
| + | retried := True | ||
| + | retry | ||
| + | end | ||
| + | </e> | ||
=== In Contracts === | === In Contracts === | ||
Revision as of 11:15, 9 January 2009
Local declaration style guidelines for contributing to the Eiffel Software code repository.
Contents
Feature Arguments
Feature arguments should begin with the prefix a_ and nothing more. The prefix a_ represent a contraction of the word argument and does not represent the singular inflection - a noun - Therefore it is not valid to utilize an when the suffixed argument word begins with a vowel. The following is a correct usage:
f (a_string: STRING; a_integer: STRING) ... do end
Here, the second argument a_integer, is not considered A Integer but The Argument Integer, hence the use if a_ instead of _an_.
In-line Agent Feature Arguments
When working with an in-line agent, to prevent conflicts with the enclosing feature's arguments, the prefix ia_ should be used. The same rules regarding English language rules apply here as they do to feature arguments. The IA prefix represents an In-line Argument.
f (a_string: STRING; a_integer: STRING) ... do process (agent (ia_string: STRING; ia_integer: INTEGER) do ... end (a_string, a_integer)) end
Local Declarations
Routine local declaration should also be prefixed to prevent potential conflicts between routine arguments or class attributes. The prefix l_ is typically used for variable moniker names longer than two character. There are other exceptions, these are discussed below.
Well Known Variable Names
Indexing/counter variables, as used in iteration loops, should not use a local prefix and should be terse. The variable i should be use to indicate it is an index variable. Additional index variables should follow alphabetically from i onwards.
Generally, paired with an indexing/counter variable, a stopping condition count or number-of-items variable is also used. There are two conventions used for this, generally used interchangeably; A count will use the same rules for local declarations and be called l_count, a number-of-items variable will use a well-known contracted variable name 'nb.
f (a_array: ARRAY [INTEGER]) local i, nb: INTEGER do from i := a_array.lower nb := a_array.upper until i > nb loop ... i := i + 1 end end
The case will commonly arise when multiple counters/number-of-items variables need to be used. In such cases the counter/number-of-items variable should be suffixed with the associated indexing/counter variable name. This is akin to [1]'s NEXT x instruction:
f (a_array: ARRAY [ARRAY [INTEGER]]) local l_sub_array: ARRAY [INTEGER] i, nb_i: INTEGER j, nb_j: INTEGER do from i := a_array.lower nb_i := a_array.upper until i > nb_i loop l_item := a_array[i] if l_item /= Void then from j := l_item.lower nb_j := l_item.upper until j > nb_j loop ... j := j + 1 end end i := i + 1 end end
Rescue Clauses
When adding a rescue clause with a retry a state variable, typically used to determine if a retry has been performed, there is no need to use a local declaration prefix. In fact, it's recommended there is no prefix. Instead just use a variable named retried:
f
local
retried: BOOLEAN
do
if not retried then
...
end
rescue
retried := True
retry
end
In Contracts
Due to the current scoping rules of object-tests
rl_ for require
el_ for ensure
cl_ for check
ll_ for loop
il_ for loop invariant
vl_ for loop variant
Indexing
When a conflict between local delcarations exist a form of indexing must be use
equals (a_object: ANY; a_other_object: ANY): BOOLEAN

