Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

계산기 [STEP1] Gray #583

Open
wants to merge 18 commits into
base: ic_11_gray11
Choose a base branch
from

Conversation

yawoong2
Copy link

안녕하세요! @uuu1101
Gray 입니다! 많이 늦었지만, 계산기 프로젝트 [STEP1]이 완료되어 PR 드립니다!


1. 고민되었던 점 🤔

📍 유닛 테스트를 통한 코드 구현 확인 :

import XCTest
@testable import Calculator

final class CalculatorTests: XCTestCase {
    var sut: CalculatorItemQueue<Double>!
    
    override func setUpWithError() throws {
        try super.setUpWithError()
        sut = CalculatorItemQueue<Double>()
    }

    override func tearDownWithError() throws {
        try super.tearDownWithError()
        sut = nil
    }

    func test_input4ToQueue() throws {
        // given
        let expectation = false
        
        // when
        sut.enqueue(element: 4.0)
        let result = sut.isEmpty
        
        // then
        XCTAssertEqual(expectation, result)
    }
    ...
}

테스트를 먼저 작성하고, 코드를 구현하는 방법인 테스트 주도 개발(TDD)는 수행하지 못했지만, 구현한 코드가 제대로 동작하는 지 확인하기 위해 위 코드처럼 유닛테스트 방법을 참고하여 override method에 초기값을 설정하고
given, when, then 양식에 맞추어 유닛테스트를 수행했습니다!

📍 LinkedList를 통한 Queue 구현 :

// CalculatorItemQueue.swift
struct CalculatorItemQueue<E>: CalculateItem {
    private var list = LinkedList<E>()
    var isEmpty: Bool { list.isEmpty }
    var count: Int { list.count }
    
    mutating func enqueue(element: E) {
        list.addLast(element: element)
    }
    
    mutating func dequeue() -> E? {
        return list.deleteFirst()
    }
    
    func first() -> E? {
        return list.peek()
    }
    
    mutating func clear() {
        list.clear()
    }
}

Queue를 구현하는데, Array와 LinkedList 중 어느 자료구조를 채택할 지 고민이 되었습니다.
Array와 비교하여 본 프로젝트에서 가지는 LinkedList의 특징은 아래와 같습니다.

  • Linked List는 각 노드에 데이터와 다음 노드를 가리키는 포인터로 이루어져 있어, 노드가 연결된 구조이기에 삽입, 삭제에 용이하다.
  • Queue를 사용하는데 있어 중간에 데이터를 삽입하거나 삭제할 일이 없다.
  • 배열보다 입력된 데이터에 대한 메모리 낭비가 발생하지 않는다.

따라서, LinkedList를 채택하여 Queue를 구현했습니다.

2. 조언을 얻고 싶었던 점 🙏

📍 Struct와 Class :

Node, LinkedList, CalculatorItemQueue를 생성할 때, Struct vs Class를 비교해보며 Class에 해당하는 특성이 아니라면, Struct 타입으로 선언하여 코드를 작성했습니다.
다만, 제가 알맞게 타입 지정을 하는 건지 모를때가 있는데 분류하기 좋은 방법이 있다면 알려주시면 감사하겠습니다!

@yawoong2 yawoong2 changed the title 계산기 [STEP2] Gray 계산기 [STEP1] Gray Feb 23, 2024
Copy link
Member

@uuu1101 uuu1101 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yawoong2 안녕하세요 gray !

자료 구조 Queue 와 LinkedList에 대해서 학습하시고 구현해주셨네요 👍🏻👍🏻👍🏻
관련해서 몇가지 코멘트 남겨두었어요 ㅎㅎ

고생하셨습니다 👍🏻

// Created by JIWOONG on 2024/02/20.
//

protocol CalculateItem {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개인적으로는 프로콜이름은 저는 ~able로 짓는 편이에요 👍🏻
ex) CalculateItamable

//
// Created by JIWOONG on 2024/02/19.
//

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Queue에 포함되는 다른 메서드들도 한번 구현해보시거나 학습해보셔도 좋을것 같습니다 👍🏻

Comment on lines +13 to +18
var result = 0
var temp = head
while temp != nil {
temp = temp?.next
result += 1
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Property Observer 를 사용해보셔도 좋을 것 같아요 !

Comment on lines +61 to +67
func peek() -> E? {
if isEmpty {
return nil
} else {
return head?.data
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 peek을 구현해보셨네요 👍🏻

@testable import Calculator

final class CalculatorTests: XCTestCase {
var sut: CalculatorItemQueue<Double>!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sut으로 네이밍하셨는데, sut은 어떤 의미를 가지고 있었나요?!

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.

2 participants