> 웹 프론트엔드 > JS 튜토리얼 > 저수준 설계: 폴링 시스템

저수준 설계: 폴링 시스템

WBOY
풀어 주다: 2024-08-30 18:39:31
원래의
767명이 탐색했습니다.

Low-Level Design: Polling System

목차

  1. 문제 설명
  2. 가정
  3. 요구사항
    • 설문조사 만들기
    • 설문조사 관리
    • 설문조사에 투표하세요
    • 설문조사 결과 보기
    • 설문조사 데이터
  4. 구현 세부정보
    • 기능/방법
      • 설문조사 만들기
      • 설문조사 업데이트
      • 설문조사 삭제
      • 설문조사에 투표하세요
      • 설문조사 결과 보기
  5. 데이터 모델
    • 설문조사
    • 투표
  6. 구현 세부정보
  7. 코드

문제 설명

온라인 투표 시스템을 설계하고 구현해야 합니다. 시스템은 사용자가 설문 조사를 생성, 관리 및 참여할 수 있도록 허용해야 합니다. 각 설문 조사는 질문과 답변에 대한 여러 옵션으로 구성됩니다. 사용자는 설문조사에 투표하고 결과를 볼 수 있습니다.

가정:

  • 우리는 클래스 기반 구현을 사용하고 있습니다
  • 우리는 이 정보를 저장하기 위해 추가 데이터베이스를 사용하지 않습니다
  • DB 및 서버가 포함되지 않아 REST API가 없습니다
  • 폴링 시스템에 대한 간단한 저수준 접근 방식

요구사항

설문 조사 만들기:

  • 사용자는 질문과 다중 답변 옵션이 포함된 새로운 설문조사를 만들 수 있어야 합니다.
  • 각 설문조사에는 고유 식별자, 질문, 옵션 목록, 생성 타임스탬프가 있어야 합니다.

설문조사 관리:

  • 사용자는 기존 설문조사의 질문이나 옵션을 업데이트할 수 있어야 합니다.
  • 사용자는 설문조사를 삭제할 수 있어야 합니다.

여론조사에 투표하세요:

  • 사용자는 설문조사의 옵션 중 하나에 투표할 수 있어야 합니다.
  • 각 사용자는 설문조사당 한 번만 투표할 수 있습니다.

설문조사 결과 보기:

  • 사용자는 각 옵션에 대한 투표 수를 포함하여 현재 설문조사 결과를 볼 수 있어야 합니다.

설문조사 데이터:

  • 효율적인 검색 및 업데이트가 가능한 방식으로 설문 조사, 옵션 및 투표를 저장합니다.
  • 특히 여러 사용자가 동시에 투표하는 경우 데이터 무결성과 일관성을 보장하세요.

구현 세부정보

기능/방법:

설문조사 만들기

createPoll :

  • 입력: 질문(문자열), 옵션(문자열 배열)
  • 출력: pollId(문자열), 메시지(문자열)
  • : createPoll("당신이 가장 좋아하는 색깔은 무엇입니까?", ["Red", "Blue", "Green", "Yellow"])는 {"pollId": "123", "message"를 반환합니다. : "설문조사가 성공적으로 생성되었습니다."}

설문조사 업데이트

updatePoll :

  • 입력: pollId(문자열), 질문(문자열), 옵션(문자열 배열)
  • 출력: 메시지(문자열)
  • : updatePoll("123", "업데이트된 질문?", ["Option1", "Option2"])는 {"message": "Poll이 성공적으로 업데이트되었습니다."}를 반환합니다.

설문조사 삭제

설문조사 삭제 :

  • 입력: pollId(문자열)
  • 출력: 메시지(문자열)
  • : deletePoll("123")은 {"message": "Poll이 성공적으로 삭제되었습니다."}를 반환합니다.

설문 조사에 투표

voteInPoll :

  • 입력: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿