파라미터에 질문을 던지는 경우
func fileExists(_ fileName: String) -> Bool {
// 코드 내부
if FileManager.default.fileExists(at path: fileName) {
return true
} else {
return false
}
}
fileExists("MyFile") // 파일이 존재하면 true, 파일이 존재하지 않으면 false
파라미터를 뭔가로 변환해 결과로 반환하는 경우
func makeIntToString(_ number: Int) -> String {
let intToString = "\(number)"
return intToString
}
makeIntToString(3) // Int 타입 3을 String 타입 "3"으로 변환
이벤트 함수를 사용하는 경우 (입력 파라미터만 있고 리턴 파라미터는 없는 함수)
func passwordAttemptFailedNtimes(attempts: Int) {
}
파라미터에 Bool 값을 넘기는 건 최악이다. 왜냐하면 함수가 여러 가지를 처리할 것이라고 공표하는 것이기 때문이다. true일 경우와 false 일 경우 처리할 코드가 다르다.
플래그 파라미터는 코드의 가독성을 저하시키고, 함수의 복잡성을 증가시킬 수 있으므로, 사용에 주의해야 한다. 특히, 하나의 함수가 여러 개의 플래그 파라미터를 가질 경우, 함수가 너무 많은 책임을 지게 되어 코드의 유지 보수가 어려워질 수 있다.. 이런 경우, 함수를 분리하거나 다른 방식으로 리팩토링을 고려하는 것이 좋다.
func processDocument(_ document: Document, shouldBackup: Bool) {
if shouldBackup {
backup(document)
} else {
print("백업 못함")
}
// document 처리 코드...
}
이항 함수
삼항 함수
동사와 키워드
import Foundation
class UserValidator {
private var cryptographer: Cryptographer
init(cryptographer: Cryptographer) {
self.cryptographer = cryptographer
}
// 단순히 password를 체크하는 함수로만 보이지만
func checkPassword(userName: String, password: String) -> Bool {
guard let user = UserGateway.findByName(userName), user != User.null else {
return false
}
let codedPhrase = user.getPhraseEncodedByPassword()
let phrase = cryptographer.decrypt(codedPhrase: codedPhrase, password: password)
if phrase == "Valid Password" {
// 세션 정보를 초기화하는 코드가 숨어있다! 이런 부수 효과를 일으키면 안 된다. ⭐️⭐️
// password를 체크하는 역할만 해야지, 세션 정보를 초기화하는 부수 효과를 일으켜서는 안 된다.
Session.initialize()
return true
}
return false
}
}
func set(_ attribute: String, _ value: String) -> Bool {
// 코드 로직 구현
}
// 무엇을 말하고자 하는지 한 번에 이해하기 힘들다.
if set("username", "uncleBob") {
}
==================================================================================
// 잘 만든 코드는 다음과 같이 객체를 변경하는 함수와 객체를 반환하는 함수를 분리한다.
func attributeExists(_ attribute: String) -> Bool {
}
func setAttribute(_ attribute: String, _ value: String) {
}
if attributeExists("userName") {
setAttribute("userName", "uncleBob")
}
func delete(page: Page) {
do {
try deletePageAndAllReferences(page)
} catch (let error) {
print("에러가 발생했습니다. \(error)")
}
}