45
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kotlin用のCleanArchitectureのテンプレート作ったよ!

Last updated at Posted at 2017-06-13

はじめに

CleanArchitectureってなに?という話はこの辺を参照
で、CleanArchitectureの最大の問題は、きっちりやろうとすればするほど、クラス数が増えていくということ。
Kotlinを導入してせっかくコード量が減るのに、クラス数が増えることで作業が増えてしまえば、旨味が減ってしまう。
しかもAndroid-Studio(Ver3.0)の対応がまだ途中なのか、微妙にKotlinのクラス作成手順がメンドクサイ

なので、解決策として、CleanArchitecture用のテンプレートを用意し、極力クラス作成に関わる作業を簡略化し、必要最低限の作業で必要なクラスを一括で作成できるようにした。

ちなみにこの記事の内容はGithubのREADMEの内容をほぼそのまんま持ってきてます。

諸々置き場

ココ
https://github.com/kiuchikeisuke/Android-Studio-CleanArchitecture-template-forKotlin

前提条件

インストール

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を選択する
selectBaseTemplate.png

もし、新規作成する場合は、以下の画面でCleanArchitectureTemplateを選ぶ
createNewPrj.png

その後、各種設定を行う

  • 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を修正する
gradleError.png

root/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の記載がおかしくなることがあるのでこれも修正する(原因がわからないのでもし知っているからいたら情報を。。。)

app/build.gradle
- 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

DataLayerのテンプレートを作成する
dataTemplate.png

ウィザードに沿っていくと、XXXDataSource,XXXDataRepositoryというクラスが作成される。

で、XXXDataSourceクラスを見ると、以下のような記載がある

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

DomainLayerのテンプレートを作成する
domainUsecaseTemplate.png

dataLayerに対してInputが必要かどうか、PresenterLayerに対してOutputを行うかどうかのチェックによってそれぞれ、IoUsecaseClass / InputOnlyUseCaseClass / OutputOnlyUseCaseClass /SimpleUseCaseClass のいずれかが作られる

DomainLayerはビジネスロジックを実装し、DataLayerとPresenterLayerをつなぐ役割を持つ

PresenterActivityTemplateKotlin

PresenterLayerのActivityのテンプレートを作成する
presenterActivityTemplate.png

ウィザードに沿って入力すると、ComponentClass, ContractClass, ModuleClass, PresenterClass, ActivityClass, FragmentClass, fragment.xmlが作られる

で、ActivityClassを見ると以下のような記載がある

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のテンプレートを作成する
presenterServiceTemplate.png

ウィザードに沿って入力していくと、ComponentClass, ContractClass, ModuleClass, PresenterClass, ServiceClassが作られる。

で、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を使ったサンプルも作ろうかなぁとは思わなくもない・・・かもしれない.

45
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?