1. SRP(단일 책임 원칙)

소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다.

나쁜 코드

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()
}

너무나 당연하지만, 막상 코드를 짜거나 유지 보수를 할 때에 이게 잘 보이지가 않습니다. 함수를 들여다볼 때 이 원칙을 생각하며 로직 분리가 가능한지 항상 확인해 봐야겠습니다.

2. OCP(개방-폐쇄 원칙)

기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야한다.

나쁜 코드

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)

기존 코드의 수정이나 변경은 못하도록 하고, 추가와 확장은 쉽게 가능하게 한다는 원칙입니다. 이 원칙을 보고 저번 프로젝트에서 유지 보수를 진행할 때 기존 코드 내용을 수정하느라 시간이 오래 걸렸던 것이 새록새록 기억납니다😂 이 원칙을 고려해 코드 리팩토링을 진행해야겠습니다.

3. LSP(리스코프 치환 법칙)

자식 클래스는 부모 클래스에서 가능한 행위를 수행할 수 있어야 한다.