clickermatic client component-level design. client class diagram...

32
Clickermatic Client Component-Level Design

Upload: daniel-mcdonald

Post on 03-Jan-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

Clickermatic Client Component-Level Design

Client Class Diagram

Controller

Timer

UserInterface

Question

DefaultProtocol

Client

ConnectionManager

NetworkInterface

QuestionRecordHistorian

TimerListener <<Interface>>

Protocol<<Interface>>

0..n1

Client

+ main(args[]: string): void

<<enumeration>>

QuestionType

(NUMBER, MULTIPLE_CHOICE, TRUE_FALSE, ALPHA_NUMERIC_STRING)

Question

- number: int- text: string- reference: string- timeToAnswer: int- type: QuestionType;

Historian

- NUMBER_OF_QUESTIONS_TO_TRACK: constant int- numberOfQuestionsAnsweredCorrectly: int- numberOfQuestionsAnsweredIncorrectly: int- records: list<QuestionRecord>

+ resetTallies(): void+ addQuestionAnswerRecord(questionNumber: int, clientAnswer:

string, answerIsCorrect: boolean, timeTakenToAnswerQuestion: int, correctAnswer: string): void

QuestionRecord

- questionNumber: int- clientAnswer: string- answerIsCorrect: boolean- timeTakenToAnswerQuestion: int-serverAnswer: string-questionText: string

ConnectionManager

- networkInterface: NetworkInterface- protocol: Protocol- serverIPAddress: string- serverPortNumber: int

+ logIn(name: string): void+ sendQuestionToUser(questionNumber: int, questionType: int,

timeLimit: int, tallyModeForced: boolean, questionText: string; answerOptions: list<string>): void

+ submitUserAnswerToServer(questionNumber: int, answeredInTimeLimit: boolean, elapsedTime: int, clientAnswer: string): void

+ submitServerAnswerToUser(clientAnswer: string, correctAnswer: string, answerIsCorrect: boolean, timeTaken: int): void

+ informUserOfEndOfQuestionSet(): void+ sendDisconnectionRequestToServer(): void+ decodeNetworkBytes(bytes: byte[]): void+ isOpen(): boolean

NetworkInterface

Attributes are implementation-dependent.

+ openConnection(userName: String, address: string, portNumber: int): void

+ sendBytesToServer(bytesToSend: byte[]): void+ connectionIsOpen(): boolean

<<interface>>

Protocol

+ decodeNetworkBytes(bytes: byte[])+ createAnswerChoiceSubmission(questionNumber: int,

answerChoice: string)+ createConnectionEndRequest(): byte[]+ getConnectionManager(): ConnectionManager+ setConnectionManager(cm: ConnectionManager): void

DefaultProtocol

- connectionManager: ConnectionManager

+ decodeNetworkBytes(bytes: byte[])+ createAnswerChoiceSubmission(questionNumber: int,

answeredInTimeLimit: boolean, elapsedTime: int, clientAnswer: string): byte[]

+ createConnectionEndRequest(): byte[]

Timer

- time: int- running: boolean- timerListeners: set<TimerListener>

+ expired(): boolean+ addTimerListener(newListener: TimerListener): void+ updateTime(): void+ updateTimerListeners(): void+ reset()

<<interface>>

TimerListener

+ timerTimeChanged(time: int): void+ timerExpired(): void

Controller

- historian: Historian- currentQuestion: Question- connectionManager: ConnectionManager- timer: Timer- inTallyMode: boolean

+ logIn(name: string): void+ sendQuestionToUser(questionNumber: int, questionType: int, timeLimit: int,

tallyModeForced: boolean, questionText: string; answerOptions: list<string>): void

+ submitUserAnswerToServer(questionNumber: int, answeredInTimeLimit: boolean, elapsedTime: int, clientAnswer: string): void

+ sendTimeExpiredNotificationToServer(): void+ submitServerAnswerToUser(clientAnswer: string, correctAnswer: string,

answerIsCorrect: boolean, timeTaken: int): void+ informUserOfEndOfQuestionSet(): void+ sendDisconnectionRequestToServer(): void+ timerTimeChanged(time: int): void+ timerExpired(): void

UserInterface

Clickermatic Server Component-Level Design

Server Class Diagram

0..500

Controller

Timer

UserInterface

QuestionSet

Question

ConnectedUser

Protocol

Server

ConnectionHandler1

QuestionHandler

0..n

1

ResultHandler ResultSet QuestionResult0..n

1

UserQuestionResult

0..500

1

Server

- main()

UserInterface

- controller: Controller - tallyMode: Boolean- questionStatistics: Boolean- jumpQuestionNum: Int

- startUp()- getInstanceOf()- displayStartupScreen()- exit()- beginQuestions()- displayNextQuestion()- displayQuestionStats(Question)- displayQuestionSetStats(QuestionSet)- update()

Controller

- connectionHandler: ConnectionHandler- resultHandler: ResultHandler- questionHandler: QuestionHandler

ConnectionHandler

- protocol: Protocol- connectedUsers[]: ConnectedUser

- listenForClients()- openConnection(IPAddress: string, userName: string, socket: Socket)- sendQuestion()- sendGradedQuestion()- sendEndOfSet()- sendGoodbye()- sendPacket(packet: Packet)- decodePacket(packet: Packet)- closeConnection(connectedUserIndex: int)

Protocol

- userQuestionResult : UserQuestionResult

- createQuestionPacket(question: Question): Packet- createGradedQuestionPacket(question: Question): Packet- createEndOfSetPacket(): Packet- createGoodbyePacket(): Packet- decodePacket(packet Packet)- storeResult(Packet)

ConnectedUser

- IPAddress: string- userName: string- socket: Socket

ResultHandler

- resultSet: ResultSet

- exportStatisticsFile(fileName: string, IPAddress: string, questionIndex: int)

ResultSet

- questionResults[]: QuestionResult- averageCorrectAnswers: int- precentageOfCorrectAnswer: int

- calculateSetResults()

QuestionResult

- userQuestionResults[]: UserQuestionResult- questionType: int- answers[]: string- countOfEachAnswer[]: int- correctAnswerIndex[]: int- mostCommonWrongAnswerIndex: int- minAnswer: int- maxAnswer: int- averageAnswer: int

- calculateQuestionResults()- calculateNumberResults()

UserQuestionResult

- userName: string- userIPAddress: string- submittedAnswer: string- timeToAnswer: int

QuestionHandler

- timer: Timer- questionSet: QuestionSet- currentQuestion:

- loadSet(fileName: string)- nextQuestion()- gotoQuestion()- repeatPreviousQuestion()

Timer

- minutesLeft: int- secondsLeft: int

+ start()+ stop()+ reset()

QuestionSet

-questions[] : Question

<<enumeration>>

QuestionType

(NUMBER, MULTIPLE_CHOICE, TRUE_FALSE, ALPHA_NUMERIC_STRING)

Question

- questionText: string- options: string[]- correctAnswerIndicies: int[] - type: QuestionType