최근에 저는 자체 API를 개발하고 있으며 API 디자인에 대한 관심을 바탕으로 API 디자인을 개선 할 수있는 방법에 관심이있었습니다.
몇 번 등장한 한 가지 측면은 (API 사용자가 아니라 주제에 대한 관찰 토론에서) : API를 호출하는 코드를보고 수행하는 작업을 확인하는 것만으로도 알 수 있습니다 .
예를 들어 담론 리포지토리에 대한 GitHub에 대한 다음 토론을 참조하십시오 .
foo.update_pinned(true, true);
매개 변수 이름, 문서 등을 알지 않고 코드를 살펴보면 수행 할 작업을 추측 할 수 없습니다. 두 번째 인수는 무엇을 의미합니까? 제안 된 개선 사항은 다음과 같습니다.
foo.pin()
foo.unpin()
foo.pin_globally()
그리고 그것은 일을 정리합니다 (두 번째 인수는 전 세계적으로 foo를 고정시킬 것인지, 나는 추측하고 있습니다).이 경우 나중에 나중에 확실히 개선 될 것이라는 데 동의합니다.
그러나 나는 코드를 보아서 무엇을하고 있는지 알지 못하더라도 서로 다르지만 논리적으로 관련된 상태를 설정하는 메소드가 별도의 메소드가 아닌 하나의 메소드 호출로 더 잘 노출 될 수 있다고 생각합니다 . (따라서 매개 변수 이름과 설명서를 살펴보아야합니다. API에 익숙하지 않은 경우 항상 개인적으로 중요합니다.)
예를 들어 FalconPeerSetVisibility(bool, string, bool)
에서 한 가지 방법 을 노출 하고 다음 줄을 보면 인정합니다.
falconPeer.SetVisibility(true, "aerw3", true);
당신은 그것이 무엇을하고 있는지 전혀 모른다. falconPeer
논리적 의미에서 "가시성"을 제어하는 세 가지 다른 값을 설정 합니다. 비밀번호 만 사용하여 결합 요청을 수락하고 발견 요청에 응답합니다. 이것을 3 개의 메소드 호출로 나누면 API 사용자는 "가시성"의 한 측면을 설정하게되어 "가시성"의 모든 측면을 설정하기 위해 한 가지 방법 만 노출시킴으로써 생각해야하는 다른 것을 설정하는 것을 잊어 버릴 수 있습니다 . 또한 사용자가 한 측면을 변경하려고 할 때 거의 항상 다른 측면을 변경하기를 원하며 이제는 한 번의 호출로 변경할 수 있습니다.
setSize(10, 20)
처럼 읽을 수 없습니다 . 강제 명명 된 매개 변수가있는 언어에서 부울은 열거 형 / 명명 된 상수를 사용하는 것과 정확히 같은 양의 정보를 전달할 수 있으므로 API에 적합 할 수 있습니다. setSize(width=10, height=20)
random(distribution='gaussian', mean=0.5, deviation=1)
update
방법 으로 많은 설정을 그룹화 할 수foo.update(pinned=true, globally=true)
있습니다. 또는 :foo.update_pinned(true, globally=true)
. 따라서 질문에 대한 답변은 언어 기능도 고려해야합니다. 언어 X에 대한 좋은 API는 언어 Y에 적합하지 않으며 그 반대도 마찬가지입니다.