学習用ランチャーアプリ設計書(設計パターン学習用・フレームワーク非使用)

1. 概要・目的

本アプリはシステム設計・設計パターン学習用のWindowsデスクトップ向けランチャーアプリです。
フレームワーク(React/Vue等)は一切使用せず素のJavaScriptで「コンポーネント管理」「基底クラス継承構造」「設計パターン」を学ぶことを目的とします。
学習教材・サンプル実装として、拡張性・保守性・設計パターンの理解を重視します。

2. 設計思想

3. 主な機能

4. システム構成・コンポーネント

4.1 メインロジック(Node.js側)

コンポーネント名役割
BaseManagerすべてのマネージャーの基底クラス。共通の初期化・データ管理・エラーハンドリング等を定義。各マネージャーはこれを継承し、共通ルールに従う。
LauncherManagerランチャー項目のCRUD・起動管理(BaseManagerを継承)
GroupManagerグループ(カテゴリ)管理(BaseManagerを継承)
UsageHistoryManager履歴記録・集計(BaseManagerを継承)
PluginManagerプラグインの検出・登録(BaseManagerを継承)
UIStateManagerUI状態(テーマ・画面等)の管理(BaseManagerを継承)
SecurityManager外部起動警告・データ暗号化等(BaseManagerを継承)

4.2 UIコンポーネント(HTML/JS)

コンポーネント名役割・特徴(API経由でデータ取得・操作依頼)
BaseComponentすべてのUIコンポーネントの基底クラス。共通のライフサイクル・バリデーション・イベントハンドラ等を定義。各UIコンポーネントはこれを継承。
LauncherListランチャーアイテムの一覧表示・操作(BaseComponentを継承)
LauncherItem個別アイテムの表示・操作(BaseComponentを継承)
GroupTabsグループ切り替えUI(BaseComponentを継承)
SearchBar検索・フィルタ入力(BaseComponentを継承)
SettingsPanel設定画面(BaseComponentを継承)
EditDialogアイテム編集・新規登録ダイアログ(BaseComponentを継承)
ThemeProviderテーマ管理(BaseComponentを継承)
AppShell全体レイアウト・UI構成管理(BaseComponentを継承)。
すべてのUIコンポーネント(DropZone, LauncherList等)の登録・生成・ライフサイクル管理を一元的に行う親コンポーネント。
新しいUI部品もAppShellに登録するだけで全体管理下に組み込める。
DropZoneドラッグ&ドロップでWindowsアプリ(.lnk, .exe)を登録する専用コンポーネント。
ドロップされたファイルがアプリ(.lnk, .exe)かどうかを判定し、必要な情報(パス、名前、アイコン等)を抽出してランチャーに登録する。
ファイルパスの取得には、ElectronのwebUtils API(IPC経由)を利用する。
(セキュリティ上、レンダラープロセスから直接ファイルパスを取得せず、preloadスクリプトやIPC経由でメインプロセスに処理を依頼する設計とする)

4.3 IPC通信設計(Electron)

5. ディレクトリ構成(例)

StartPilot/
  src/
    main/
      managers/
        baseManager.js
        launcherManager.js
        groupManager.js
        usageHistoryManager.js
        pluginManager.js
        uiStateManager.js
        securityManager.js
      data/
        launcher_items.json
        usage_history.json
        groups.json
      plugins/
    renderer/
      components/
        BaseComponent.js
        LauncherList.js
        LauncherItem.js
        GroupTabs.js
        SearchBar.js
        SettingsPanel.js
        EditDialog.js
        ThemeProvider.js
        AppShell.js
        DropZone.js
      locales/
        ja.json
        en.json
      index.html
    index.js
  package.json
  ...

6. データ設計

6.1 保存方式

6.2 ランチャーアイテム例

{
  "id": "uuid",
  "name": "MyApp",
  "type": "app",
  "path": "C:\\Program Files\\MyApp\\MyApp.exe",
  "args": ["--mode", "debug"],
  "icon": "myapp.png",
  "group": "業務",
  "tags": ["業務", "カスタム"],
  "lastUsed": "2024-06-01T12:34:56Z",
  "useCount": 42
}

※ ドラッグ&ドロップで登録した場合、pathやname、iconは自動取得される。

6.3 グループ例

{
  "id": "uuid",
  "name": "開発"
}

6.4 操作履歴例

{
  "timestamp": "2024-06-01T12:34:56Z",
  "action": "launch",
  "target": "C:\\Program Files\\Microsoft VS Code\\Code.exe"
}

7. API設計(学習用)

主なAPI例

メソッド機能パラメータ例
getItems()ランチャー一覧取得
addItem(item)ランチャー追加{ name, type, ... }
editItem(id, item)ランチャー編集{ ... }
deleteItem(id)ランチャー削除
launchItem(id)ランチャー起動
getGroups()グループ一覧取得
setTheme(theme)テーマ切り替え"dark"等

8. プラグイン・多言語対応(学習用)

9. セキュリティ設計(学習用)

10. テスト・運用(学習用)

11. UI設計・コンポーネント管理

AppShell(画面全体の親)
├─ GroupTabs
├─ SearchBar
├─ LauncherList
│   ├─ LauncherItem
│   ├─ LauncherItem
│   └─ ...
├─ SettingsPanel
├─ EditDialog
├─ DropZone(ここに.lnkや.exeをドラッグ&ドロップで登録)
└─ ...他の部品

DropZoneに.lnkや.exeファイルをドラッグ&ドロップすることで、アプリ登録が直感的に行える。
ファイルパスの取得はwebUtils API(IPC経由)で行い、セキュリティを確保する。

DropZoneの実装イメージ(webUtils API利用)

// preload.js
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
  getDroppedFiles: (event) => ipcRenderer.invoke('webUtils.getDroppedFiles', event)
});

// DropZone.js(レンダラー側)
this.root.ondrop = async (e) => {
  e.preventDefault();
  const files = await window.electronAPI.getDroppedFiles(e);
  // files配列から.lnkや.exeを判定・登録
};

参考: Electron API レシピブック - ファイルのドラッグ&ドロップ (webUtils)

12. 今後の拡張(学習用)

13. 基底クラス設計方針(学習用)

13.1 ロジック層:BaseManager

13.2 UI層:BaseComponent

13.3 今後の拡張性・保守性への配慮

14. コンポーネント管理とUI表示設計

14.1 コンポーネント管理の仕組み

14.2 UI表示の設計方針

14.3 UI表示の例

この設計により、各コンポーネントは独自のUI表示・HTMLタグ構造を持ち、index.htmlは全体の箱として機能する。UIの拡張やカスタマイズも容易。