관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Clean Code(클린 코드) - 2. 의미 있는 이름 본문

Clean Code (클린 코드)

[iOS - swift] Clean Code(클린 코드) - 2. 의미 있는 이름

jake-kim 2021. 11. 10. 23:45

의도를 명확히

  • 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 더 많은 장점이 존재
  • 의도가 명확하게 이름을 지을 것 (주석이 필요하다면 의도를 명확히 드러내지 못한 것)
    • 존재 이유는?
    • 수행 기능은?
    • 사용 방법은?

WRONG

var d: Int // 경과 시간 (단위: 날짜)

RIGHT

var elapsedTimeInDays: Int
var daysSinceCreation: Int
var daysSinceModification: Int
var fileAgeInDays: Int

잘못된 정보를 지양

  • 여러 계정 그룹을 묶을 때 실제 List가 아니면 accountList라 하지 않는것을 주의
    • 실제 컨테이너가 List인 경우에도 컨터이너 유형을 이름에 넣지 않는 것이 바람직

WRONG

var accountList: [String]

RIGHT

var accountGroup: [String]
var accountOfAccounts: [String]
var accounts: [String]

불필요한 용어를 지양

  • 아무런 내용도 제공해주지 않는 의미 없는 용어가 없는 코드가 훨씬 쉬워지므로 불필요한 용어를 사용하지 않는 것
  • 불필요한 용어라는 것은 `중복`을 의미

WRONG

struct ProductInfo { ... }
struct ProductData { ... }
var nameString: String

- Manager
- Processor
- Data
- Info

RIGHT

struct Product { ... }
var name: String

자신의 기억력을 믿지 말것

  • 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 따로 변환해야 한다면, 이 변수이름은 바람직하지 않은 코드
  • 똑똑한 프로그래머와 전문가 프로그래머 사이에서 나타나는 차이점
    • 전문가 프로그래머 - 명로함이 최고
    • 똑똑한 프로그래머 - 자신의 정신적 능력을 과시하고 싶어하는 점

의미 있는 맥락을 추가

  • 사용자가 이름을 봤을 때 앞,뒤 변수 이름을 보고 따로 유추하지 않고도, 해당 이름만 봤을때 이름이 명확할때까지 맥락을 추가
  • 맥락을 넣어서 의미가 명확해지게 하는데, 만약 맥락이 넣을 아이디어가 떠오르지 않을때는 접두어를 붙이는 방법 사용

WRONG

// property만 봤을 때, state라는 property가 추가되면 address인지 명확하지 않은 상태

var firstName: String
var secondName: String
var street: String
var houseNumber: String
var city: String

RIGHT

// addr를 붙여서 의미가 명확해지도록 설정

var addrFirstName: String
var addrSecondName: String
var addrStreet: String
var addrHouseNumber: String
var addrCity: String
  • 이름을 추가하여 맥락을 명확히 하는 방법도 있지만, 함수 형태를 클래스 형태로 변환하는 방법도 존재

WRONG

number, verb, pluralModifier는 유추해야하는 변수 - 함수를 끝까지 읽어보고 나서야 추측이 가능하므로, 함수를 짧게 만드는게 핵심

func printGuessStatistics(candidate: String, count: Int) {
    var number: String
    var verb: String
    var pluralModifier: String
    
    if count == 0 {
    	number = "no"
        verb = "are"
        pluralModifier = "s"
    } else if count == 1 {
    	number = "1"
        verb = "is"
        pluralModifier = ""
    } else {
    	number = String(count)
        verb = "are"
        pluralModifier = "s"
    }
    let guessMessage = number + verb + candidate + pluralModifier
    print(guessMessage)
}

RIGHT

함수를 읽어보고 나서야 유추가 가능하므로, 각 함수들을 짧게 만들어서 빠르게 유추할 수 있게끔 설계

class GuessStatisticsMessage {
    var number: String
    var verb: String
    var pluralModifier: String
	
    public func make(candidate: String, count: Int) -> String {
    	createPluralDependentMessageParts(count)
        return verb + number + candidate + pluralModifier
    }
    
    private func createPluralDependentMessageParts(_ count: Int) {
    	if count == 0 {
            thereAreNoLetters()
        } else if count == 1 {
            thereIsOneLetter()
        } else {
            thereAreManyLetters(count)
        }
    }
    
    private func thereAreManyLetters(_ count: Int) {
        number = String(count)
        verb = "are"
        pluralModifier = "s"
    }
    
    private func thereIsOneLetter() {
        number = "1"
        verb = "is"
        pluralModifier = ""
	}
    
    private func thereAreNoLetters() {
        number = "no"
        verb = "are"
        pluralModifier = "s"
    }
}

* 참고: Clean Code (로버트 C. 마틴)

Comments