Closed Kim-EunsooSilver closed 2 years ago
추상화와 확장 가능성이 어떻게 상충될 수 있는지 구체적으로 이야기해주시면 어떤 선택이 더 나을 지에 대한 판단이 쉬울 것 같습니다!
추상화와 확장 가능성이 어떻게 상충될 수 있는지 구체적으로 이야기해주시면 어떤 선택이 더 나을 지에 대한 판단이 쉬울 것 같습니다!
🤔아주 극단적으로 예를 들자면! 사람을 추상화하는데 명세에는 팔
에 대한 요구만 있습니다. 하지만, 개발자는 이후 매래에는 다리
도 추가될 가능성이 있디고 보는거죠! 이러한 상황이라면 어떻게 하시겠어요?
작성하고 보니 ... 예시가 좋은게 아닌거 같은데... 상황에 초점을 맞춰주세요~
이번 프로젝트에서도 나누기 0을 하면 NaN이 나오도록 Double.nan을 반환할 수도 있고, 에러 케이스를 만들어놓을 수도 있었습니다. 이 경우 단순히 계산기에 NaN이 나올 수도 있지만 Alert가 나온다거나 다양한 경우로 확장될 수 있기 때문에 확장 가능성을 고려해서 개발을 하는 것이 좋지 않을까 생각됩니다. 다만 명세에 없는 기능을 미리 생각해서 추가할 필요까지는 없다고 생각해요!
확장 가능성이 추가될 기능을 미리 고려해서 이 기능에 해당하는 코드를 만든다기 보단, 다른 코드를 추가하기 쉽게 작성하는 것 아닐까요? 위 예시처럼요!!
이렇게 된다면 0으로 나누는 경우를 어느 정도 추상화를 하면서도 확장 가능성을 고려할 수 있는 사례가 아닐까 생각합니다.
현재 필요없는 기능을 미래의 확장 가능성을 대비하여 미리 만들어놓는 것은 오버 엔지니어링이기에 지양해야 되는 것 같아요. 하지만, 미래에 기능이 추가되더라도 현재까지 썼던 코드를 수정할 필요는 없는 형태로 설계하면 그 상충하는 부분을 대비하는 방법일 수 있겠네요. SOLID에서 잠깐 다뤘던 개방-폐쇄 원칙이 이와 관련된 내용이 아닐까 합니다~
기능을 추가할 수 있는 가능성을 열어두고 코드를 작성해야 하지만, 미리 너무 많은 기능을 구현하는 것은 불필요한 부분을 도려내는
추상화의 의도와 다르다고 생각해요!
미래의 확장가능성을 고려해서 타입을 설계할 때 더 앞선 차원(?)의 추상화를 하는 것도 방법이라고 생각합니다. 예를 들면 지금은 팔만 필요하지만 추후에 다리가 들어올 수 도 있어서 타입을 "몸"이라고 추상화하는 것 처럼 말입니다.
그런데 그보다 객체지향에서 가장 중요한 포인트가 "협력"하는 객체를 만든다는 것을 상기해보았을 땐, 필요한 행동(책임)을 정의하고, 책임에 필요한 상태를 결정하고, 그 후에 이를 추상화 할 수 있는 타입을 만드는 것이 순서상으로 맞지 않을까 하는 생각이 들었습니다.
그래서 상태에 기준을 두고 책임(기능)을 만들지 말고 책임에 기준을 두고 상태를 만들라는 것 같습니다. "하나의 함수는 하나의 기능만을 해야한다" 라는 것도 확장성을 고려하여 하는 말이라고 생각해요 그리고 요구사항보다 더 많은 것을 고려하려 한다면 쓸데 없는 상태나 책임이 생길 것 같다는 문제도 있을 것 같습니다.
그래서 상태에 기준을 두고 책임(기능)을 만들지 말고 책임에 기준을 두고 상태를 만들라는 것 같습니다. "하나의 함수는 하나의 기능만을 해야한다" 라는 것도 확장성을 고려하여 하는 말이라고 생각해요 그리고 요구사항보다 더 많은 것을 고려하려 한다면 쓸데 없는 상태나 책임이 생길 것 같다는 문제도 있을 것 같습니다.
🤔@yim2627 과한 고려는 지양해야겠지만!! 적당한 고려는 필요하다고 봅니다^^
음성으로도 이야기했지만 작성해보겠습니다.
예시로 들어주신 팔
을 기준으로 말하자면, 팔을 넘어서 다른 부위가 포함될 수 있는 개념의 타입인지에 대한 확인이 먼저 필요할 것으로 생각됩니다. 추가적으로 요구서를 작성한 사람에게 물어보는 것도 방법일 듯합니다.
개인적으로 저는 추상화가 지나치게 구체적일 경우, 확장성을 높여주지 못하고 되려 추가사항에 대응할 수 없어진다고 생각합니다.
훌륭한 답변 감사합니다 ㅎㅎ^^
저자는 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내는것 이라고 표현을 했는데요! 그 불필요한 부분의 기준은 지금 진행되고 있는 프로젝트의 명세일거 같습니다! 하지만 여기서 상충(?)되는 개념으로는 확장 가능성도 있을거 같아요. 명세상에서는 없는 기능이지만, 개발자가 생각할때 미래에 추가될 기능이 있다면 어떻게 해야할까요? (전제: 위에서 말한 추가될 기능이 진짜 필요해질지 아닐지 진짜 아무도 예측할 수 없어요!)