/Loki

サ活記録アプリ for iOS

Primary LanguageSwift

Loki

Release Platform Twitter

Logo

Loki(ロキ)は、サ活の記録に特化したアプリです。

Download on the App Store

目次

スクリーンショット

スクリーンショット

ライト

サ活一覧 サ活登録 設定

ダーク

サ活一覧 サ活登録 設定

開発

誰でもこのプロジェクトを開発できます。

必要条件

  • macOS 13.5+
  • Xcode 15.0 (Swift 5.9)
  • Make

構成

  • UIの実装: SwiftUI
  • アーキテクチャ: MVVM
  • ブランチモデル: GitHub flow

セットアップ

  1. このプロジェクトをクローンします。

    $ git clone https://github.com/uhooi/Loki.git
    $ cd Loki
  2. Swiftプロジェクトの高速ビルドを有効にします。(任意)

    $ defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1
  3. make setup を実行します。
    セットアップが完了すると、自動的にXcodeでワークスペースが開きます。

モジュール分割

モジュール分割

全体

Module diagram

https://www.figma.com/file/T6xPOXP9b1nzRey05q7ZL9/Loki_module_diagram?node-id=0%3A1&t=ucgi2aKXvCYXOjRD-1

Apps

  • アプリのエントリポイントで、ルートナビゲーションロジックを格納する
  • 基本的にすべてのFeatureモジュールに依存する
  • Dataモジュールに依存してはいけない
  • Coreモジュールに依存していい

参考: https://developer.android.com/topic/modularization/patterns#app-modules

Features

  • 各機能のビューやビューモデルを格納する
  • Appモジュールに依存してはいけない
  • ほかのFeatureモジュールに依存してはいけない
  • DataやCoreモジュールに依存していい

参考: https://developer.android.com/topic/modularization/patterns#feature-modules

Data

  • リポジトリやモデルを格納する
  • AppやFeatureモジュールに依存してはいけない
  • できる限りほかのDataモジュールに依存しない
  • Coreモジュールに依存していい

参考: https://developer.android.com/topic/modularization/patterns#data-modules

Core

  • 複数のモジュールが共通で使う処理を格納する
  • AppやFeature、Dataモジュールに依存してはいけない
  • ほかのCoreモジュールに依存していい

参考: https://developer.android.com/topic/modularization/patterns#common-modules

コーディングルール

コーディングルール

全体

ビュー

共通
  • ビューは単体テストを書かない
    • UIは手動でテストすることが多く、費用対効果に合わないため
  • できる限り分岐( ifswitch )を入れない
    • 単体テストを書かないため
  • できる限り Task { ... } をビューに書く
  • 状態はビューモデルの uiState に集約し、ビューでは保持しない
    • つまり @State を使わず、 @StateObject はビューモデルのみに付ける
    • @Published もビューモデルの uiState のみに付ける
  • できる限り @AppStorage を使わず、UserDefaultsへは Data 層でアクセスする
親ビュー
子ビュー

ビューモデル

パッケージ管理

パッケージ管理

ライブラリ

Swift製
その他
  • できる限り使わない
  • どうしても使う場合、適切に管理する

CLIツール

Swift製
  • Build Tool PluginまたはCommand Pluginで管理する
    • 用意されていない場合は自作してOSSにPRを送る
    • マージされない場合、本リポジトリまたはプラグイン用のリポジトリを作成してコミットする
  • どうしてもPluginを用意できない場合、Mintで管理する
Ruby製
  • できる限り使わない
  • どうしても使う場合、Bundlerで管理する
その他
  • できる限り使わない
  • どうしても使う場合、適切に管理する

貢献

貢献をお待ちしています ☺️