야곰님이 설명해 주시는 객체지향언어의 코드 작성 강의를 듣다가 지금까지 내가 작성해온 코드가 매우 잘못 되었다는 것을 깨닫게 되었다. 저어어어어엉말 많은 것을 얻게 되어서 이를 정리하고자 글로 적게 되었다 🥹
else 사용을 지양하고 최대한 간결하게 코드를 작성하여 함수를 세분화 하는 것이 중요
func abc() {
if 1 < 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을 쓰자
cuz 한 줄에 여러 점을 찍어서 사용하면 디미터 법칙을 어기게 됨
💡 디미터 법칙
이 법칙은 "최소한의 지식 원칙(The Principle of Least Knowledge)"으로 알려져 있으며, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 것을 의미
인스턴스는 자료를 숨기고 메서드를 공개한다.
즉, 인스턴스는 조회 메서드로 내부 구조를 공개하면 안 된다.
let output: String = text.options().scratch().absolutePath()
위 코드를 디미터 법칙을 어기는 것으로 볼 수 있음
당연한 것. 2학년 때 객체지향언어 수업을 들었는데, 이 당시 허교수님께서 변수명은 다른 개발자가 보았을 때도 알아볼 수 있도록 길게 작성하는 것이 좋다고 알려주셨다. 항상 변수명이나 함수명을 짧게 지으려고 했던 나에겐 꽤 충격이었어서 지금까지도 기억하고 있다.
그 외에 자료구조 수업을 들을 때 방교수님께서 회사 들어갔을 때 주석 없으면 코드 처음부터 다시 짜야될 수도 있다고 말씀해 주셨을 때 역시 충격을 받고 코드 공유에 있어 주석이 중요하다는 것을 알게 되었다.
정말 회사에 들어가게 된다면 나혼자 코드를 작성하는 것이 아니라 다른 개발자와 내 코드를 공유해야 한다. 이것은 나 혼자 알아볼 수 있는 코드가 아니라 모두가 알아볼 수 있는 코드를 작성하는 것이 1순위가 된다고 생각한다. 때문에 이름을 줄이지 않고 직관적으로 이해할 수 있도록 작성해야겠다고 또 다짐한다.
함수가 길어지면 쪼개고, 타입의 메소드가 많아지면 쪼개라는 의미
1번 6번이 곧 5번으로 이어진다.
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
}
💡 일급 컬렉션
단 하나의 컬렉션만 프로퍼티로 가지는 타입
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)
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)
프리온보딩 사전과제로 제출했던 코드를 당장 리팩토링 해야겠다... 내 코드 정말 충격 🤦🏻♀️