Skip to content

Conversation

@vanism2091
Copy link

PR 타입

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • angular.io application / infrastructure changes
  • Other... Please describe:

반영 브랜치

vanism2091/main -> 1_is

What is the current behavior?

Issue Number: N/A

추가한 기능

  • 사용자 입력을 받고 검증합니다
  • 학생을 추가합니다
  • 학생을 삭제합니다
  • 성적을 추가합니다
  • 성적을 삭제합니다
  • 성적의 평균을 보여줍니다
  • 프로그램 실행, 종료 시 데이터를 저장하고 불러옵니다

구조

  • Managers
    • CreditManager
      enum DataFile {
          static let name: String
          static let directory: String
          static let pathString: String
          static var pathUrl: URL
      }
    
      final class CreditManager {
          private var status: Status
          private var students: [Student]
          func run()
          private func parse(input: String) throws -> ParsedInput
          private func doWith(_ input: ParsedInput) throws
          private func start(_ input: ParsedInput) throws
          private func add(student input: ParsedInput) throws
          private func delete(student input: ParsedInput) throws
          private func add(score input: ParsedInput) throws
          private func delete(score input: ParsedInput) throws
          private func show(score input: ParsedInput) throws
          private func saveData()
          private func loadData()
      }
    • IOManager
      enum OutputType {
          case information
          case reaction
          case error
      }
      
      enum IOManager {
          static let nameRegex
          static func getInput(isStartStatus: Bool) throws -> String 
          static func checkValidity(of str: String) -> Bool
          static func writeMessage(_ message: String, type: OutputType = .information)
      }
  • Data Struct
    • Specific
      • Score
      enum Score: Float, Codable {
          case APlus, A, BPlus, B, CPlus, C, DPlus, D, F
          
          var description: String
          init?(score: String)
      }
      • Status
      typealias ParsedInput = [Codable]
      
      enum Status: String, Codable {
          case start
          case addStudent
          case deleteStudent
          case addScore
          case deleteScore
          case showScoreAverage
          case exit
      }
      
      extension Status {
          var infoMessage: String
          func resMessage(input: ParsedInput) -> String?
          func parse(input: String) -> ParsedInput?
      }
      • Student
      final class Student: Codable {
          let name: String
          private(set) var scores: [String:Score]
          var isCourseEmpty: Bool
          var averageScore: Float 
          var allScoresDescription: String 
          init(name: String) 
          func update(course: String, score: Score) 
          func remove(course: String) -> Score?
      }
      struct StudentList: Codable {
          let students: [Student]
      }
      
    • General
      • Error
      enum CMError: Error {
          case invalidStartInput
          case studentAleadyExists(name: String)
          case studentNotFound(name: String)
          case emptyCourse(name: String)
          case courseNotFound(name: String, course:String)
          case emptyStudents
          case quitProgram
      }
      enum IOError: Error {
          case wrongInput
      }
      • Info: StringLiterals
      enum Info {
          static let start: String
          enum Student {
              static let forAdd: String
              static func added(name: String) -> String
              static let forDelete: String
              static func deleted(name: String) -> String
          }
          enum Score {
              static let forAdd: String
              static func added(name:String, course: String, score: String) -> String
              static let forDelete: String
              static func deleted(name:String, course:String) -> String
              static let forAverage: String
          }
          enum Data {
              static func saved(names: [String]) -> String
              static func loaded(names: [String]) -> String
          }
          
          enum Warning {
              static let failedToLoadData: String
              static let failedToLoadReaction: String
          }
      }

Does this PR introduce a breaking change?

  • Yes
  • No

Test Checklist

  • 저장
  • 불러오기
  • 입력 검증 테스트
    • 이름
    • 이름, 과목
    • 이름, 과목, 성적

Other information

구현 후 고민하는 점

  • 더 좋은 저장, 불러오기 방식이 무엇일까요?
  • ! 사용을 지양하기 위해 input을 검증하고 parse하는 과정에서 type downcasting 시 오류 체크를 2번 하게 된다. (Status.parse에서 한 번, CreditManager 내 method에서 한 번) 이를 해결하는 방법은 구조를 바꾸는 방법 뿐일까요?
  • 에러를 CMError와 IOError로 나누었는데, 불필요한 분리일까요?

@vanism2091 vanism2091 changed the title credit manager 구현 [Is] credit manager 구현 Dec 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant