#生成AIでリファクタリングやってみた
企画内容
生成AIを使ってリファクタリングをします。
下記のプロンプトとBeforeのコードからAfterのコードが生成されました。
Afterのコードを採用しますか?
採用する / 採用しない
回答パネルへ理由や感想などの付箋を貼ってください。
AI モデル
Claude Desktop Sonnet4
プロンプト
以下のSwiftコードを分析し、並行処理の安全性を最優先に改善してください。 【重点項目】 - データ競合・race conditionの排除 - Actor modelによる状態保護 - Swift Concurrency(async/await)の活用 - @MainActorによるUI更新の安全性 【出力形式】 問題点:[1文] 改善案:[コードのみ] 効果:[1文] 【コード】 ```swift [ここにコードを挿入] ```
Before
class CounterManager: ObservableObject { @Published var count = 0 private var isProcessing = false func increment() { DispatchQueue.global().async { if !self.isProcessing { self.isProcessing = true Thread.sleep(forTimeInterval: 0.1) DispatchQueue.main.async { self.count += 1 self.isProcessing = false } } } } func decrement() { DispatchQueue.global().async { if !self.isProcessing { self.isProcessing = true Thread.sleep(forTimeInterval: 0.1) DispatchQueue.main.async { self.count -= 1 self.isProcessing = false } } } } func reset() { DispatchQueue.main.async { self.count = 0 self.isProcessing = false } } }
After
@MainActor class CounterManager: ObservableObject { @Published var count = 0 private var isProcessing = false func increment() async { guard !isProcessing else { return } isProcessing = true await Task.detached { try? await Task.sleep(for: .milliseconds(100)) }.value count += 1 isProcessing = false } func decrement() async { guard !isProcessing else { return } isProcessing = true await Task.detached { try? await Task.sleep(for: .milliseconds(100)) }.value count -= 1 isProcessing = false } func reset() { count = 0 isProcessing = false } }
※出力結果から「改善案」のコードのみ抜粋