0Pricing
Swift Academy · レッスン

スコープ付きAPIと可読性のパターン

DSL向けに スコープ付きAPI と命名パターンを適用します。名前空間用のトークンを用意し、ヘルパーでまとめ、ブロックを小さく明示的に保ちます。

「スコープ付きAPIと可読性のパターン」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。

DSLのスコープを限定する理由

読みやすいDSLでは、ブロック内でできることを制限し、名前を明確にします。名前空間や小さなヘルパー、グループ化を使って、意図が明確に伝わるようにしてください。

名前空間パターン

トークンをRの下に配置すると、公開するインターフェースを絞り込み、アプリのシンボルとの衝突を防げます。呼び出しも短く、確認しやすくなります。

struct Route { let method: String; let path: String }

// Namespace instead of global free functions
enum R {
    static func GET(_ path: String) -> Route  { Route(method: "GET",  path: path) }
    static func POST(_ path: String) -> Route { Route(method: "POST", path: path) }
}

@resultBuilder
struct RoutesBuilder {
    static func buildBlock(_ parts: Route...) -> [Route] { parts }
}

func routes(@RoutesBuilder _ content: () -> [Route]) -> [Route] { content() }

let table = routes {
    R.GET("/home")
    R.POST("/upload")
}
for r in table { print("\(r.method) \(r.path)") }

グループ化ヘルパー

小さなグループ化ヘルパーを使うと、繰り返しなしでコンテキスト(プレフィックス、タグ)を追加できます。ブロックもすっきり保てます。

// Group routes by a shared prefix using a helper
func section(_ prefix: String, @RoutesBuilder _ content: () -> [Route]) -> [Route] {
    content().map { Route(method: $0.method, path: prefix + $0.path) }
}

let grouped = routes {
    R.GET("/health")
    section("/admin") {
        R.GET("/dashboard")
        R.POST("/upload")
    }
}
for r in grouped { print("\(r.method) \(r.path)") } // /admin/* prefixed

関心を分離する

関心ごと(ルートとミドルウェアなど)ごとに小さなビルダーを使うことを優先してください。各ブロックには必要なものだけを公開します。

// A separate builder for middlewares (keeps concerns isolated)
struct Middleware { let name: String }

@resultBuilder
struct MiddlewareBuilder {
    static func buildBlock(_ parts: Middleware...) -> [Middleware] { parts }
}

enum M {
    static func log(_ name: String) -> Middleware { Middleware(name: "log:\(name)") }
    static func auth() -> Middleware { Middleware(name: "auth") }
}

func middlewares(@MiddlewareBuilder _ content: () -> [Middleware]) -> [Middleware] { content() }

let mw = middlewares {
    M.log("requests")
    M.auth()
}
print(mw.map(\.name))

読みやすさのヒント

パターン:

  • 短い動詞を使います: GET、POST、auth。
  • 1行に1つのアクションだけを記述します。
  • フラットなブロックを優先し、コンテキストを追加する場合にだけネストします。
  • ヘルパーには明示的なラベルを付けます(例: prefix:)。

検証ヘルパー

小さな検証ヘルパーを用意して、ブロックを正しい状態に保ちます。役立つメッセージを表示して、早い段階で失敗させてください。

// Add a simple validator to catch mistakes early
func validate(_ routes: [Route]) -> [String] {
    var issues: [String] = []
    let seen = Set(routes.map { $0.method + " " + $0.path })
    if seen.count != routes.count { issues.append("Duplicate route detected") }
    if routes.contains(where: { !$0.path.hasPrefix("/") }) {
        issues.append("Paths must start with /")
    }
    return issues
}

let issues = validate(grouped)
print(issues.isEmpty ? "OK" : "Issues: \(issues)")

スコープを限定したAPIのパターン

確認問題: DSLブロックをより安全で明確にするのはどの選択肢ですか?

まとめ

まとめ: 名前空間でDSLのスコープを限定し、小さなグループ化ヘルパーを使い、ブロックの目的を絞って、早い段階で検証してください。より安全で読みやすいコードになります。

よくある質問

「スコープ付きAPIと可読性のパターン」レッスンは無料ですか?

はい。「スコープ付きAPIと可読性のパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。

「スコープ付きAPIと可読性のパターン」で何を学びますか?

DSL向けに スコープ付きAPI と命名パターンを適用します。名前空間用のトークンを用意し、ヘルパーでまとめ、ブロックを小さく明示的に保ちます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「スコープ付きAPIと可読性のパターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. result builderでミニDSLを構築する
  2. スコープ付きAPIと可読性のパターン
  3. UIフレームワークを使わない実践例
← Swift Academyに戻る