システム設計: Go で駐車場システムを構築する

DDD
リリース: 2024-11-11 22:03:02
オリジナル
857 人が閲覧しました

この記事では、Go での駐車場システムの低レベル設計 (LLD) 実装について説明します。システムのさまざまな側面を調査し、各コンポーネントが他のコンポーネントとどのように相互作用するかを見ていきます。この実装は明確さと現実世界での有用性に重点を置いているため、より多くの車両タイプ、複数の支払いオプション、スポット予約などの機能を追加したい場合に簡単に拡張できます。

このシステムは、駐車フロアと駐車スペースの管理、車両の駐車と駐車解除、支払いの処理などのタスクを処理します。また、同時アクセスに対してスレッドセーフであることも保証します。そのため、より大きなシステムに拡張する必要がある場合でも、圧力がかかっても機能しなくなることはありません。


コアコンポーネント

私たちの設計には 6 つの主要コンポーネントが含まれています:

  1. 駐車場 - フロアと駐車場の管理を管理する主要な入り口ポイント。
  2. 駐車フロア - 各フロアには、さまざまな種類の車両用の複数の駐車スペースがあります。
  3. 駐車場 - 特定の種類の車両を駐車できる駐車場を表します。
  4. 駐車チケット - 入退場時間、駐車料金、関連する車両を追跡します。
  5. 支払いシステム - 駐車料金の計算と支払い処理を処理します。
  6. 車両タイプ - さまざまなタイプの車両 (乗用車、バン、トラック、オートバイ) をサポートします。各タイプには異なる時間料金がかかります。

シングルトン駐車場

私たちの駐車場はシングルトンパターンを使用しています。つまり、駐車場のインスタンスは 1 つだけあり、一度作成されるとアプリケーション全体で再利用されます。これを機能させるコードは次のとおりです:

var (
    parkingLotInstance *ParkingLot
    once               sync.Once
)

type ParkingLot struct {
    Name   string
    floors []*ParkingFloor
}

func GetParkingLotInstance() *ParkingLot {
    once.Do(func() {
        parkingLotInstance = &ParkingLot{}
    })
    return parkingLotInstance
}
ログイン後にコピー
ログイン後にコピー

sync.Once を使用すると、複数の goroutine からアクセスされた場合でも、インスタンスが 1 つだけ作成されることが保証されます。

駐車場のフロア管理

駐車場には複数のフロアがあり、各フロアにさまざまな種類の車両 (乗用車、バン、トラック、オートバイなど) 用に指定された駐車スペースがあります。駐車場にフロアを追加するには、AddFloor メソッドを使用します。

func (p *ParkingLot) AddFloor(floorID int) {
    p.floors = append(p.floors, NewParkingFloor(floorID))
}
ログイン後にコピー
ログイン後にコピー

各フロアは、車両タイプごとにスポットを整理する NewParkingFloor 関数を使用して作成されます。

駐車場

各パーキングスポットは、特定の車両タイプ (車やバイクなど) に関連付けられています。これにより、システムは各スポットに駐車できる車両を管理および制限できます。以下に、ParkingSpot 構造体と ParkVehicle メソッドを示します:

type ParkingSpot struct {
    SpotID         int
    VehicleType    vehicles.VehicleType
    CurrentVehicle *vehicles.VehicleInterface
    lock           sync.Mutex
}

func (p *ParkingSpot) ParkVehicle(vehicle vehicles.VehicleInterface) error {
    p.lock.Lock()
    defer p.lock.Unlock()

    if vehicle.GetVehicleType() != p.VehicleType {
        return fmt.Errorf("vehicle type mismatch: expected %s, got %s", p.VehicleType, vehicle.GetVehicleType())
    }
    if p.CurrentVehicle != nil {
        return fmt.Errorf("parking spot already occupied")
    }

    p.CurrentVehicle = &vehicle
    return nil
}
ログイン後にコピー
ログイン後にコピー

ミューテックス ロックを使用して、一度に 1 台の車両のみがその場所に駐車できるようにします。

駐車券

すべての車両には、入場時間、退場時間、駐車場所、合計料金が記載されたチケットが発行されます。このチケットは車両の出庫時に更新され、料金は駐車時間に基づいて計算されます。

var (
    parkingLotInstance *ParkingLot
    once               sync.Once
)

type ParkingLot struct {
    Name   string
    floors []*ParkingFloor
}

func GetParkingLotInstance() *ParkingLot {
    once.Do(func() {
        parkingLotInstance = &ParkingLot{}
    })
    return parkingLotInstance
}
ログイン後にコピー
ログイン後にコピー

CalculateTotalCharge メソッドは、車両の種類と所要時間に基づいて駐車料金を計算します。

支払いシステム

PaymentSystem クラスは支払いを処理し、必要な金額が支払われたかどうかに基づいて支払いステータスを更新します。

func (p *ParkingLot) AddFloor(floorID int) {
    p.floors = append(p.floors, NewParkingFloor(floorID))
}
ログイン後にコピー
ログイン後にコピー

ProcessPayment 関数は金額を確認し、支払いステータスを完了または失敗に更新します。

車両タイプの追加

当社のシステムは、さまざまな種類の車両 (乗用車、バン、トラック、オートバイ) をサポートしています。各タイプには異なる時間料金がかかります。これは、別の車両パッケージで VehicleType と VehicleInterface を設定することで実現されます。

type ParkingSpot struct {
    SpotID         int
    VehicleType    vehicles.VehicleType
    CurrentVehicle *vehicles.VehicleInterface
    lock           sync.Mutex
}

func (p *ParkingSpot) ParkVehicle(vehicle vehicles.VehicleInterface) error {
    p.lock.Lock()
    defer p.lock.Unlock()

    if vehicle.GetVehicleType() != p.VehicleType {
        return fmt.Errorf("vehicle type mismatch: expected %s, got %s", p.VehicleType, vehicle.GetVehicleType())
    }
    if p.CurrentVehicle != nil {
        return fmt.Errorf("parking spot already occupied")
    }

    p.CurrentVehicle = &vehicle
    return nil
}
ログイン後にコピー
ログイン後にコピー

NewCar、NewVan、NewTruck などを呼び出すことで、新しい車両を作成できます。それぞれが VehicleInterface を実装しています。


すべてをひとつにまとめる

各部分がフローの中でどのように組み合わされるかを見てみましょう:

  • 駐車場を作成します: GetParkingLotInstance() を呼び出し、AddFloor でフロアを追加します。
  • 駐車スポットの検索と車両の駐車: ParkVehicle メソッドは、利用可能なスポットを見つけ、車両のタイプに照らして検証し、チケットを生成します。
  • 車両の駐車解除と支払いの処理: UnparkVehicle は合計料金を生成し、支払いシステムを開始して、取引を完了します。

この駐車場システムは、より複雑なシステムを構築するための簡素化された出発点です。フロアとスポットの管理、車両の駐車と降車、基本的な支払いプロセスの基本について説明しました。

完全なコード実装については、次のリポジトリを確認してください:

System Design: Building a Parking Lot System in Go テサルツリー / 低レベル設計-golang

Golang による低レベルのシステム設計ソリューション

Go での低レベルのシステム設計

Go での低レベル システム設計 リポジトリへようこそ!このリポジトリには、Go で実装されたさまざまな低レベルのシステム設計の問題とその解決策が含まれています。主な目的は、実際の例を通じてシステムの設計とアーキテクチャを実証することです。

目次

  • 概要
  • 駐車場システム
  • エレベーターシステム
  • 図書館管理システム
  • 自動販売機システム
  • ソーシャルメディアプラットフォーム

概要

低レベルのシステム設計には、システム アーキテクチャの中核概念を理解し、拡張性、保守性、効率性の高いシステムを設計することが含まれます。このリポジトリは、Go を使用したさまざまな問題やシナリオの解決策をカバーしようとします。

駐車場システム

このリポジトリの最初のプロジェクトは、駐車場システムです。このシステムは、車両を駐車および駐車解除できる駐車場をシミュレートします。以下を示します:

  • 駐車場インスタンスを管理するためのシングルトン設計パターン。
  • さまざまな種類の車両 (乗用車、トラックなど) を扱います。
  • 複数のフロアにわたる駐車スペースの管理。
  • 支払い処理中…


GitHub で表示


以上がシステム設計: Go で駐車場システムを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート