Track Policies
This document:
- describes all current track-wide policies; and
- lists all policies that should be reviewed in response to any given track event.
Maintainers should refer to this document each time they review a pull request.
Our policies are not set-in-stone. They represent directions chosen at a point in time with the information/context available at that time. We actively encourage contributors to review and critique them. If you have read through the references that informed an existing policy and still feel it should be improved or removed, please comment and describe:
- your alternative perspective;
- your proposed changes; and
- how your proposal balances your own perspective with those already raised during prior discussions.
Event Checklist
| Track Event | Policies to review |
|---|---|
| Exercise added/updated | Prefer instance methods; Avoid using final; Adhere to best practices; Starter implementations; Ignore noninitial tests; Multiple file submissions; Name test class after class under test; Add hint for the first exercises without starter implementation |
| Track rearranged | Starter implementations; Multiple file submissions |
| New issue observed in track | Good first patches |
| "Good first patch" issue completed | Good first patches |
| Installing Java instructions updated | Simple onboarding |
Policy Descriptions
Prefer instance methods
Most (all?) exercises should be implemented in the form of instance methods since they contain "domain logic" and we (Exercism) want to encourage exemplary software.
References: [1]
Starter implementations
- Exercises of difficulty 4 or lower: provide stubs for all required constructors and methods. Stubs should include the following body:
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");- Exercises of difficulty 5 or higher: provide no stubs by default, but either (1) add hints to the hints.md file (which gets merged into the README.md for the exercise) or (2) provide stubs as above for exercises that demand complicated method signatures.
Avoid using final
Avoid using
finalin user-facing code. Liberal use of thefinalkeyword remains controversial. It adds little value to test suites, and if included in starter implementations, places implicit restrictions on user solutions.
Adhere to best practices
Ensure that all Java code adheres to the best practices listed below:
- minimize the accessibility of classes and members (Effective Java, item 13)
Ignore noninitial tests
All but the first test in an exercise test suite should add
@Ignore("Remove to run test")(single test) or@Ignore("Remove to run tests")(parametrized test) on the line before the corresponding@Testannotation.
References: [1]
Multiple file submissions
The first exercise in the track whose test suite mandates multiple solution files should be accompanied by a hints.md file reminding the practitioner that the CLI supports multiple file submissions.
References: [1]
Good first patches
Aim to keep 10-20 small and straightforward issues open at eny given time. Identify any such issues by applying the "Good first patch" label. You can view the current list of these issues here.
References: [1]
Simple onboarding
The Installing Java instructions should seek to minimize the number of steps and the number of concepts a new-to-the-track practitioner needs to learn to get to coding.
References: [1]
Name test class after class under test
If you're testing a class called
SomeClassNamethen your test class should be calledSomeClassNameTest.
The exception to this is if the tests are split into several test classes where each test class tests different functionality. In that case each class should be named
SomeClassNameFunctionalityTestwhereFunctionalityis the name of the functionality to be tested in that class. See the clock exercise as an example.
References: [1]
Add hint for the first exercises without starter implementation
According to the starter implementation policy, any exercise with difficulty 4 or lower should have starter implementation. Any exercise with difficulty 5 or above will have no starter implementation (unless its signature is very complicated). This could be confusing to users when tackling their first exercise with difficulty 5 when they are used to starter implementation being provided.
Therefore a hints.md file should be added to the .meta directory for every exercise with difficulty 5. This file should explain what they need to do when there is no starter implementation. The files should all be the same so you can copy it from any other exercise with difficulty 5, e.g. flatten-array.
We add the file to every exercise with difficulty 5 because the structure of the track means that we don't know which exercise will be the first one without starter implementation that a user will be faced with.
References: [1]