はじめに
CleanArchitectureってなに?という話はこの辺を参照
で、CleanArchitectureの最大の問題は、きっちりやろうとすればするほど、クラス数が増えていくということ。
Kotlinを導入してせっかくコード量が減るのに、クラス数が増えることで作業が増えてしまえば、旨味が減ってしまう。
しかもAndroid-Studio(Ver3.0)の対応がまだ途中なのか、微妙にKotlinのクラス作成手順がメンドクサイ
なので、解決策として、CleanArchitecture用のテンプレートを用意し、極力クラス作成に関わる作業を簡略化し、必要最低限の作業で必要なクラスを一括で作成できるようにした。
ちなみにこの記事の内容はGithubのREADMEの内容をほぼそのまんま持ってきてます。
諸々置き場
ココ
https://github.com/kiuchikeisuke/Android-Studio-CleanArchitecture-template-forKotlin
前提条件
- Kotlin(Android-Studio 3.0を推奨)
- Dagger2
- RxJava2
- KotterKnife (非必須ではあるが強く推奨)
インストール
Macの人
以下のコマンドで終わり
./install.sh
手動の場合は以下の5つのフォルダを、
$ANDROID_STUDIO_FOLDER$/Contents/plugins/android/lib/templates/activities/
に貼り付ける
BaseCleanArchitectureTemplateKotlin
DataTemplateKotlin
DomainTemplateKotlin
PresenterActivityTemplateKotlin
PresenterServiceTemplateKotlin
Windowsの人
手動で以下の5つのフォルダを、
$ANDROID_STUDIO_FOLDER$\plugins\android\lib\templates\activities\
に貼り付ける
BaseCleanArchitectureTemplateKotlin
DataTemplateKotlin
DomainTemplateKotlin
PresenterActivityTemplateKotlin
PresenterServiceTemplateKotlin
使い方
1.ベーステンプレートを作成する
テンプレート>Activity>CleanArchitectureTemplate
を選択する
もし、新規作成する場合は、以下の画面でCleanArchitectureTemplate
を選ぶ
その後、各種設定を行う
- Application Class Name -> ルートとなるApplicationクラス名を設定。任意でOK
- Create kotlin src dir? -> kotlin用のディレクトリを作成するかどうか。事前に作っていない場合はチェックする
- Need Realm? -> Realm を使うかどうか。使うならチェックする
- Need Retrofit2? -> Retrofit2 を使うかどうか。使うならチェックする
- Use Swagger? -> RetrofitのAPIがSwagger(RxJava2使用) で生成する場合はチェックする
設定が終わったらFinishクリック
2. build.gradleを修正する
以前、「AndroidStudio3.0 CanaryでKotlin開発の事始め」でも触れたように、kotlinのデフォルトバージョンが古いためビルドエラーが発生するケースがあるので、build.gradleを修正する
buildscript {
// ext.kotlin_version = '1.1.2-3' 元の記載
ext.kotlin_version = '1.1.2-4'
repositories {
maven { url 'https://maven.google.com' }
jcenter()
}
同様に、app/build.gradleのapplyの記載がおかしくなることがあるのでこれも修正する(原因がわからないのでもし知っているからいたら情報を。。。)
- apply {
- plugin: 'com.android.application'
- plugin: 'realm-android'
- }
-
- apply {
- plugin: 'kotlin-android'
- plugin: 'kotlin-kapt'
- }
+ apply plugin: 'com.android.application'
+ apply plugin: 'realm-android'
+ apply plugin: 'kotlin-android'
+ apply plugin: 'kotlin-kapt'
各種テンプレートの使い方
一部のテンプレートはユーザー作業が必要なので注意
DataTemplateKotlin
ウィザードに沿っていくと、XXXDataSource,XXXDataRepositoryというクラスが作成される。
で、XXXDataSourceクラスを見ると、以下のような記載がある
/* FIXME MUST add below method to RepositoryModules */
// @Provides fun provideMainDataSource(repository: MainRepository): MainDataSource = repository
注意書きの通りにコメントアウトされている、@Provides fun provideMainDataSource(repository: MainRepository): MainDataSource = repository
の記載をコピーし、RepositoryModulesクラスに貼り付ければOK
DataLayerはDomainLayerに対してI/Oを提供する
DomainTemplateKotlin
dataLayerに対してInputが必要かどうか、PresenterLayerに対してOutputを行うかどうかのチェックによってそれぞれ、IoUsecaseClass / InputOnlyUseCaseClass / OutputOnlyUseCaseClass /SimpleUseCaseClass のいずれかが作られる
DomainLayerはビジネスロジックを実装し、DataLayerとPresenterLayerをつなぐ役割を持つ
PresenterActivityTemplateKotlin
PresenterLayerのActivityのテンプレートを作成する
ウィザードに沿って入力すると、ComponentClass, ContractClass, ModuleClass, PresenterClass, ActivityClass, FragmentClass, fragment.xmlが作られる
で、ActivityClassを見ると以下のような記載がある
/* FIXME 1st:MUST add below method to RootComponent */
// fun newSomeComponent(module: SomeModule): SomeComponent
/* FIXME 2nd:initialize SomeComponent like this */
(application as MainApplication).rootComponent
.newSomeComponent(SomeModule(fragment as SomeContract.View))
.inject(fragment)
注意書き1の通りにコメントアウトされている、fun newSomeComponent(module: SomeModule): SomeComponent
の記載をコピーし、RootComponentクラスに貼り付ける
その後、注意書き2の部分のMainApplicationを正しいものに修正する
PresenterServiceTemplateKotlin
PresenterLayerのServiceのテンプレートを作成する
ウィザードに沿って入力していくと、ComponentClass, ContractClass, ModuleClass, PresenterClass, ServiceClassが作られる。
で、ServiceClassを見ると以下のような記載がある。
/* FIXME 1st:MUST add below method to RootComponent */
// fun newMainComponent(module: MainModule): MainComponent
/* FIXME 2nd:initialize MainComponent like this */
(application as MainApplication).rootComponent
.newMainComponent(MainModule(this)).inject(this)
注意書き1の通りにコメントアウトされている、fun newMainComponent(module: MainModule): MainComponent
の記載をコピーし、RootComponentクラスに貼り付ける
その後、注意書き2の部分のMainApplicationを正しいものに修正する
Example
Exampleフォルダの下に簡単なサンプルを用意したので、各クラスを具体的にどう実装するかはそちらを参考にした方がよいかと。
サンプルの内容は、Input1ボタンを押したらTextViewに「Input 1」を、Input0ボタンを押したらTextViewに「Input 0」を表示するという内容。
いずれRetrofitを使ったサンプルも作ろうかなぁとは思わなくもない・・・かもしれない.