[Swift] 객체지향 생활 체조

지윤·2023년 5월 4일
0

야곰님이 설명해 주시는 객체지향언어의 코드 작성 강의를 듣다가 지금까지 내가 작성해온 코드가 매우 잘못 되었다는 것을 깨닫게 되었다. 저어어어어엉말 많은 것을 얻게 되어서 이를 정리하고자 글로 적게 되었다 🥹



1. 한 메서드에 오직 한 단계의 들여쓰기만 하고, else 표현을 사용하지 않는다

else 사용을 지양하고 최대한 간결하게 코드를 작성하여 함수를 세분화 하는 것이 중요

func abc() {
	if 1 < 2 {
    }
}

2. 모든 원시 값과 문자열을 포장한다

== 하드코딩 하지마

enum Lotto {
	static let numberRange = (1...45)
    sttic let lottoeryCount = 6
    
    enum Message {
    	static let wrongPicks: String = "선택이 잘못 되었습니다."
        static let win: String = "축하드립니다"
   	}
    
func makeLottoNumbers() -> [Int] {
	var numbers: Set<Int> = []
    
    while numbers.count < Lotto.lotteryCount, let random: Int = Lotto.numberRange.randomElement()
    	numbers.insert(random)
    }
    
    return
}

이 코드에서 구조체나 클래스가 아니라 enum으로 정의한 이유는 init()을 호출하는 구조체의 기능이 코드의 목적을 흐리게 하기 때문이다. 클래스로 선언하여 private init()을 작성하면 되지만 굳이? 그냥 enum을 쓰자

3. 한 줄에 점을 하나만 사용한다

cuz 한 줄에 여러 점을 찍어서 사용하면 디미터 법칙을 어기게 됨

💡 디미터 법칙

이 법칙은 "최소한의 지식 원칙(The Principle of Least Knowledge)"으로 알려져 있으며, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 것을 의미

인스턴스는 자료를 숨기고 메서드를 공개한다.
즉, 인스턴스는 조회 메서드로 내부 구조를 공개하면 안 된다.

let output: String = text.options().scratch().absolutePath()

위 코드를 디미터 법칙을 어기는 것으로 볼 수 있음

4. 이름을 줄여 쓰지 않는다 (축약 금지)

당연한 것. 2학년 때 객체지향언어 수업을 들었는데, 이 당시 허교수님께서 변수명은 다른 개발자가 보았을 때도 알아볼 수 있도록 길게 작성하는 것이 좋다고 알려주셨다. 항상 변수명이나 함수명을 짧게 지으려고 했던 나에겐 꽤 충격이었어서 지금까지도 기억하고 있다.
그 외에 자료구조 수업을 들을 때 방교수님께서 회사 들어갔을 때 주석 없으면 코드 처음부터 다시 짜야될 수도 있다고 말씀해 주셨을 때 역시 충격을 받고 코드 공유에 있어 주석이 중요하다는 것을 알게 되었다.

정말 회사에 들어가게 된다면 나혼자 코드를 작성하는 것이 아니라 다른 개발자와 내 코드를 공유해야 한다. 이것은 나 혼자 알아볼 수 있는 코드가 아니라 모두가 알아볼 수 있는 코드를 작성하는 것이 1순위가 된다고 생각한다. 때문에 이름을 줄이지 않고 직관적으로 이해할 수 있도록 작성해야겠다고 또 다짐한다.

5. 모든 엔티티를 작게 유지한다

함수가 길어지면 쪼개고, 타입의 메소드가 많아지면 쪼개라는 의미
1번 6번이 곧 5번으로 이어진다.

6. 3개 이상의 스위프트 기본 데이터타입(Int, String, Double 등) 프로퍼티를 가진 타입을 구현하지 않는다

struct Animal {

	struct PhysicalInfo {
      var weight: Double
      var height: Double
      var numberOfLegs: Int
    }
	
    struct BioInfo {
    	enum Gender { case male, female, unknown }
        struct Age {
        	var value: Int
            init?(value: Int) {
            	let commonAgeRange = (0...300)
            	guard commonAgeRange.contains(value) else { return nil }
                self.value = value
            }
            
        }
        var age: Int
        var gender: Gender
        let species: String
    }
    
    var iq: Int
    var name: String
    var physicalInfo: PhysicalInfo
    var bioInfo: BioInfo
    
}

7. 일급 컬렉션을 사용한다

💡 일급 컬렉션

단 하나의 컬렉션만 프로퍼티로 가지는 타입

struct Stack<Item: SignedInteger> {
	private var items: [Item]
    func push(_ item: Item) {
    	items.append(item)
    }
    
    func pop() -> Item {
    	return items.removeLast()
    }
}

var intStack: Stack<Int> = []
intStack.push(3)

8. getter/setter를 구현하지 않는다

getter, setter로 값을 물어보지 말고 객체가 스스로 일할 수 있도록 함수를 구현 !
캡슐화의 중요성. 코드를 직관적으로 봤을 때 내 돈을 남이 건드리면 안됨

class Person {
	private var money: Double = 0
    
    func showMoney() {
    print("남은 돈 : \(money)")
    }
    
    func giveMoney(_ amount: Double) {
    	money += amount
    }
}

let yagom: Person = Person()
yagom.giveMoney(10000000)

프리온보딩 사전과제로 제출했던 코드를 당장 리팩토링 해야겠다... 내 코드 정말 충격 🤦🏻‍♀️

profile
떠돌이 컴공

0개의 댓글