はじめに
AIに頼ったアプリ開発の経験があまりないため、実験してみました。
仕様
開発環境 : C.net(WinForms)
アプリ仕様 :
winformsで動作 各タスクには子タスクを登録でき、階層は無制限
タスク情報は外部ファイル出力により管理
AIへ質問
まずは設計してもらいます。
プロンプト
C#.netでタスク管理アプリを作成したい。
winformsで動作 各タスクには子タスクを登録でき、階層は無制限としたい。
タスク情報は外部ファイル出力により管理したい。
画面は以下を想定している。
・タスク登録画面
・タスク詳細画面
・タスク一覧画面
・WBS表示
上記より、設計をしてください
回答結果
C#.NET タスク管理アプリ設計(WinForms)
要件から見ると、以下の特徴を持つ業務向けタスク管理システムになります。
WinForms デスクトップアプリ
無制限階層のタスク管理
WBS表示
外部ファイル保存
タスク詳細/一覧/登録画面
将来的な拡張性を考慮
そのため、以下方針を推奨します。
推奨アーキテクチャ
WinFormsでも、ロジック分離を強く推奨します。
TaskManager
├─ Domain ← エンティティ
├─ Services ← 業務ロジック
├─ Infrastructure ← ファイル保存
├─ Forms ← WinForms画面
├─ ViewModels ← 画面用データ
└─ Program.cs
全体構成
TaskManager
├─ Domain
│ ├─ TaskItem.cs
│ ├─ TaskStatus.cs
│ ├─ Priority.cs
│ └─ WbsNode.cs
│
├─ Services
│ ├─ TaskService.cs
│ ├─ WbsService.cs
│ └─ ValidationService.cs
│
├─ Infrastructure
│ ├─ ITaskRepository.cs
│ ├─ JsonTaskRepository.cs
│ └─ FileManager.cs
│
├─ ViewModels
│ ├─ TaskTreeNodeViewModel.cs
│ └─ TaskListItemViewModel.cs
│
├─ Forms
│ ├─ MainForm.cs
│ ├─ TaskListForm.cs
│ ├─ TaskDetailForm.cs
│ ├─ TaskEditForm.cs
│ └─ WbsForm.cs
│
└─ Data
└─ tasks.json
ドメイン設計
TaskItem.cs
最重要クラスです。
無制限階層の考え方
親子関係を ParentTaskId で管理します。
タスクA
├─ タスクB
│ ├─ タスクC
│ │ └─ タスクD
この構造を再帰で扱います。
Repository設計
WinFormsではファイルアクセスを分離すべきです。
JsonTaskRepository.cs
JSON保存推奨です。
理由:
・人間が読める
・デバッグ容易
・階層構造と相性が良い
・DB移行しやすい
[
{
"Id": "xxx",
"Title": "親タスク",
"Children": [
{
"Title": "子タスク"
}
]
}
]
サービス設計:TaskService.cs
役割:
・タスク追加
・更新
・削除
・階層構築
・検索
・ソート
WbsService.cs
WBS表示専用ロジック。
画面設計
- メイン画面:MainForm
役割:
・各画面への遷移
・全体メニュー
構成
+----------------------------------+
| メニュー |
+----------------------------------+
| [一覧] [WBS] [新規作成] |
+----------------------------------+
- タスク一覧画面:TaskListForm
最も利用頻度が高い画面。
推奨UI
+------------------------------------------------------+
| 検索BOX |
+------------------------------------------------------+
| TreeView or DataGridView |
| |
| ▼ 親タスク |
| ▼ 子タスク |
| ▼ 孫タスク |
+------------------------------------------------------+
| [追加] [編集] [削除] |
+------------------------------------------------------+
推奨コントロール
| 用途 | コントロール |
|---|---|
| 階層表示 | TreeView |
| 表形式 | DataGridView |
| 検索 | TextBox |
- タスク詳細画面:TaskDetailForm
表示項目
タスク名
説明
ステータス
優先度
開始日
終了日
進捗率
親タスク
子タスク一覧
UIイメージ
+------------------------------+
| タスク詳細 |
+------------------------------+
| タイトル |
| [____________________] |
| |
| 説明 |
| [ ] |
| [ ] |
| |
| ステータス |
| [InProgress ▼] |
| |
| 進捗率 |
| [===== 50% =====] |
+------------------------------+
- タスク登録/編集画面:TaskEditForm
詳細画面と分離推奨。
理由:
View/Update責務分離
保守しやすい
将来的な入力チェック強化
入力項目
| 項目 | 型 |
|---|---|
| タイトル | TextBox |
| 説明 | TextBox(Multiline) |
| 優先度 | ComboBox |
| ステータス | ComboBox |
| 開始日 | DateTimePicker |
| 終了日 | DateTimePicker |
| 親タスク | TreeView or ComboBox |
- WBS画面:WbsForm
このシステムの核。
WBS表示方法
WinFormsなら以下が現実的。
| 方法 | 推奨度 |
|---|---|
| TreeView | ★★★★★ |
| DataGridView + インデント | ★★★★ |
| Gantt風自作描画 | ★★★ |
推奨構成
+--------------------------------------------------+
| WBS |
+--------------------------------------------------+
| ▼ プロジェクト |
| ├─ 要件定義 |
| ├─ 設計 |
| │ ├─ 基本設計 |
| │ └─ 詳細設計 |
| └─ 実装 |
+--------------------------------------------------+
WBS番号生成:自動採番推奨。
1
1.1
1.1.1
1.1.2
1.2
保存形式設計:JSON推奨
保存タイミング
| タイミング | 推奨 |
|---|---|
| 編集時即保存 | ○ |
| アプリ終了時 | △ |
| 手動保存 | △ |
| 即保存推奨です。 |
将来拡張を考慮した設計
将来追加しやすい機能
| 機能 | 対応しやすさ |
|---|---|
| ガントチャート | ○ |
| SQLite化 | ○ |
| ユーザー管理 | ○ |
| タグ機能 | ○ |
| 通知 | ○ |
| 工数管理 | ○ |
| CSV出力 | ○ |
技術的推奨事項
TreeViewの重要性
無限階層なのでTreeViewが中心になります。
TreeNode node = new TreeNode(task.Title);
node.Tag = task;
再帰処理必須
子タスク表示:
void BuildTree(TreeNode parent, TaskItem task)
{
foreach(var child in task.Children)
{
TreeNode node = new TreeNode(child.Title);
parent.Nodes.Add(node);
BuildTree(node, child);
}
}
推奨NuGet
JSON用:
System.Text.Json
または
Newtonsoft.Json
DB化する場合の推奨
将来的にはSQLite推奨。
理由:
階層検索しやすい
大量タスクに強い
排他制御しやすい
ただし初期はJSONで十分です。
最終推奨構成
以下構成が最もバランス良いです。
項目 推奨
UI WinForms
階層表示 TreeView
保存 JSON
ロジック Service分離
データアクセス Repository
WBS 再帰Tree構造
ID Guid
検索 LINQ
開発順序(重要)
以下順で作ると破綻しにくいです。
- Domain作成
- JSON保存作成
- TaskService作成
- TreeView表示
- タスク登録
- タスク編集
- WBS生成
- 検索
- バリデーション
最後に
今回は一旦設計まで
次回は実際のコードもAIに記載してもらい、実装していきます。