ホームページ  >  記事  >  バックエンド開発  >  システム設計: Go で自動販売機を構築する

システム設計: Go で自動販売機を構築する

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 08:45:02823ブラウズ

日本の東京に住んでいる私は、ホットコーヒーから冷たい飲み物、軽食まであらゆる自動販売機に囲まれています。これらの象徴的な機械からインスピレーションを得て、Go で自動販売機システムのデザインを構築することにしました。これは State パターンを使用する素晴らしい例であり、この種のプロジェクトにこれが非常に役立つ理由を詳しく説明します。

なぜ自動販売機なのか?

本物の自動販売機について考えてみましょう - 実際にはかなり複雑です。次のことが必要です:

  • 製品とその数量を追跡します
  • お金を扱う
  • 十分な現金を入金していることを確認してください
  • おやつをあげてください
  • おつりを返却してください

さらに、どの状態にあるのか混乱することなく、これらすべてを実行する必要があります。


基本的な構成要素

まず、操作するための基本的な構造がいくつか必要でした。

商品と在庫
各商品には ID、名前、価格、数量があります。非常に簡単な内容:

type Product struct {
    ID       int
    Name     string
    Price    float64
    Quantity int
}

在庫では、地図を使用してすべての製品を追跡します。次のことが可能です:

  • 新商品を追加
  • 商品を削除
  • トランザクションを処理する (誰かが何かを購入するときなど)
  • 商品が入手可能かどうかを確認してください

状態パターン: ここが素晴らしい理由

ここからが興味深いところです。自動販売機はさまざまな状態をとることができます:

  • お金を待っています
  • お金が挿入されました
  • 選択された製品
  • 調剤製品

各州はユーザーのアクションを異なる方法で処理する必要があります。お金を入れる前に商品を選ぶことはできないですよね?
私は 3 つの主要な状態を使用しました:

  1. MoneyInsertedState
  2. ProductSelectedState
  3. ProductDispensedState

各状態は次のインターフェイスを実装します:

type State interface {
    InsertMoney(amount float64)
    SelectProduct(product *Product)
    ReturnChange()
    DispenseProduct()
}

すべてがどのように連携するか

コーラを買いたいとします:

まず、$2.00 を挿入します

  • マシンは MoneyInsertedState です
  • お金を記録します
  • ProductSelectedState に切り替えます

あなたはコーラ ($1.50) を選択しました

  • コーラの在庫があるかどうかを機械がチェックします
  • 十分な金額を入金したことを確認します
  • ProductDispensedState に移行します

機械がコーラを分配します

  • 在庫を更新します
  • $0.50 のお釣りを返します
  • MoneyInsertedState に戻ります

私が追加した素晴らしい機能

  • 在庫管理: 各製品は 3 個から始まります。売り切れになると、利用可能なオプションから自動的に削除されます。
  • スマートな釣銭処理: 購入後、機械は常に正しい釣銭を計算して返します。
  • エラー防止: 状態パターンは、十分なお金がない状態で商品を購入しようとする、在庫切れの商品を選択する、何かが分配されている間にお金を挿入するなどの奇妙な状況を防ぐのに役立ちます。

学んだこと

これを構築することでいくつかのことを学びました:

  • 状態パターンは、明確で明確な状態を持つマシンに最適です
  • Go のインターフェースにより、状態パターンの実装が非常にきれいになります
  • 実際のアプリケーションでは、適切なエラー処理が非常に重要です

次は何ですか?

常に改善の余地があります。いくつかのアイデア:

  • カード支払いのサポートを追加
  • 表示システムを実装する
  • 飲み物の温度監視を追加
  • 再入荷用の管理インターフェースを作成する

完全なコードはここで示したものよりも詳細ですが、これらはコードを機能させるための主要な部分です。次のリポジトリで完全な実装を自由に確認してください:

System design: Building a Vending Machine in Go テサルツリー / 低レベル設計-golang

Golang での低レベルのシステム設計問題の解決策

System design: Building a Vending Machine in Go

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

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

目次

  • 概要
  • 駐車場システム
  • エレベーターシステム
  • 図書館管理システム
  • 自動販売機システム

概要

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

駐車場システム

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

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

機能

GitHub で表示

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。