개발 공부/아키텍처

SOLID 원칙을 알아보자 1 : 단일 책임 원칙 - kotlin

yong_DD 2023. 7. 29. 19:06

SOLID 원칙이란?

Single Responsibility Principle

→ 

단일 책임 원칙

Open-Closed Principle 

→ 

개방-폐쇄 원칙

Liskov Substitution Principle 

→ 

리스코프 치환 원칙

Interface Segregation Principle 

→ 

인터페이스 분리 원칙

Dependency Inversion Principle

→ 

의존성 역전 원칙


Single Responsibility Principle 

 단일 책임 원칙 

어떤 클래스나 모듈은 변경하는 이유가 한 가지여야만 한다 - Robert C. Martin

 

 

클래스나 모듈이 하나의 책임만을 가지고 있어야 한다는 것이다.

클래스나 모듈이 여러가지 작업을 한다면, 강하게 결합되어 있는 클래스나 모듈이 많이질 것이고 하나를 수정하게 된다면 여러 클래스나 모듈을 수정하게 될 것이다.

 

[예제 코드]

class Me {
    fun currentJob():String = "개발 일을 하고 있다"
    fun companyName():String = "00회사에서 일하고 있다"
    fun playGame():String = "■ ■ 게임을 하고 있다"
    fun playedGame():String = "00 게임을 했다"
}

Me라는 class가 있고 나를 나타내기 위한 여러 기능을 넣어 이렇게 작성할 수 있다.

하지만 나라는 것을 나타내기 위해 많은 기능이 한 class에 들어가 있으며, 다른 곳에 나를 소개해야하는데 ■ ■ 게임이 아니라 "○○ 게임을 하고 있다" 고 하고 싶다면? 문제가 생길 수 있다.

 

 

[수정 코드]

interface Job {
    fun currentJob(job: String):String {
        return "$job 일을 하고 있다"
    }

    fun companyName(company:String):String {
        return "${company}에서 일하고 있다"
    }
}

interface Hobby{
    fun playingGame(gameName:String):String{
        return "$gameName 게임을 하고 있다"
    }

    fun playedGame(gameName: String):String{
        return "$gameName 게임을 했다"
    }

    fun doExercise(exercise:String) :String{
        return "$exercise 운동을 한다"
    }
}

class Introduce:Job,Hobby {
    fun me1() {
        currentJob("개발")
        companyName("00회사")

        playingGame("젤다")
        playingGame("00")
    }
    
    fun me2() {
        currentJob("개발")
        companyName("00회사")

        playingGame("○ ○")
        playingGame("00")
    }
}

class GetHobby:Hobby {
    fun person1Hobby() {
        doExercise("달리기")
    }
}

Job이 하는 일과 Hobby가 하는 일을 나눠 변경되도 상관이 없도록 수정하고 내 소개를 때에 따라 변경하여 보여줄 수 있게 되었다.

(또한 Job과 Hobby가 나뉘며 다른 사람의 Hobby를 가져올 때도 편하게 사용할 수 있도록 되었다.)

각각의 역할과 책임이 나뉜 것이다.

설계할 때 이러한 부분을 잘 고려해서 작업을 해야한다.