👨‍🎓
Today I Learned
  • Today-I-Learend
  • 🍎WWDC
    • Developer Tools
      • Testing in Xcode
    • UIKit
      • UIDiffableDataSource
        • [WWDC 19] Advances in UI Data Sources
      • [WWDC2019] Advances in CollectionView Layout
  • 자료구조
    • Heap 자료구조
  • Clean code
    • 네이밍
    • 주석과 포맷팅
    • 함수
    • 클래스
    • 에러 핸들링
    • 가독성 높이기
    • 객체지향
  • Network
    • RestAPI
  • Swift
    • DateType
    • ARC
    • Availablity
    • KeyPath
    • Network
    • Never타입
    • Result
    • Selector
    • 검증함수
    • 메타타입
    • 동시성 프로그래밍
    • 메모리 안전
    • 에러처리
    • 접근제어 (Access Control)
    • 제네릭
    • 주요 프로토콜
  • 알고리즘
    • 그래프
    • 기초 알고리즘
    • 누적합(Prefix)
    • 복잡도
    • 비트마스킹
  • 운영체제
    • 운영체제의 개요
    • 프로세스와 스레드
    • CPU 스케줄링
    • 프로세스 동기화
    • 교착상태
    • 07. 메모리
    • 08.가상 메모리
    • 입출력 장치
    • 파일 시스템
  • UIKit
    • UITableView xib으로 만들어보기
  • 🖊️정보 기록
    • 코코아팟 배포하는 방법
  • iOS Project
    • 채팅 앱 만들기
      • Trouble shooting
      • 1. 디자인
      • 2. AutoLayout
    • 날씨 조회 어플리케이션
      • Figma를 이용한 UI 설계
      • TableView 연결하기
      • Networking
    • MVC -> MVVM으로 구조 변경해보기
      • MVC
      • MVVM
    • OAuth Project
      • 로컬 호스트를 이용한 로그인 페이지 제작
      • Github의 OAuth App 설정
    • Rest API 프로젝트
      • UI설계 (with Figma)
      • Network Model
      • MVVM 구조 전환
  • 🕶️UIKit
    • Compositional Layout
Powered by GitBook
On this page
  • intent 줄여 코드 가독성 높이기
  • Guard clause
  • Polymorphism(다형성)
  1. Clean code

가독성 높이기

intent 줄여 코드 가독성 높이기

💡 if - else 조건문을 많이 사용하면 코드라인이 길어지고, Indent가 많아져서 가독성이 떨어진다. Guard clausing, Polymorhism(다형성)을 사용하면 코드를 깔끔하게 짤 수 있다.

Guard clause

  • 일반적으로 if else 문이 중첩될수록 (nested) 코드가 복잡해진다.

  • nested 코드를 줄이고 가독성을 높이기 위해 Fail 로직을 코드 상단에 배치한다.

// as-is
func sayHi(to developer: Developer) throws {
    if developer.isFrontEnd {
        throw NSError(domain: "myDomain", code: 1, userInfo: [NSLocalizedDescriptionKey: "프론트 엔지니어입니다"])
    } else if developer.isBackEnd {
        if !developer.useJava {
            throw NSError(domain: "myDomain", code: 2, userInfo: [NSLocalizedDescriptionKey: "자바를 사용하지 않습니다"])
        } else {
            if developer.useSpring {
                print("안녕하세요!")
            } else {
                throw NSError(domain: "myDomain", code: 3, userInfo: [NSLocalizedDescriptionKey: "자바의 다른 프레임워크를 사용합니다"])
            }
        }
    } else {
        throw NSError(domain: "myDomain", code: 4, userInfo: [NSLocalizedDescriptionKey: "who are you?"])
    }
}
// to-be
func sayHi(to developer: Developer) throws {
    guard developer.isBackEnd else {
        throw NSError(domain: "myDomain", code: 1, userInfo: [NSLocalizedDescriptionKey: "백엔드 엔지니어가 아닙니다"])
    }
    
    guard developer.useJava else {
        throw NSError(domain: "myDomain", code: 2, userInfo: [NSLocalizedDescriptionKey: "자바를 사용하지 않습니다"])
    }
    
    guard developer.useSpring else {
        throw NSError(domain: "myDomain", code: 3, userInfo: [NSLocalizedDescriptionKey: "스프링을 사용하지 않습니다"])
    }
    
    print("안녕하세요!")
}

Polymorphism(다형성)

// as-is
class Developer {
    func coding() {
        print("코딩을 합니다")
    }
}

class Designer {
    func design() {
        print("디자인을 합니다")
    }
}

class Analyst {
    func analyze() {
        print("분석을 합니다")
    }
}

class Company {
    var employees: [Any]
    
    init(employees: [Any]) {
        self.employees = employees
    }
    
    func makeWork() {
        for employee in employees {
            if let developer = employee as? Developer {
                developer.coding()
            } else if let designer = employee as? Designer {
                designer.design()
            } else if let analyst = employee as? Analyst {
                analyst.analyze()
            }
        }
    }
}
// to-be
protocol Employee {
    func work()
}

class Developer: Employee {
    func work() {
        print("코딩을 합니다")
    }
}

class Designer: Employee {
    func work() {
        print("디자인을 합니다")
    }
}

class Analyst: Employee {
    func work() {
        print("분석을 합니다")
    }
}

class Company {
    var employees: [Employee]
    
    init(employees: [Employee]) {
        self.employees = employees
    }
    
    func makeWork() {
        for employee in employees {
            employee.work()
        }
    }
}
Previous에러 핸들링Next객체지향

Last updated 2 years ago