SRP와 ISP 정리한 것입니다. 설계 잘 아시는 분들 도와주세요.

GMRyuj의 이미지

★ 정리 (SRP vs ISP)

분명 SRP와 ISP는 처음 적용할때 모순이 존재하는 것처럼 보인다.
하지만 명백히 SRP와 ISP는 다르다.

SRP : 단일 책임의 원칙 => 즉, 클래스는 하나의 책임을 가진다.
ISP : 인터페이스 격리의 원칙 => 클래스의 사용하지 않는 기능은 인터페이스로 분리되어야한다. 또는 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안된다. 라는 깊은 뜻이 담겨있다.

여기서 자신이 사용하지 않는 메소드라는 문장에 깊은 관심을 가질 필요가 있다.

여기서 생기는 혼돈(?)은 SRP는 단일 책임을 지닌다고 하였는데.. ISP에 의해 나뉘어진 인터페이스를 구현하면 다수의 책임을 가지고 있는 것이 아닌가? 라는 의문이 생기기 마련이다. 대부분의 설계 원칙을 처음 접한 사람들은 분명 이러한 고민을 해봤을 것이다.
하지만 이것은 SRP와 ISP의 관계를 확실하게 파악하지 못했기 때문이다. 예로 설명하겠다.

게임 오브젝트(GameObject)는 자신을 관리하는 책임을 가진다. (여기서 관리한다라는 말은 그리기와 업데이트가 될 수 있다는 뜻이다. 즉, Update() , Draw() 메소드를 가진다.)
여기서 Update와 Draw 메소드는 다른 객체에서 호출될 수 있다. 정리하자면 GameObject의 Update와 Draw 메소드는 자신이 직접 호출하지 않는다는 뜻이다. 이 말을 간단하게 말하면 GameObject의 Update, Draw 메소드는 다른 클래스 혹은 다른 로직에서 호출될 수있다는 뜻이다. 그렇다면 이 Update, Draw 메소드를 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안된다. 의 ISP 원칙을 적용하여 인터페이스로 분리한다.

따라서 인터페이스 IDrawable : Draw() , IUpdateable : Update() 인터페이스로 분리해내고, GameObject 는 이 인터페이스 둘을 구현한다.
그리고 게임의 흐름에서 GameObject는 Draw와 Update메소드는 호출되어진다.(이때 DIP의 원칙이 적용될 수 있다.)

이로써 SRP와 ISP의 원칙은 모순이 존재하지 않는다는 것을 알게되었다.

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

요즘 설계에 관해 너무 관심이 많아서 KLDP 회원님들께 질문을 너무 많이합니다. 저도 공부 많이해서 빨리 다른분들 도와주고 싶습니다 ㅠ.ㅠ...

제가 SRP와 ISP를 공부하면서 모순점이 생겼는데.. 이것을 조금더 깊이 공부해서 위와같이 정리하였습니다. 만약 이상하다거나 뭔가 아니다 싶으면 답변 부탁드립니다 ㅠ..

위의 내용처럼 제가 확립한 OOP 5대 설계원칙이 맞다면 KLDP 회원여러분들께 OOP 5대 설계원칙을 정리해서 '강좌' 포럼에 올리고싶습니다.

그럼 답변 기다리겠습니다. 충성!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.