-
Notifications
You must be signed in to change notification settings - Fork 0
CodingConventions
Most of our coding conventions are automatically detected by Code Critics and Slime, a Seaside specific extension to Code Critics. We recommend that you follow Smalltalk Best Practice Pattern by Kent Beck.
Seaside code has to work on many platforms. At the end of the day the porters will make sure the code is portable, just keep this in mind and don't make their life unnecessary hard. The following list shall serve as a guideline. When in doubt ask on the mailing-list. Tests certainly help to document your assumptions about a platform.
- Use
#greaseStringfor String conversion. - Do not use any of these methods, they are missing, broken or have different semantics on some platforms:
- Object:
#ifNotNil:,#ifNotNilDo:,#in:, ... - Boolean:
#and:and:and:,#or:or:or:, ... - Collection:
#=,#pairsDo:,#with:collect: - String:
#match: - Stream:
#position,#position:,#isEmpty
- Object:
- Don't assume
Symbolto be a subtype ofString. - Use
GRPlatformsparingly and only if there is absolutely no other way. - Non-ASCII Strings and Characters are inherently unportable. Same goes for class look-up, compilation and IO.
Character crandCharacter lfare not the same on all platforms. - Don't use any dialect specific syntax, like byte array literals
#[ ], curly braces{ }, or pragmas<pragma>. - For portable code subclass
GRObject. This makes sure your objects will receive an#initializemessage upon creation, see ObjectInitialization for details. - Instead of
RandomandSemaphoreuseGRPlatform current newRandomandGRPlatform current semaphoreClass. - Instead of
TimeStampuseDateAndTime - Do not do non-local returns in error handler block.
- The receiving block of #on:do: after processing the exception handler of a notification may resume the execution.
- Do not touch the code of
WAProcessMonitor, here be dragons. - Do not use the return value of
Array#sortor#sort:. - Do not use string literals with NULL characters.
- Do not assume
#valueis part of theObjectprotocol - Send
#daysInMonthNumber:forYear:toDate. Not#daysInMonth:forYear:toMonthorDate. - Use
#keysAndValuesDo:instead of#withIndexDo:. - In Seaside 2.8 and earlier use the class side
#raiseSignalor#raiseSignal:to throw exceptions. - In Seaside 3.0 and later use ANSI exceptions, that means instance or class side
#signalor#signal:onGRErrorandGRNotificationor subclasses. Do not use any other exception classes. - Do not send
#forkto a block if you want to get a reference to the created process. Use a combination of#newProcessand#resume. - The second argument passed to
#on:do:must be a one argument block. - Starting with Seaside 3.0 conform with the ValuableProtocol.
- Don't send #next to a
ReadStreamthat is at end. Instead send #atEnd to check if the stream is at the end. - starting with Seaside 3.0 use #greaseInteger to
- convert
Numbers toIntegers (ANSI behavior) - convert
Strings toIntegers - get the code point of a
Character
- convert
- Use
WriteStream on: String newinstead ofString new writeStream - Do not send #hash to a class (GemStone)
- convert class names to strings using
#greaseString - use
SequenceableCollection >> #beginsWithSubCollection:instead ofSequenceableCollection >> #beginsWith: - use
SequenceableCollection >> #endsWithSubCollection:instead ofSequenceableCollection >> #endsWith: - use
(String with: Character cr with: Character lf)instead ofString crlf - don't use any of those on a
Collection#count:#withIndexCollect:#anyOne
- don't use
OrderedCollection >> #at:ifAbsentPut: - don't use
1 / 0, Smalltak/X has constant folding (evaluates this at compile time) which will raise an error during code loading - don't use
#canPerform:it's not portable use#respondsTo: - use
#indexOfSubCollection:startingAt:(ANSI) instead of#includesSubString: - use
TestCase >> #assert: falseinstead ofTestCase >> #fail - don't send
firstto an empty collection since the behavior is not portable (ANSI: Answer the element at index 1 in the receiver. The result is undefined if the receiver is empty.)
Making sure all objects are properly initialized can be complex, particularly when dealing with multiple platforms. We have adopted ObjectInitialization in Seaside to make sure behaviour is consistent.
We are picky about formatting so this gets its own section.
- Have a look at existing code to get a feel.
- Always use
:=for assignments, never the non-portable_. - Always put a space before and after a binary selector.
- Properly indent your code using tabs, not spaces.
- No unnecessary brackets, don't bracket the receiver of a cascade if not necessary.
- No unnecessary blank lines, expect after the method comment.
- Do not send yourself, if you don't use the result.
- Use
eachas an argument name of iteration blocks. - Add a space at the beginning and end of a temporary variable declarations and blocks.
- Avoid unnecessary statement separators.
- Close multiple blocks on one line.
- The first comment of a method should state the use and the expected arguments of public methods. Keep it short, but ensure that these are valid sentences starting with an uppercase letter and end with a full stop.
- Avoid comments within the method body.
- Avoid using a pretty printer.
- The complete ancestry must be in the Monticello repository.
- Commit small changes (a single method is fine), big changes make merging hard.
- Avoid the use of
#styleand#scriptif possible. - Refrain from using IDs and use CSS classes instead.
- Use your author initials as author initials, not your name.
- Follow the PackageNaming.
- If you change the package structure also update the scripts that generate the dependency graphs and Universe.