This tool validates the following nine rules for the object oriented programming exercise in Java language.
A book titled 'The ThoughtWorks Anthology: Essays on Software Technology and Innovation' are published. Chapter 6 in the book introduces object calisthenics for better software design. The rules shown in the book are as follows.
- Use 1 level of indentation per method (
DONE
), - Do not use the
else
keyword (DONE
), - Wrap all primitives and strings (
DONE
), - Use only 1 dot per line (
DONE
), - Do not abbreviate (
Not support yet
), - Keep all entities small,
- 50 lines in a source file (
DONE
), - 3 lines in a method (
DONE
), and - 10 classses in a package (
Not support yet
).
- 50 lines in a source file (
- Do not use any classes with more than 2 instance variables (
DONE
), - Use first-class collections (
DONE
), and - Do not use any getters/setters/properties (
DONE
)
Unfortunately, to confirm obeying the rules is by a human eye. Therefore, this tool was developed to validate the rules automatically by analyzing given Java source codes. By the way, this tool is programed to obey above rules.
The following demo shows validating Java source codes in top directory of 9rules project.
The demo was executed the following commands.
$ tree src/test/resources/hello/src/main/java/
// The result of tree command was printed.
$ java -jar target/9rules-1.0-SNAPSHOT.jar src/test/resources/hello/src/main/java/
// ... skip
src/test/resources/hello/src/main/java/sample/hello/HelloWorld.java
line: 10, setter method found.
line: 14, getter method found.
line: 18, method is too long (over 3 lines).
// ... skip
$ cat -n src/test/resources/hello/src/main/java/sample/hello/HelloWorld.java
// Print source code.
At the second command, the demo performed 9rules to validate given source directory. One of the results was shown in above list, 9rules reports that the following violations were found. You can find the violations to see the actual source code.
- setter method found in line 10,
- getter method found in line 14,
- the method declared in line 18 was too long, it over 3 lines.
- To run the program of the project, use
-jar
option of thejava
command.$ java -jar target/9rules-1.X.jar <TARGET SOURCE DIR...>
<TARGET SOURCE DIR...>
accepts several directories and several source files.
The help message is as follows.
java -jar 9rules.jar [OPTIONS] <ARGUMENTS...>
OPTIONS:
--strict: Strictly level check (Default).
--general: General level check.
--rough: Rough level check.
--help: Print this message and exit.
ARGUMENTS:
Directories include Java source files, and Java source files.
If it is hard to obey the rules shown in above, we can lower the validating level by specifying the option.
- The strict level (
--strict
option) is just rules shown in above. - The general level (
--general
option) is lowered as follows.- Use 1 level indentation per method (same as strict),
- Do not use the
else
keyword (same as strict), - Wrap all primitives and strings (same as strict),
- Use only 2 dots per line (relieved),
- Do not use abbreviate (not support yet),
- Keep all entities small,
- 70 lines in a source file (relieved),
- 5 lines in a method (relieved), and
- 20 classes in a package (Not support yet).
- Do not use any classes with more than 3 instance variables (relieved),
- Use first-class collections (same as strict), and
- Do not use any getters/setters/properties (same as strict).
- The rough level (
--rough
option) is lowered as follows.- Use 2 level indentation per method (relieved),
- Do not use the
else
keyword (same as strict), - Wrap all primitives and strings (same as strict),
- Use only 3 dots per line (relieved),
- Do not use abbreviate (not support yet),
- Keep all entities small,
- 100 lines in a source file (relieved),
- 10 lines in a method (relieved), and
- 30 classes in a package (Not support yet).
- Do not use any classes with more than 4 instance variables (relieved),
- Use first-class collections (same as strict), and
- Do not use any getters/setters/properties (same as strict).
Container images for Docker of 9rules are:
tamada/9rules
1.0.0-v2
,latest
To run the 9rules by the docker container:
$ docker run --rm -v "$PWD":/home/ninerules tamada/9rules <ARGUMENTS...>
ARGUMENTS...
: the arguments for9rules
.--rm
: remove the container after running.-v "$PWD":/home/ninerules
: share volume$PWD
in host to/home/ninerules
in the container.- Note that
$PWD
must be the absolute path.
- Note that
$ docker run --rm -v "$PWD":/home/ninerules tamada/9rules:latest src/main/java
src/main/java
shows the source directory of the 9rules
project.
-
Clone the project from GitHub.
-
Change directory to cloned project.
-
Run the following command to build the project.
-
Commands
$ git clone git@github.com:tamada/9rules.git
$ cd 9rules
$ mvn package
- Platform
- Java 8 (unconfirmed in Java 9 platform)
- Maven 3.x
- Dependencies
- JDT Core 3.10.0
- Dependencies (Unit Test)
- JUnit 4.12
- Hamcrest all 1.3
- Fork it (http://github.com/tamada/9rules)
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -m 'Add some feature'
) - Run test suite (
mvn package
) - Push to the branch (
git push origin my-new-feature
) - Create new pull request
Apache License v 2.0
- Haruaki Tamada
このツールは,オブジェクト指向プログラミングエクササイズで言われている9つのルールが遵守できているかを確認するツールです.
ThoughtWorksアンソロジー ――アジャイルとオブジェクト指向によるソフトウェアイノベーション という本がオライリージャパンから出版されている. その本の第5章にて,オブジェクト指向エクササイズという,ソフトウェア設計を改善する9つのルールが紹介されている. そのルールは次の通りである.
- 1つのメソッドにつき,インデントは一段階とすること.
DONE
else
句を使用しないこと.DONE
- すべてのプリミティブ型と文字列型をラップすること.
DONE
- 1行につき,ドットは1つまでにすること.
DONE
- 名前を省略しないこと.
未実装
- すべてのエンティティを小さくすること.
- 1クラスは50行まで.
DONE
- 1メソッド3行まで.
DONE
- 1つのパッケージには10ファイルまで.
未実装
- 1クラスは50行まで.
- 1つのクラスにつき,インスタンス変数は2つまでにすること.
DONE
- ファーストクラスコレクションを使用すること.
DONE
- Getter,Setter,プロパティを使用しないこと.
DONE
残念ながら,これらのルールに従っているかを確認する方法は目視のみでした. そのため,与えられた Java ソースコードが上記ルールに従っているかを自動的に検証するため,このツールを作成しました. なお,このツール自体も,上記ルールに従うよう作成しています.
以下のデモでは,サンプルソースコードが 9rules のルールに従っているかを確認しています. この実行結果を得るには,9rules プロジェクトのトップディレクトリにて同じコマンドを入力してください.
実行しているコマンドは次の通りです.
$ tree src/test/resources/hello/src/main/java/
// tree コマンドの結果が表示される.
$ java -jar target/9rules-1.0-SNAPSHOT.jar src/test/resources/hello/src/main/java/
// ... 途中省略
src/test/resources/hello/src/main/java/sample/hello/HelloWorld.java
line: 10, setter method found.
line: 14, getter method found.
line: 18, method is too long (over 3 lines).
// ... 途中省略
$ cat -n src/test/resources/hello/src/main/java/sample/hello/HelloWorld.java
// ソースコードの内容を確認している.
2つ目のコマンドが実際に実行しているところです.
実行結果の,src/test/resources/hello/src/main/java/sample/hello/HelloWorld.java
を見てみましょう.
ルールの違反が3つあると出力されています.これはつまり以下の内容が指摘されています.
指摘された違反が正しいかを実際にソースコードをみて確認してください.
- 10行目に setter メソッドが見つかった.
- 14行目に getter メソッドが見つかった.
- 18行目のメソッドが長い(3行を超えている)
- プログラムを実行するには,
java
コマンドの-jar
オプションに 9rules-1.X.jar を指定してください.$ java -jar target/9rules-1.X.jar <TARGET SOURCE DIR...>
<TARGET SOURCE DIR...>
には複数のディレクトリや,Javaのソースファイルを指定できます.
ヘルプメッセージは次の通りです.
java -jar 9rules.jar [OPTIONS] <ARGUMENTS...>
OPTIONS:
--strict: Strictly level check (Default).
--general: General level check.
--rough: Rough level check.
--help: Print this message and exit.
ARGUMENTS:
Directories include Java source files, and Java source files.
上記に示した9つのルールの遵守が難しい場合は,オプションの指定で,違反レベルを下げることも可能です. If it is hard to obey the rules shown in above, we can lower the validating level by specifying the option.
--strict
オプション(デフォルト)では,上記に示したルールで検証します.--general
オプションでは,次のルールで検証します.- 1つのメソッドにつき,インデントは一段階とすること(
---strict
と同じ). else
句を使用しないこと(---strict
と同じ).- すべてのプリミティブ型と文字列型をラップすること(
---strict
と同じ). - 1行につき,ドットは2つまでにすること(緩和).
- 名前を省略しないこと.
未実装
- すべてのエンティティを小さくすること.
- 1クラスは70行まで(緩和).
- 1メソッド5行まで(緩和).
- 1つのパッケージには20ファイルまで.
未実装
- 1つのクラスにつき,インスタンス変数は3つまでにすること(緩和).
- ファーストクラスコレクションを使用すること(
---strict
と同じ). - Getter,Setter,プロパティを使用しないこと(
---strict
と同じ).
- 1つのメソッドにつき,インデントは一段階とすること(
- The rough level is lowered as follows.
- 1つのメソッドにつき,インデントは2段階とすること(緩和).
else
句を使用しないこと(---strict
と同じ).- すべてのプリミティブ型と文字列型をラップすること(
---strict
と同じ). - 1行につき,ドットは3つまでにすること(更に緩和).
- 名前を省略しないこと.
未実装
- すべてのエンティティを小さくすること.
- 1クラスは100行まで(更に緩和).
- 1メソッド10行まで(更に緩和).
- 1つのパッケージには30ファイルまで.
未実装
- 1つのクラスにつき,インスタンス変数は4つまでにすること(更に緩和).
- ファーストクラスコレクションを使用すること(
---strict
と同じ). - Getter,Setter,プロパティを使用しないこと(
---strict
と同じ).
-
GitHub からプロジェクトをクローンしてください.
-
クローンしてできたディレクトリに移動してください.
-
Mavenコマンドを実行し,プロジェクトをビルドしてください.
-
上記の手順は以下のコマンドを実行するのと同じです.
$ git clone git@github.com:tamada/9rules.git
$ cd 9rules
$ mvn package
- Platform
- Java 8(Java 9は未確認です)
- Maven 3.x
- Dependencies
- JDT Core 3.10.0
- Dependencies (Unit Test)
- JUnit 4.12
- Hamcrest all 1.3
- プロジェクトをフォークしてください.(https://github.com/tamada/9rules)
- フィーチャーブランチを作成してください.(
git checkout -b my-new-feature
) - プロジェクトに変更を加え,コミットしてください.(
git commit -m 'Add some feature'
) - 全てのテストが成功することを確認しましょう.(
mvn package
) - ブランチを GitHub に push してください.(
git push origin my-new-feature
) - 新たにプルリクエストを発行してください.
Apache License v 2.0
- Haruaki Tamada