소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다.
function emailClients(clients: Client[]){
clients.forEach((client)=>{
const clientRecord = database.lookup(client);
if(clientRecord.isActive()){
email(client);
}
})
}
function emailClients(clients: Client[]){
clients.filter(isActiveClient).forEach(email)
}
function isActiveClient(){
const clientRecord = database.lookup(client);
return clientRecord.isActive()
}
너무나 당연하지만, 막상 코드를 짜거나 유지 보수를 할 때에 이게 잘 보이지가 않습니다. 함수를 들여다볼 때 이 원칙을 생각하며 로직 분리가 가능한지 항상 확인해 봐야겠습니다.
기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야한다.
function getMultipledArray(array, option){
const result = []
for(let i=0; i<array.length; i++){
if(option === 'doubled'){
result[i] = array[i] * 2
}
if(option === 'tripled'){
result[i] = array[i] * 3
}
if(option === 'half'){
result[i] = array[i] / 2
}
}
return result
}
function map(array, fn){
const result = []
for(let i=0; i<array.length; i++){
result[i] = fn(array[i])
}
return result
}
const getDoubledArray = (array) => map(array, x => x * 2)
const getTripledArray = (array) => map(array, x => x * 3)
const getHalfArray = (array) => map(array, x => x / 2)
기존 코드의 수정이나 변경은 못하도록 하고, 추가와 확장은 쉽게 가능하게 한다는 원칙입니다. 이 원칙을 보고 저번 프로젝트에서 유지 보수를 진행할 때 기존 코드 내용을 수정하느라 시간이 오래 걸렸던 것이 새록새록 기억납니다😂 이 원칙을 고려해 코드 리팩토링을 진행해야겠습니다.
자식 클래스는 부모 클래스에서 가능한 행위를 수행할 수 있어야 한다.