프로그래밍 언어/C & C++ 정리

인터페이스 목적 별 용도 고려하기

뽀또치즈맛 2024. 12. 3. 08:46

인터페이스 설계 유의사항

1. 인터페이스 목적 별 용도 고려하기
2. 인터페이스를 사용하기 쉽게 설계하기 - 익숙한 방식 따르기
3. 인터페이스를 사용하기 쉽게 설계하기 - 필요한 기능 빼먹지 않기
4. 인터페이스를 사용하기 쉽게 설계하기 - 군더더기 없는 인터페이스 제공하기
5. 인터페이스를 사용하기 쉽게 설계하기 - 문서와 주석 제공하기



API

API는 제품의 기능을 다양한 용도로 활용하거나
그 제품의 기능을 확장하기 위해
외부에 제공하는 인터페이스이다.

내부 인터페이스가 일반 계약서라면
API는 법전에 명시된 법률에 가깝다.

일단 외부에서 사용자가 우리가 제작한 API를 사용하기 시작하면,
특별히 도움되는 기능을 새로 추가하지 않는 한
변경하지 않는 것이 좋다.

따라서 API를 결정하기 전에 신중하게 설계하고
고객이 원하는 바를 최대한 반영하도록
여러 의견을 최대한 수렴해야한다.

API를 설계할 때
가장 고민해야 할 사항은 사용성과 유용성의 절충점을 찾는 것이다.
인터페이스를 사용하는 이들은
내부 작동에 대해서 모르기 때문에
API사용법을 쉽게 익히도록 구성해야한다.

애초에 API를 외부에 공개하는 목적은
여러 고객이 사용하게 하는 데 있다.
사용하기 어렵게 제작된 API라면 그 API는 실패한 것이다.
유연성과 사용성은 반비례하는 속성이다.

제품의 적용 범위를 최대한 넓히고,
제공하는 기능을 고객이 최대한 활용 가능하게 만들다 보면,
API가 복잡해질 수 있다.

유명한 프로그래밍 관련 격언에 따르면
"잘 만든 API는 쉬운 일은 쉽게 복잡하거나 어려운 일은 가능하 하는 것"이다.

다시 말해 API 사용법을 금방 익힐 수 있어야 한다는 것이다.

유틸리티 클래스와 라이브러리

utility class란 특정 목적에 맞는 메소드로 구성된 클래스이다.
간혹 로깅 클래스(개발 시 문제점을 추적해주는 클래스)와 같이
특정한 기능을
애플리케이션에 범용적으로 사용할 수 있도록 만들어야할 때가 있다.
어떤 것이든지 인터페이스는 쉽게 결정할 수 있다.
주로 사용하는 기능 또는 전체 기능에 대한 인터페이스를
외부에 공개하면 되기 때문이다.

이때 이왕이면 구현사항이 드러나지 않으면 좋다.
여기서 가장 핵심적으로 고려해야할 점은 범용성이다.

클래스나 라이브러리는 다양한 문맥에서 사용하기 때문에
구체적인 활용 범위를 최대한 고려해서 설계에 반영해야 한다.

서브시스템 인터페이스

데이터베이스 메커니즘과 같이 애플리케이션을 구성하는
주요 서브시스템끼리 서로 연동하는 인터페이스를 설계해야할 때가 있다.
이때 인터페이스를 명확히 분리하는 것이 무엇보다 중요하다.

가장 대표적인 이유는 모호성과 유연성 때문이다.

모호성

테스트할 때 인터페이스 구현에서 특정 부분을
동일한 인터페이스의 다른 구현으로 교체할 수 있어야 한다.
예를 들어 실제 데이터베이스에 연결하지 않고도
데이터베이스 인터페이스에 대한 구현 코드는
모든 종류의 데이터베이스 접근을 시뮬레이션하는 코드로 대처할 수 있다.

유연성

테스트하는 경우가 아니더라도
특정 인터페이스에 대한 다양한 구현 코드를 제공해서
서로 교체할 수 있게 만들어야 할 때가 있다.
예를 들어 MySQL에 대한 인터페이스를
SQL Server에 접근하는 구현으로 교체해야 하는 경우가 있다.
뿐만 아니라 이러한 구현 코드를
실행 시간에 교체하게 만들어야할 수도 있다.

그보다 덜 중요하지만
다른 프로그래머들은 여러분이 그 기능을 다 구현하기도 전에
앞서 정해둔 인터페이스를 바탕으로
각자 맡은 부분을 구현하고 있을 가능성이 높은 이유도 있다.

서브시스템을 다룰 때 가장 먼저 고려할 점은
그 서브시스템의 핵심 목적을 분명히 하는 것이다.
여러분이 만들 서브시스템에서 반드시 해야 할 일을 파악했다면
구체적인 활용 사례를 따져보고
다른 이들에게 어떤 형태로 제공할 지 결정해야 한다.

이때 상대방의 입장에서 바라보고
구현의 세부 사항에 너무 빠지지 않도록 주의해야한다.

컴포넌트 인터페이스

여러분이 정의하는 인터페이스의 대부분은
서브시스템 인터페이스나 API보다는
가벼운 것일 가능성이 높다.

아무래도 기존에 자신이 작성했던 코드에서
사용하기 위한 용도가 많을 것이다.
그렇다 하더라도 인터페이스를 점점 개선할수록
통제할 수 없는 지경에 이르게 될 수 있다.
혼자서만 사용하는 인터페이스라도
다른 이들이 사용한다는 생각으로 설계해야 한다.

서브시스템 인터페이스와 마찬가지로
각 클래스의 주 목적을 염두에 두고
이에 벗어난 기능을 외부에 노출하지 않도록 주의해야 한다.

TIP. 인터페이스를 사용하기 쉽계 설계하기

인터페이스는 사용하기 쉬워야 한다.
이 말은 쉬운 기능으로만 구성해야 한다는 뜻이 아니라

주어진 기능을
최대한 간결하고 직관적으로 사용하게 만들어야 한다는 것이다.

여러분이 만든 라이브러리를 사용하는 데
필요한 데이터 구조 하나를 적용하기 위해
소스코드를 뒤저야 하거나,
원하는 기능을 구현하는 코드가 너무 복잡하면 안된다.

그 네 가지 규칙은 다음 게시글에서 설명하겠다.