Coder Social home page Coder Social logo

ios-juice-maker's Introduction

*쥬스 메이커 (juice-maker)

1. 소개

사용자가 버튼을 통해 쥬스를 주문하면 쥬스를 만들어주고 재료를 소모합니다. 재료 수정 페이지를 통해 부족한 재료를 추가할 수 있습니다.

2. 🧑‍🤝‍🧑 팀원

팀원

stone 제이푸시

3. 👩🏻‍💻 실행 화면(기능 설명)

쥬스 제조

  • 쥬스 제조 버튼 클릭 시 재고가 충분할 경우 쥬스를 제조하고, 재고가 부족할 경우 재고 부족 알림 (실패)를 띄웁니다.

재고수정

  • 과일의 재고를 수정하는 부분입니다.

4. 🔥 트러블 슈팅

레시피를 만들때 튜플 배열 or 딕셔너리 사용

  • 레시피를 만들 때 둘 중 어떤 방식을 채택할지 고민했습니다.
    • [.strawberry : 10, .banana : 1]
    • [(.strawberry, 10), (.banana, 1)]
  • 가독성이 조금 더 좋다고 생각한 딕셔너리를 사용했습니다.

switch문을 사용해서 에러 메세지를 catch 할 때 catch문이 많아지는 문제

  • 예상외의 에러를 체크해주는 부분을 한번에 묶어주기 위해서 LocalizedError를 사용했습니다.

enum에서 원시값으로 딕셔너리를 주지 못하는 문제

  • 딕셔너리를 가지는Struct로 구현했으나 enum의 값들과 중복되는 부분이 많아, enum내에 enum value를 이용해 레시피를 구현하는 방법을 채택했습니다.

5. 🤔고민한 부분

이미 유효성을 확인 한 후에 Dictionary의 값을 사용할 때

  • fetchFruitAmount함수를 사용하여, 과일의 유효성 체크를 하는데, 유효성 체크 후 useFruits함수를 사용하여 과일의 갯수를 감소시킵니다.
  • useFruits함수 내부에서 Dictionary값인 fruits를 사용하는데,이미 유효성 검사가 끝난 값이라 굳이 throw로 에러를 던지지 않고 return으로 처리해도 되지 않을까 고민했습니다.

딕셔너리 [Fruit : Int]를 사용해서 과일 저장소를 구현할 때 Int의 모호함을 해결하기 위한 고민

딕셔너리로 표현시 처음 보는 사람이 의미를 잘 파악하지 못할 수 있으므로 과일명과 재고를 가지고 Struct를 정의해서 구현을 고민했습니다.

  1. Typealias 파일을 만들어서 typealias들을 명시합니다.

    • 단점: 사용하는 파일에 typealias가 무슨 타입인지 구현을 확인해야 합니다.
  2. 사용하는 파일에 각각 typealias를 명시해줍니다.

    • 단점: 다른 파일의 코드를 가져다 쓴다면 매개변수에 쓰이는 부분때문에 중복 명시가 있습니다.

두가지 방법중 1번의 단점을 좀 더 크게 보고 2번의 방법을 채택하고 싶었으나 파일의 길이가 길어지면 1의 단점이 똑같이 드러나게 된다고 생각했습니다. 2가지 방법으로도 해결을 하지 못한다 생각해서 Struct로 딕셔너리를 구현할 생각을 했습니다. Sturct로 구현하는 방법을 채택하여 진행하려 했지만, Dictionary를 사용했을 때의 로직들을 전부 리팩토링이 이루어져야해, 비효율적으로 느껴졌습니다. 그래서 Dictionary 값을 할당하고 있는 fruits 변수의 네이밍 수정을 통하여 Dictionary타입의 방식을 채택하기로 결정했습니다.

6. 💁‍♂️추가 구현 사항

FruitStore클래스 인스턴스의 ViewController -> EditStockViewController 데이터 전달

  • ViewController -> EditStockViewController 전달하는 부분에서 싱글톤 이외에 Key-Value Observing(KVO) , delegate패턴을 사용하여 구현해보았습니다.

7. 🔗 참고 링크

Swift Language Guide - Initialization

Swift Language Guide - Error Handling

Swift Language Guide - AccessControl

Delegate 와 Retain Cycle

ios-juice-maker's People

Contributors

corpiii avatar onestone23 avatar yagom avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.