Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away