Skip to content

πŸš€ νŠΈλŸ¬λΈ” μŠˆνŒ…

Wonbi edited this page Oct 7, 2022 · 3 revisions

πŸš€ νŠΈλŸ¬λΈ” μŠˆνŒ…

πŸ“Œ LinkedList의 Unit Test

// LinkedList
struct LinkedList<T: CalculateItem> {
    class Node<T: CalculateItem> {
        fileprivate var value: T
        fileprivate var next: Node?
        
        fileprivate init(_ value: T, next: Node? = nil) {
            self.value = value
            self.next = next
        }
    }
}

// CalculatorItemQueue
struct CalculatorItemQueue<T: CalculateItem> {
    private var list: LinkedList<T> = LinkedList<T>()
}

문제 πŸ‘»

  • LinkedList νƒ€μž…μ— μ™ΈλΆ€μ—μ„œ μ§μ ‘μ μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 상황을 λ°©μ§€ν•˜κ³ μž 은닉화λ₯Ό μœ„ν•΄ CalculatorItemQueue νƒ€μž…μ˜ list ν”„λ‘œνΌν‹°μ™€ LinkedList νƒ€μž…μ— μ ‘κ·Όμ œμ–΄λ₯Ό ν•˜λ €κ³  ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ TDD ν…ŒμŠ€νŠΈ μ‹œμ—λ„ LinkedList νƒ€μž…μ— 접근이 λΆˆκ°€λŠ₯ν•œ λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν•΄κ²° πŸ”«

  • CalculatorItemQueue νƒ€μž…μ€ LinkedList νƒ€μž…μ˜ list ν”„λ‘œνΌν‹°λ₯Ό 가지고 있고, CalculatorItemQueue νƒ€μž…μ˜ λ©”μ„œλ“œλŠ” list ν”„λ‘œνΌν‹°λ‘œ μ‹€ν–‰κ°€λŠ₯ν•œ λ©”μ„œλ“œ(LinkedList νƒ€μž… μ•ˆμ— μ •μ˜λœ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ)λ₯Ό ν˜ΈμΆœν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • 이런 경우, CalculatorItemQueue νƒ€μž…μ˜ λ©”μ„œλ“œλ§Œμ„ ν…ŒμŠ€νŠΈ 해도 κ·Έ λ©”μ„œλ“œκ°€ ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œκΉŒμ§€ test coveregeκ°€ μ±„μ›Œμ§„λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • κ²°κ΅­, CalculatorItemQueue νƒ€μž…λ§Œμ„ ν…ŒμŠ€νŠΈ 해도 coveregeμ—λŠ” λ¬Έμ œκ°€ μ—†κΈ° λ•Œλ¬Έμ— LinkedList νƒ€μž…μ€ λ‹€μ‹œ μ ‘κ·Όμ œμ–΄ ν•˜λŠ” κ²ƒμœΌλ‘œ ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.





πŸ“Œ NumberFormatter의 적용

extension String {
    private var numberFormatter: NumberFormatter {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.usesSignificantDigits = true
        numberFormatter.maximumSignificantDigits = 20
        
        return numberFormatter
    }
    
    func addComma() -> String {
        guard Double(self) != nil, let result = numberFormatter.string(for: Double(self)) else { return self }
        return result
    }
    
    func addCommaInteger() -> String {
        let components: [String] = self.components(separatedBy: ExpressionText.dot)
        guard let integerPart = numberFormatter.string(for: Double(components[0])) else { return self }
        
        if components.count >= 2 {
            return integerPart + ExpressionText.dot + components[1]
        } else {
            return integerPart
        }
    }
}

문제 πŸ‘»

  • λ„˜λ²„ 포맷터λ₯Ό μ‚¬μš© μžμ²΄λŠ” 어렡지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν”Όμ—°μ‚°μžλ₯Ό μž…λ ₯ν•  λ•Œ μž…λ ₯값에 λ°”λ‘œ λ„˜λ²„ 포맷터λ₯Ό μ μš©ν•˜λ©΄ μ†Œμˆ˜μ  λ°‘μœΌλ‘œ 0을 μ—°μ†μœΌλ‘œ μž…λ ₯ν•  μ‹œ μƒλž΅ν•΄λ²„λ¦¬λŠ” λ¬Έμ œκ°€ μžˆμ—ˆκ³ , 이λ₯Ό μ μš©ν•˜μ§€ μ•ŠμœΌλ©΄ μž…λ ₯값에 콀마(,)κ°€ μ°νžˆμ§€ μ•ŠλŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²° πŸ”«

  • 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, λ°”λ‘œ λ„˜λ²„ 포맷터λ₯Ό μ μš©ν•˜λŠ” λ©”μ„œλ“œμ™€ μ†Œμˆ«μ  뒷뢀뢄은 λ„˜λ²„ 포맷터λ₯Ό μ μš©ν•˜μ§€ μ•Šκ³  μ•žλΆ€λΆ„λ§Œ μ μš©ν•œ ν›„ ν•©μΉ˜λŠ” λ©”μ„œλ“œλ₯Ό 각각 κ΅¬ν˜„ν•˜μ—¬ ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.





πŸ“Œ 병합 μ‹œ ν…ŒμŠ€νŠΈ 파일 병합에 λŒ€ν•œ κ³ λ―Ό

문제 πŸ‘»

  • 병합 μž‘μ—…μ„ μ§„ν–‰ν•˜λ©΄μ„œ, ν…ŒμŠ€νŠΈ νŒŒμΌμ„ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ”μ§€ 잘 νŒλ‹¨μ΄ μ„œμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 각자의 λ‘œμ§μ— 맞게 ν…ŒμŠ€νŠΈ νŒŒμΌμ„ μž‘μ„±ν•˜λ‹€λ³΄λ‹ˆ λ³‘ν•©ν•˜λŠ” κ³Όμ •μ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό λ‹€μ‹œ μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ 많이 λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν•΄κ²° πŸ”«

  • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ΅¬ν˜„μ΄ μ•„λ‹Œ ν…ŒμŠ€νŠΈμ˜ λͺ©μ μ— μ§‘μ€‘ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈμ˜ λͺ©μ μ΄ κ°™λ‹€λ©΄ κ·Έ ν…ŒμŠ€νŠΈ λ‚΄λΆ€μ˜ κ΅¬ν˜„μ΄ λ‹€λ₯Ό 순 μžˆμ–΄λ„ λͺ©μ μ€ 같기에 μ’€ 더 κ°€λ…μ„±μ΄λ‚˜ 둜직이 κΉ”λ”ν•œ μ‚¬λžŒμ˜ ν…ŒμŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ°λ§Œ ν•˜λ©΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • 이런 λ°©ν–₯성을 가지고 ν…ŒμŠ€νŠΈμ½”λ“œμ˜ 병합을 μ§„ν–‰ν•˜μ˜€κ³ , μƒˆλ‘œμš΄ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ ν•„μš”ν•  μ‹œ ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μΆ”κ°€ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.






πŸ“Œ μ œμ‹œλœ UML에 ν¬ν•¨λ˜μ§€ μ•Šμ•˜λ˜ View Controller λ³‘ν•©μ˜ 어렀움

문제 πŸ‘»

  • ViewController의 경우, ν”„λ‘œμ νŠΈμ—μ„œ λ”°λ‘œ UML을 μ œμ‹œν•˜μ‹œ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
  • κ·Έ κ²°κ³Ό, 각자의 방법과 μƒκ°μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ 넀이밍 μ»¨λ²€μ…˜, 둜직, λ©”μ„œλ“œλ‚˜ ν”„λ‘œνΌν‹°μ˜ μ‚¬μš©μ— μžˆμ–΄μ„œ 각자의 방법이 λ…Ήμ•„λ“€μ–΄ μžˆλŠ” μ½”λ“œκ°€ μ™„μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • 이 각자의 생각이 λ…Ήμ•„μ Έ μžˆλŠ” ViewControllerλ₯Ό λ³‘ν•©ν•˜κΈ° μœ„ν•΄ ν†΅μΌλœ ν•˜λ‚˜μ˜ 기쀀이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²° πŸ”«

  • 저희가 μ •λ¦¬ν•œ 기쀀은 λ‹€μŒκ³Ό κ°™μ•˜μŠ΅λ‹ˆλ‹€.

    • ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ κΈ°λŠ₯뢄리가 잘 λ˜μ–΄μžˆμ„ 것.
    • μ˜ˆμ™Έμ²˜λ¦¬κ°€ 가독성 μ’‹κ²Œ 잘 이루어져 μžˆμ„ 것.
    • 병합 κ³Όμ •μ—μ„œ μ˜ˆμ™Έμ²˜λ¦¬μ— 였λ₯˜κ°€ 생기지 μ•Šλ„λ‘ ν•  것.
    • μ†ŒμŠ€νŒŒμΌμ„ μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•  경우, μΆ”κ°€ ν˜Ήμ€ μ œκ±°μ‹œ μ‚¬μ΄λ“œ μ΄νŒ©νŠΈκ°€ 적게 μΌμ–΄λ‚˜κ³ , μœ„ 사항듀이 잘 μ§€μΌœμ§€λŠ” λ°©ν–₯으둜 μˆ˜ν–‰ν•  것.
    • μ€‘λ³΅λ˜λŠ” λ©”μ„œλ“œμ˜ 경우, μœ„ 사항듀이 잘 μ§€μΌœμ§€λŠ” λ‘œμ§μ„ μ±„νƒν•˜κ±°λ‚˜ 두 μ½”λ“œμ˜ λ‘œμ§μ„ ν•©μΉ˜λŠ” λ¦¬νŒ©ν† λ§μ„ 진행해 μœ„ 사항듀을 λ§Œμ‘±ν•˜λŠ” λ©”μ„œλ“œλ₯Ό 채택할 것.
  • λ‹€μŒκ³Ό 같은 기쀀을 가지고 병합을 μ§„ν–‰ν•˜μ˜€κ³ , 병합에 μžˆμ–΄μ„œ λΉ λ₯΄κ²Œ 취사선택을 ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.