dramaling-vocab-learning/check-architecture.sh

171 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
# DramaLing 架構健康檢查腳本
echo "🏛️ DramaLing 架構健康檢查"
echo "=================================="
echo "檢查時間: $(date)"
echo ""
# 變數定義
BACKEND_PATH="backend/DramaLing.Api"
SERVICES_PATH="$BACKEND_PATH/Services"
CONTROLLERS_PATH="$BACKEND_PATH/Controllers"
# 計數器
ISSUES=0
WARNINGS=0
# 顏色輔助
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
# 檢查函數
check_service_size() {
echo "📏 檢查服務大小..."
LARGE_SERVICES=$(find "$SERVICES_PATH" -name "*Service.cs" -exec wc -l {} + | awk '$1 > 300 {print $2 " (" $1 " lines)"}')
if [ ! -z "$LARGE_SERVICES" ]; then
echo -e "${YELLOW}⚠️ 發現過大的服務文件:${NC}"
echo "$LARGE_SERVICES"
echo " 建議: 考慮拆分為多個更小的服務"
((WARNINGS++))
else
echo -e "${GREEN}✅ 所有服務大小適中 (< 300行)${NC}"
fi
echo ""
}
check_interface_coverage() {
echo "🎯 檢查介面覆蓋率..."
SERVICE_COUNT=$(find "$SERVICES_PATH" -name "*Service.cs" -not -name "I*Service.cs" | wc -l)
INTERFACE_COUNT=$(find "$SERVICES_PATH" -name "I*Service.cs" | wc -l)
if [ $SERVICE_COUNT -gt 0 ]; then
COVERAGE=$((INTERFACE_COUNT * 100 / SERVICE_COUNT))
if [ $COVERAGE -lt 80 ]; then
echo -e "${YELLOW}⚠️ 介面覆蓋率較低: $COVERAGE% ($INTERFACE_COUNT/$SERVICE_COUNT)${NC}"
echo " 建議: 為服務添加介面定義"
((WARNINGS++))
else
echo -e "${GREEN}✅ 介面覆蓋率良好: $COVERAGE% ($INTERFACE_COUNT/$SERVICE_COUNT)${NC}"
fi
fi
echo ""
}
check_naming_convention() {
echo "🏷️ 檢查命名規範..."
BAD_NAMES=$(find "$SERVICES_PATH" -name "*Helper.cs" -o -name "*Utils.cs" -o -name "*Manager.cs" | grep -v Interface)
if [ ! -z "$BAD_NAMES" ]; then
echo -e "${YELLOW}⚠️ 發現不符規範的命名:${NC}"
echo "$BAD_NAMES"
echo " 建議: 使用 Service 後綴"
((WARNINGS++))
else
echo -e "${GREEN}✅ 命名規範符合標準${NC}"
fi
echo ""
}
check_dependency_patterns() {
echo "🔗 檢查依賴模式..."
# 檢查 Controller 是否直接依賴 Repository
CONTROLLER_REPO_DEPS=$(grep -r "IRepository\|Repository" "$CONTROLLERS_PATH" 2>/dev/null || true)
if [ ! -z "$CONTROLLER_REPO_DEPS" ]; then
echo -e "${RED}❌ 發現 Controller 直接依賴 Repository:${NC}"
echo "$CONTROLLER_REPO_DEPS" | head -3
echo " 建議: Controller 應該通過 Service 層訪問數據"
((ISSUES++))
else
echo -e "${GREEN}✅ Controller 依賴關係正確${NC}"
fi
echo ""
}
check_todo_items() {
echo "📝 檢查 TODO 項目..."
TODO_COUNT=$(find "$BACKEND_PATH" -name "*.cs" -exec grep -l "TODO\|FIXME\|HACK" {} \; | wc -l)
if [ $TODO_COUNT -gt 0 ]; then
echo -e "${YELLOW}⚠️ 發現 $TODO_COUNT 個文件包含 TODO 項目${NC}"
echo " 最近的 TODO:"
find "$BACKEND_PATH" -name "*.cs" -exec grep -n "TODO\|FIXME\|HACK" {} \; | head -3
((WARNINGS++))
else
echo -e "${GREEN}✅ 沒有未完成的 TODO 項目${NC}"
fi
echo ""
}
check_cache_performance() {
echo "⚡ 檢查快取性能..."
if curl -s http://localhost:5008/api/ai/stats > /dev/null 2>&1; then
CACHE_STATS=$(curl -s http://localhost:5008/api/ai/stats)
HIT_RATE=$(echo "$CACHE_STATS" | grep -o '"cacheHitRate":[0-9.]*' | cut -d: -f2)
if [ ! -z "$HIT_RATE" ]; then
HIT_PERCENTAGE=$(echo "$HIT_RATE * 100" | bc -l | cut -d. -f1)
if [ "$HIT_PERCENTAGE" -lt 50 ]; then
echo -e "${YELLOW}⚠️ 快取命中率較低: $HIT_PERCENTAGE%${NC}"
((WARNINGS++))
else
echo -e "${GREEN}✅ 快取命中率良好: $HIT_PERCENTAGE%${NC}"
fi
fi
else
echo -e "${YELLOW}⚠️ 無法連接到後端服務檢查快取狀態${NC}"
((WARNINGS++))
fi
echo ""
}
# 主要檢查流程
main() {
check_service_size
check_interface_coverage
check_naming_convention
check_dependency_patterns
check_todo_items
check_cache_performance
# 總結
echo "=================================="
echo "🏛️ 架構檢查總結:"
if [ $ISSUES -eq 0 ] && [ $WARNINGS -eq 0 ]; then
echo -e "${GREEN}🎉 架構健康度: 優秀${NC}"
echo "✅ 沒有發現架構問題"
exit 0
elif [ $ISSUES -eq 0 ]; then
echo -e "${YELLOW}😊 架構健康度: 良好${NC}"
echo "⚠️ 發現 $WARNINGS 個警告項目"
exit 0
else
echo -e "${RED}😟 架構健康度: 需要改善${NC}"
echo "❌ 發現 $ISSUES 個問題"
echo "⚠️ 發現 $WARNINGS 個警告"
exit 1
fi
}
# 檢查是否在正確目錄
if [ ! -d "$BACKEND_PATH" ]; then
echo -e "${RED}❌ 請在專案根目錄執行此腳本${NC}"
exit 1
fi
# 執行檢查
main