ホームページ >ウェブフロントエンド >jsチュートリアル >低レベル設計: ポーリング システム

低レベル設計: ポーリング システム

王林
王林オリジナル
2024-08-30 18:39:32506ブラウズ

Low-Level Design: Polling System

目次

  1. 問題の説明
  2. 前提
  3. 要件
    • 投票を作成する
    • 投票を管理する
    • アンケートで投票する
    • 投票結果を表示
    • データの投票
  4. 実装の詳細
    • 関数/メソッド
      • 投票を作成
      • 投票を更新
      • 投票を削除
      • 投票に投票
      • 投票結果を表示
  5. データモデル
    • 投票
    • 投票
  6. 実装の詳細
  7. コード

問題提起

オンライン投票システムを設計して実装する必要があります。このシステムでは、ユーザーが投票を作成、管理し、参加できるようにする必要があります。各投票は、質問と複数の回答選択肢で構成されます。ユーザーはアンケートに投票し、結果を確認できます。

仮定:

  • クラスベースの実装を使用しています
  • この情報を保存するために追加のデータベースは使用していません
  • DBとサーバーが関与しないため、REST APIはありません
  • ポーリング システムでの単純な低レベル アプローチ

要件

投票を作成します。

  • ユーザーは、質問と複数の回答オプションを含む新しいアンケートを作成できる必要があります。
  • 各投票には、一意の識別子、質問、オプションのリスト、作成時のタイムスタンプが必要です。

投票の管理:

  • ユーザーは既存のアンケートの質問やオプションを更新できる必要があります。
  • ユーザーはアンケートを削除できる必要があります。

投票で投票します:

  • ユーザーは投票でオプションの 1 つに投票できる必要があります。
  • 各ユーザーは投票ごとに 1 回だけ投票できます。

投票結果の表示:

  • ユーザーは、各オプションの投票数を含む、現在の投票結果を表示できる必要があります。

投票データ:

  • 効率的な取得と更新が可能な方法でアンケート、オプション、投票を保存します。
  • 特に複数のユーザーが同時に投票する場合、データの整合性と一貫性を確保します。

実装の詳細

関数/メソッド:

投票の作成

createPoll :

  • 入力: 質問 (文字列)、オプション (文字列の配列)
  • 出力:pollId (文字列)、メッセージ (文字列)
  • : createPoll("あなたの好きな色は何ですか?", ["赤", "青", "緑", "黄"]) は {"pollId": "123", "message" を返します: "投票が正常に作成されました。"}

投票を更新する

更新投票 :

  • 入力:pollId (文字列)、質問 (文字列)、オプション (文字列の配列)
  • 出力: メッセージ (文字列)
  • : updatePoll("123", "質問が更新されましたか?", ["オプション 1", "オプション 2"]) は {"メッセージ": "投票が正常に更新されました。"} を返します。

投票の削除

deletePoll :

  • 入力:pollId (文字列)
  • 出力: メッセージ (文字列)
  • : deletePoll("123") は {"message": "投票は正常に削除されました。"} を返します。

投票に投票する

投票に投票 :

  • 入力:pollId (文字列)、userId (文字列)、オプション (文字列)
  • 出力: メッセージ (文字列)
  • : voteInPoll("123", "user1", "Option1") は {"message": "投票に成功しました。"} を返します。

投票結果の表示

投票結果の表示 :

  • 入力:pollId (文字列)
  • 出力:pollId (文字列)、質問 (文字列)、結果 (オプション キーと投票数の値を持つオブジェクト)
  • : viewPollResults("123") は {"pollId": "123", "question": "あなたの好きな色は何ですか?", "results": {"Red": 10, "Blue ": 5、"緑": 3、"黄": 2}}

データモデル

  • 投票:
{
  "pollId": "123",
  "question": "What is your favorite color?",
  "options": ["Red", "Blue", "Green", "Yellow"],
  "createdAt": "2024-07-11T00:00:00Z"
}
  • 投票:
{
  "pollId": "123",
  "userId": "user1",
  "option": "Red",
  "timestamp": "2024-07-11T01:00:00Z"
}

実装の詳細

このコードは、JavaScript クラスを使用して基本的なポーリング システムを定義します。投票の作成、管理、投票が可能になります。コードの各部分を分解してみましょう:

1. Class Definitions

Poll Class

  • Purpose: Represents an individual poll.
  • Constructor Parameters:
    • id: A unique identifier for the poll.
    • question: The question being asked in the poll.
    • options: An array of possible options that users can vote on.
  • Properties:
    • pollId: Stores the unique ID of the poll.
    • question: Stores the poll question.
    • options: Stores the array of options.
    • createdAt: Stores the creation date and time of the poll.

Vote Class

  • Purpose: Represents an individual vote cast by a user.
  • Constructor Parameters:
    • pollId: The ID of the poll the vote is associated with.
    • userId: The ID of the user who cast the vote.
    • option: The option that the user voted for.
  • Properties:
    • pollId: Stores the poll ID for which the vote was cast.
    • userId: Stores the user ID of the voter.
    • option: Stores the option that the user voted for.
    • timestamp: Stores the date and time when the vote was cast.

2. PollManager Class

Purpose: Manages the entire polling system, including creating polls, managing votes, and viewing results.

Constructor:

  • Properties:
    • polls: A Map that stores all polls, where the key is the poll ID and the value is the Poll object.
    • pollResults: A Map that stores the results of each poll, where the key is the poll ID and the value is another Map that tracks votes for each option.
    • userVotes: A Map that stores the votes by each user, where the key is the poll ID and the value is another Map that tracks whether a user has voted in that poll.

Methods:

  • createPoll(question, options)

    • Generates a new poll with a unique ID.
    • Initializes the poll results, setting the vote count for each option to 0.
    • Stores the poll and returns the generated poll ID.
  • updatePoll(pollId, question, options)

    • Updates the question and options for an existing poll.
    • Resets the poll results to 0 for the updated options.
    • Returns a success message if the poll is found, otherwise returns "Poll not found."
  • deletePoll(pollId)

    • Deletes a poll by its ID.
    • Also removes associated poll results and user votes.
    • Returns a success message if the poll is found, otherwise returns "Poll not found."
  • voteInPoll(pollId, userId, option)

    • Allows a user to cast a vote in a specific poll.
    • Ensures a user can only vote once per poll.
    • Updates the vote count for the selected option if valid.
    • Returns appropriate messages depending on whether the vote was successful, the user had already voted, or the poll or option was invalid.
  • viewPollResults(pollId)

    • Returns the results of a specific poll in an array format, where each entry is a tuple of the option and its vote count.
    • Returns "Poll not found" if the poll doesn't exist.

3. Example Usage

  • Poll Creation: A poll is created asking, "What is your favorite color?" with options ["Red", "Blue", "Green", "Yellow"]. The poll ID is generated as "1".
  • Voting: Multiple users vote in the poll, and the system ensures users can only vote once.
  • Viewing Results: The poll results are displayed, showing the vote counts for each option.
  • Updating the Poll: The poll's question and options are updated, resetting the results.
  • Voting in Updated Poll: A user votes in the updated poll, and the results are displayed.
  • Poll Deletion: The poll is deleted, and an attempt to view the results afterward confirms the poll no longer exists.

This implementation provides a basic but functional polling system, handling common scenarios such as poll creation, updating, voting, and deletion.

CODE

class Poll {
    constructor(id, question, options) {
        this.pollId = id;
        this.question = question;
        this.options = options;
        this.createdAt = new Date();
    }
}

class Vote {
    constructor(pollId, userId, option) {
        this.pollId = pollId;
        this.userId = userId;
        this.option = option;
        this.timestamp = new Date();
    }
}

class PollManager {
    constructor() {
        this.polls = new Map();
        this.pollResults = new Map();
        this.userVotes = new Map();
    }

    createPoll(question, options) {
        const pollId = (this.polls.size + 1).toString();
        const poll = new Poll(pollId, question, options);
        this.polls.set(pollId, poll);

        const result = new Map();
        options.forEach(option => result.set(option, 0));
        this.pollResults.set(pollId, result);

        return pollId;
    }

    updatePoll(pollId, question, options) {
        const poll = this.polls.get(pollId);
        if (poll) {
            poll.question = question;
            poll.options = options;

            // Update results for the new options
            const result = new Map();
            options.forEach(option => result.set(option, 0));
            this.pollResults.set(pollId, result);

            return "Poll updated successfully.";
        }
        return "Poll not found.";
    }

    deletePoll(pollId) {
        if (this.polls.delete(pollId)) {
            this.pollResults.delete(pollId);
            this.userVotes.delete(pollId);
            return "Poll deleted successfully.";
        }
        return "Poll not found.";
    }

    voteInPoll(pollId, userId, option) {
        const poll = this.polls.get(pollId);
        if (poll) {
            if (!this.userVotes.has(pollId)) {
                this.userVotes.set(pollId, new Map());
            }

            const userVote = this.userVotes.get(pollId);
            if (userVote.get(userId)) {
                return "User has already voted.";
            }

            const result = this.pollResults.get(pollId);
            if (result.has(option)) {
                result.set(option, result.get(option) + 1);
                userVote.set(userId, true);
                return "Vote cast successfully.";
            } else {
                return "Invalid option.";
            }
        }
        return "Poll not found.";
    }

    viewPollResults(pollId) {
        const results = this.pollResults.get(pollId);
        if (results) {
            return Array.from(results.entries());
        }
        return "Poll not found.";
    }
}

// Example usage
const pollManager = new PollManager();

// Creating a poll
const pollId = pollManager.createPoll("What is your favorite color?", ["Red", "Blue", "Green", "Yellow"]);
console.log("Poll created with ID:", pollId);

// Voting in the poll
let voteMessage = pollManager.voteInPoll(pollId, "user1", "Red");
console.log(voteMessage);

voteMessage = pollManager.voteInPoll(pollId, "user2", "Blue");
console.log(voteMessage);

voteMessage = pollManager.voteInPoll(pollId, "user1", "Green");
console.log(voteMessage); // Should inform the user has already voted

// Viewing poll results
let results = pollManager.viewPollResults(pollId);
console.log("Poll results for poll ID", pollId, ":", results);

// Updating the poll
let updateMessage = pollManager.updatePoll(pollId, "What is your favorite primary color?", ["Red", "Blue", "Yellow"]);
console.log(updateMessage);

// Voting in the updated poll
voteMessage = pollManager.voteInPoll(pollId, "user3", "Yellow");
console.log(voteMessage);

// Viewing updated poll results
results = pollManager.viewPollResults(pollId);
console.log("Updated poll results for poll ID", pollId, ":", results);

// Deleting the poll
let deleteMessage = pollManager.deletePoll(pollId);
console.log(deleteMessage);

// Attempting to view results of a deleted poll
results = pollManager.viewPollResults(pollId);
if (typeof results === "string") {
    console.log(results);
}


// Response
// Poll created with ID: 1
// Vote cast successfully.
// Vote cast successfully.
// User has already voted.
// Poll results for poll ID 1 : [['Red', 1], ['Blue', 1], ['Green', 0], ['Yellow', 0]]
// Poll updated successfully.
// Vote cast successfully.
// Updated poll results for poll ID 1 : [['Red', 0], ['Blue', 0], ['Yellow', 1]]
// Poll deleted successfully.
// Poll not found.

Note: Please follow for more detail & Enchanced version of this article with DB, API & other system Design Concept.

More Details:

Get all articles related to system design
Hastag: SystemDesignWithZeeshanAli

zeeshanali とのシステムデザイン

Git: https://github.com/ZeeshanAli-0704/SystemDesignWithZeeshanAli

以上が低レベル設計: ポーリング システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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