【初心者向け】アプリ開発の3大原則 - 機密性・完全性・可用性をマスターしよう

# はじめに

アプリ開発で大切な3つの原則をご存知ですか？
- 機密性（Confidentiality）：大切な情報を守る
- 完全性（Integrity）：データを正しく保つ
- 可用性（Availability）：いつでも使えるようにする

これらは「CIAトライアド」と呼ばれる基本原則で、Appleの公式ガイドラインでも重要視されています。
今日は、この3つを誰でも分かるように解説します。

## 1. 機密性：大切な情報を守る

### 例えばこんなとき...
- ユーザーのパスワードを保存したい
- クレジットカード情報を扱いたい
- 個人情報を保存したい

### よくある間違い vs 正しい方法

```swift
// ❌ 危険な方法
class UserManager {
    // メモ帳（UserDefaults）に保存
    func savePassword(_ password: String) {
        UserDefaults.standard.set(password, forKey: "password")
        print("保存したパスワード: \(password)")  // ログにパスワードが出る！
    }
}

// ⭕️ 安全な方法（Appleガイドライン推奨）
class SecureManager {
    // 金庫（Keychain）に保存
    func savePassword(_ password: String) {
        let keychain = KeychainWrapper.standard
        keychain.set(password, forKey: "password")
        print("パスワードを安全に保存しました")  // 安全なログ
    }
}
```

なぜ重要？
- 個人情報が漏れると大問題
- アプリの信頼性が失われる
- 法律違反になることも

参考：[Apple Security Guidelines - Keychain Services](https://developer.apple.com/documentation/security/keychain_services)

## 2. 完全性：データを正しく保つ

### 例えばこんなとき...
- ユーザープロフィールを保存する
- 入力フォームのチェック
- データベースの更新

### よくある間違い vs 正しい方法

```swift
// ❌ 危険な方法
struct UserProfile {
    var name: String    // 空でもOK？
    var age: Int        // マイナスでもOK？
    var email: String   // メール形式じゃなくてもOK？
}

// ⭕️ 安全な方法（Appleガイドライン推奨）
struct UserProfile {
    let name: String
    let age: Int
    let email: String
    
    init?(name: String, age: Int, email: String) {
        // 名前のチェック
        guard name.count >= 1 && name.count <= 50 else {
            return nil
        }
        
        // 年齢のチェック（WHOの統計に基づく）
        guard age >= 0 && age <= 123 else {
            return nil
        }
        
        // メールアドレスのチェック
        guard email.contains("@") && email.contains(".") else {
            return nil
        }
        
        self.name = name
        self.age = age
        self.email = email
    }
}
```

なぜ重要？
- おかしなデータがあるとアプリが壊れる
- 後から直すのが大変
- ユーザーが困る

参考：[Apple Developer Documentation - Data Validation](https://developer.apple.com/documentation/swift/swift_standard_library/operator_declarations)

## 3. 可用性：いつでも使えるように

### 例えばこんなとき...
- 写真をたくさん表示したい
- 通信が切れた
- メモリ不足になりそう

### よくある間違い vs 正しい方法

```swift
// ❌ 危険な方法
class ImageViewer {
    var images: [UIImage] = []  // メモリをどんどん使う
    
    func addImage(_ image: UIImage) {
        images.append(image)  // 制限なし！
    }
}

// ⭕️ 安全な方法（Appleガイドライン推奨）
class ImageViewer {
    // メモリ使用量を制限
    private let imageCache = NSCache<NSString, UIImage>()
    
    init() {
        // デバイスのメモリに応じて制限（Apple推奨）
        imageCache.countLimit = 50
        
        // メモリ警告時の対応
        NotificationCenter.default.addObserver(
            forName: UIApplication.didReceiveMemoryWarningNotification,
            object: nil
        ) { [weak self] _ in
            self?.imageCache.removeAllObjects()
        }
    }
    
    func addImage(_ image: UIImage, key: String) {
        imageCache.setObject(image, forKey: key as NSString)
    }
}
```

なぜ重要？
- アプリが突然終了するのを防げる
- サクサク動作する
- バッテリーの消費も抑えられる

参考：[Apple Developer Documentation - Memory Management](https://developer.apple.com/documentation/foundation/nscache)

## この3つの関係

たとえば、銀行のアプリを考えてみましょう：

1. 機密性
   - 残高は他人に見られない
   - パスワードは安全に保存
   - 通信は暗号化

2. 完全性
   - 送金額は正しい
   - 取引履歴は改ざんされない
   - 計算間違いがない

3. 可用性
   - いつでも送金できる
   - 通信エラーでも再試行
   - アプリが落ちない

## 実践：テストで確認しよう

QualityForwardを使って、以下をチェックします：

1. 機密性のテスト
   - パスワードは金庫（Keychain）に保存されている？
   - 重要な情報がログに出ていない？
   - 個人情報は適切に保護されている？

2. 完全性のテスト
   - データのチェックは適切？
   - 保存したデータは正しく読める？
   - エラー処理は適切？

3. 可用性のテスト
   - メモリ使用量は適切？
   - 通信エラーに対応できている？
   - バックグラウンドでも正しく動く？

## まとめ：これだけは覚えよう！

1. 機密性
   - 重要な情報は必ず「金庫」に
   - ログに気をつける
   - 個人情報を大切に

2. 完全性
   - データは必ずチェック
   - 保存時は慎重に
   - エラー処理を忘れずに

3. 可用性
   - メモリの使用量を意識
   - エラーへの対応を考える
   - 性能を確認する

## おわりに

この3つの原則は、Appleも公式ドキュメントで重視している基本中の基本です。
最初は難しく感じるかもしれませんが、この3つを意識するだけでもアプリの品質は大きく変わります！

## 参考資料

1. [Apple Security Documentation](https://developer.apple.com/documentation/security)
2. [iOS App Development Guidelines](https://developer.apple.com/app-store/review/guidelines/)
3. [Apple Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/)