313 lines
8.7 KiB
Markdown
313 lines
8.7 KiB
Markdown
|
|
# Phase 21: ソースコード⇔データベース完全可逆変換システム
|
|||
|
|
|
|||
|
|
## 📋 概要
|
|||
|
|
|
|||
|
|
データベース駆動開発の最大の課題であるGit互換性を、**完全可逆変換**によって根本的に解決する革新的アプローチ。
|
|||
|
|
ソースコードとデータベースを自在に行き来できることで、両方の利点を最大限に活用する。
|
|||
|
|
|
|||
|
|
## 🎯 核心的なアイデア
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
ソースコード(.nyash) ⇔ データベース(SQLite)
|
|||
|
|
↓ ↓
|
|||
|
|
Git管理 高速リファクタリング
|
|||
|
|
エディタ編集 構造化分析
|
|||
|
|
既存ツール互換 AI最適化
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**重要な原則:**
|
|||
|
|
- ソースコード → DB → ソースコードで100%元に戻る(情報の欠落なし)
|
|||
|
|
- 開発者は好きな方式(ファイルまたはDB)を自由に選択可能
|
|||
|
|
- Git運用は完全に従来通り(テキストファイルとしてコミット)
|
|||
|
|
|
|||
|
|
## 🏗️ 技術設計
|
|||
|
|
|
|||
|
|
### 1. 完全可逆変換の要件
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box ReversibleConverter {
|
|||
|
|
// 変換の基本原則
|
|||
|
|
verify(sourceCode) {
|
|||
|
|
local db = me.sourceToDb(sourceCode)
|
|||
|
|
local restored = me.dbToSource(db)
|
|||
|
|
return sourceCode == restored // 必ずtrue
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. メタデータの完全保存
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- コード構造
|
|||
|
|
CREATE TABLE code_structure (
|
|||
|
|
id INTEGER PRIMARY KEY,
|
|||
|
|
entity_type TEXT, -- 'box', 'method', 'field'
|
|||
|
|
entity_id INTEGER,
|
|||
|
|
source_order INTEGER,
|
|||
|
|
indentation_level INTEGER,
|
|||
|
|
line_start INTEGER,
|
|||
|
|
line_end INTEGER,
|
|||
|
|
column_start INTEGER,
|
|||
|
|
column_end INTEGER
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- スタイル情報
|
|||
|
|
CREATE TABLE style_metadata (
|
|||
|
|
id INTEGER PRIMARY KEY,
|
|||
|
|
entity_id INTEGER,
|
|||
|
|
whitespace_before TEXT,
|
|||
|
|
whitespace_after TEXT,
|
|||
|
|
line_endings TEXT, -- '\n' or '\r\n'
|
|||
|
|
indentation_style TEXT, -- 'space' or 'tab'
|
|||
|
|
indentation_width INTEGER
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- コメント保存
|
|||
|
|
CREATE TABLE comments (
|
|||
|
|
id INTEGER PRIMARY KEY,
|
|||
|
|
entity_id INTEGER,
|
|||
|
|
comment_type TEXT, -- 'line', 'block', 'doc'
|
|||
|
|
content TEXT,
|
|||
|
|
position TEXT, -- 'before', 'after', 'inline'
|
|||
|
|
line_number INTEGER,
|
|||
|
|
column_number INTEGER
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 元のソース(差分検証用)
|
|||
|
|
CREATE TABLE original_sources (
|
|||
|
|
file_path TEXT PRIMARY KEY,
|
|||
|
|
content_hash TEXT,
|
|||
|
|
full_content TEXT,
|
|||
|
|
last_synced TIMESTAMP
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 変換アルゴリズム
|
|||
|
|
|
|||
|
|
#### ソース → DB
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box SourceToDbConverter {
|
|||
|
|
convert(filePath, sourceCode) {
|
|||
|
|
// 1. AST解析
|
|||
|
|
local ast = Parser.parseWithFullInfo(sourceCode)
|
|||
|
|
|
|||
|
|
// 2. 構造抽出
|
|||
|
|
local boxes = me.extractBoxes(ast)
|
|||
|
|
local methods = me.extractMethods(ast)
|
|||
|
|
local dependencies = me.analyzeDependencies(ast)
|
|||
|
|
|
|||
|
|
// 3. メタデータ抽出
|
|||
|
|
local metadata = {
|
|||
|
|
comments: me.extractComments(sourceCode),
|
|||
|
|
whitespace: me.extractWhitespace(sourceCode),
|
|||
|
|
style: me.detectCodingStyle(sourceCode),
|
|||
|
|
positions: me.mapSourcePositions(ast)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 4. DB保存(トランザクション)
|
|||
|
|
me.db.transaction {
|
|||
|
|
me.saveStructure(boxes, methods)
|
|||
|
|
me.saveMetadata(metadata)
|
|||
|
|
me.saveDependencies(dependencies)
|
|||
|
|
me.saveOriginal(filePath, sourceCode)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### DB → ソース
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box DbToSourceConverter {
|
|||
|
|
convert(filePath) {
|
|||
|
|
// 1. 構造読み込み
|
|||
|
|
local structure = me.db.loadStructure(filePath)
|
|||
|
|
local metadata = me.db.loadMetadata(filePath)
|
|||
|
|
|
|||
|
|
// 2. ソース再構築
|
|||
|
|
local builder = new SourceBuilder(metadata.style)
|
|||
|
|
|
|||
|
|
for entity in structure.entities {
|
|||
|
|
// 元の位置情報を使って再配置
|
|||
|
|
builder.addEntity(entity, metadata.positions[entity.id])
|
|||
|
|
|
|||
|
|
// コメントの復元
|
|||
|
|
for comment in metadata.comments[entity.id] {
|
|||
|
|
builder.addComment(comment)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 空白の復元
|
|||
|
|
builder.applyWhitespace(metadata.whitespace[entity.id])
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return builder.toString()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. スタイルの扱い
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box StylePreserver {
|
|||
|
|
modes: {
|
|||
|
|
EXACT: "完全保持", // 空白・改行すべて元通り
|
|||
|
|
NORMALIZE: "正規化", // フォーマッタ適用
|
|||
|
|
HYBRID: "ハイブリッド" // コメント保持+コード正規化
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
preserveStyle(source, mode) {
|
|||
|
|
switch mode {
|
|||
|
|
case EXACT:
|
|||
|
|
return me.captureEverything(source)
|
|||
|
|
case NORMALIZE:
|
|||
|
|
return me.formatCode(source)
|
|||
|
|
case HYBRID:
|
|||
|
|
return me.preserveComments(me.formatCode(source))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔄 同期メカニズム
|
|||
|
|
|
|||
|
|
### 1. リアルタイム同期
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box FileSyncDaemon {
|
|||
|
|
watchers: MapBox
|
|||
|
|
|
|||
|
|
birth() {
|
|||
|
|
me.watchers = new MapBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
watch(directory) {
|
|||
|
|
local watcher = new FileWatcher(directory)
|
|||
|
|
|
|||
|
|
watcher.on("change") { event ->
|
|||
|
|
if event.file.endsWith(".nyash") {
|
|||
|
|
me.syncFileToDb(event.file)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
watcher.on("db_change") { event ->
|
|||
|
|
if not event.fromFile {
|
|||
|
|
me.syncDbToFile(event.entity)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
me.watchers.set(directory, watcher)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Git統合
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# .git/hooks/pre-commit
|
|||
|
|
#!/bin/bash
|
|||
|
|
nyash sync --db-to-files --verify
|
|||
|
|
|
|||
|
|
# .git/hooks/post-checkout
|
|||
|
|
#!/bin/bash
|
|||
|
|
nyash sync --files-to-db --incremental
|
|||
|
|
|
|||
|
|
# .git/hooks/post-merge
|
|||
|
|
#!/bin/bash
|
|||
|
|
nyash sync --files-to-db --full
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 差分最適化
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 変更追跡
|
|||
|
|
CREATE TABLE sync_status (
|
|||
|
|
entity_id INTEGER PRIMARY KEY,
|
|||
|
|
file_modified TIMESTAMP,
|
|||
|
|
db_modified TIMESTAMP,
|
|||
|
|
sync_status TEXT, -- 'synced', 'file_newer', 'db_newer', 'conflict'
|
|||
|
|
last_sync_hash TEXT
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 差分計算の高速化
|
|||
|
|
CREATE INDEX idx_sync_status ON sync_status(sync_status, file_modified);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚀 実装段階
|
|||
|
|
|
|||
|
|
### Phase 1: 基本的な可逆変換(1ヶ月)
|
|||
|
|
- Box/メソッドレベルの変換
|
|||
|
|
- コメントなし、インデント固定
|
|||
|
|
- 単体テストで100%可逆性検証
|
|||
|
|
|
|||
|
|
### Phase 2: メタデータ保持(1ヶ月)
|
|||
|
|
- コメントの位置と内容を保存
|
|||
|
|
- インデントスタイルの保持
|
|||
|
|
- 改行コードの維持
|
|||
|
|
|
|||
|
|
### Phase 3: 完全なスタイル保存(1ヶ月)
|
|||
|
|
- 任意の空白パターン対応
|
|||
|
|
- コーディングスタイルの自動検出
|
|||
|
|
- チーム規約との調整機能
|
|||
|
|
|
|||
|
|
### Phase 4: 高度な同期(2ヶ月)
|
|||
|
|
- 増分同期アルゴリズム
|
|||
|
|
- コンフリクト解決UI
|
|||
|
|
- パフォーマンス最適化
|
|||
|
|
|
|||
|
|
## 📊 利点の整理
|
|||
|
|
|
|||
|
|
### 開発者にとって
|
|||
|
|
- **選択の自由**: ファイル編集もDB操作も可能
|
|||
|
|
- **既存ツール互換**: VSCode、Vim、Git等すべて使える
|
|||
|
|
- **高速リファクタリング**: 必要な時だけDB機能を活用
|
|||
|
|
|
|||
|
|
### システムにとって
|
|||
|
|
- **Git完全互換**: 通常のテキストファイルとして管理
|
|||
|
|
- **増分コンパイル**: DB側で依存関係を高速解析
|
|||
|
|
- **AI連携強化**: 構造化データで学習効率UP
|
|||
|
|
|
|||
|
|
### チームにとって
|
|||
|
|
- **移行リスクなし**: 段階的導入が可能
|
|||
|
|
- **レビュー互換**: PRは従来通りのテキスト差分
|
|||
|
|
- **柔軟な運用**: プロジェクト毎に最適な方式を選択
|
|||
|
|
|
|||
|
|
## 🎯 成功の指標
|
|||
|
|
|
|||
|
|
1. **完全可逆性**: 1000ファイルで往復変換してもバイト単位で一致
|
|||
|
|
2. **パフォーマンス**: 1000行のファイルを100ms以内で変換
|
|||
|
|
3. **互換性**: 既存のNyashプロジェクトがそのまま動作
|
|||
|
|
4. **開発者満足度**: 90%以上が「便利」と評価
|
|||
|
|
|
|||
|
|
## 🔮 将来の拡張
|
|||
|
|
|
|||
|
|
### 意味的な可逆変換
|
|||
|
|
- コードの意味を保ちながらスタイルを自動最適化
|
|||
|
|
- チーム規約への自動適応
|
|||
|
|
- リファクタリング履歴の保存
|
|||
|
|
|
|||
|
|
### マルチビュー編集
|
|||
|
|
```nyash
|
|||
|
|
// 同じコードを異なる視点で編集
|
|||
|
|
- ファイルビュー: 従来のテキストエディタ
|
|||
|
|
- 構造ビュー: Box/メソッドのツリー表示
|
|||
|
|
- 依存ビュー: グラフィカルな関係表示
|
|||
|
|
- クエリビュー: SQLで直接操作
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### バージョン管理の革新
|
|||
|
|
- 意味的な差分表示(「名前を変更」vs「全行変更」)
|
|||
|
|
- 構造認識マージ(メソッド単位での自動解決)
|
|||
|
|
- リファクタリング履歴の永続化
|
|||
|
|
|
|||
|
|
## 📝 実装優先順位
|
|||
|
|
|
|||
|
|
1. **コア変換エンジン**: 可逆性の証明
|
|||
|
|
2. **メタデータ設計**: 完全な情報保存
|
|||
|
|
3. **同期デーモン**: リアルタイム連携
|
|||
|
|
4. **開発ツール**: CLI/IDE統合
|
|||
|
|
5. **最適化**: パフォーマンスチューニング
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
この可逆変換システムにより、データベース駆動開発の利点を最大化しながら、既存の開発フローとの完全な互換性を実現できるにゃ!
|