우리의 지식 영역은 맨발로 압력판을 걷는 사람들과 관련이 있습니다. 센서 데이터에서 사람의 발이 인식되면 '발'클래스의 물체를 만드는 이미지 인식을 수행합니다.
발 데이터에 대해 몇 가지 계산을 수행해야합니다.
이제 어떤 API가 더 좋을까요?
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
또는:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
지금, 내가 생각해 낼 수있는 많은 장단점이 있지만, 어느 것이 가장 중요한지를 결정할 수는 없습니다. 이것은 우리가 판매하는 소프트웨어 라이브러리가 아닌 최종 사용자 응용 프로그램입니다.
어떤 충고?
첫 번째 접근 방식의 일부 전문가는 다음과 같습니다.
- 키스-모든 것이 매우 구체적입니다. API이지만 구현도 마찬가지입니다.
- 강력한 형식의 반환 값
- 이 클래스에서 상속하는 것은 바보입니다. 재정의 할 수 없으며 추가 만 할 수 있습니다.
- API는 매우 닫히고 아무것도 들어 가지 않으며 재정의 할 수 없으므로 잘못 될 수 있습니다.
일부 단점 :
- 우리가 발명 한 모든 새로운 계산이 목록에 추가됨에 따라 게터의 수가 늘어날 것입니다.
- API가 변경 될 가능성이 더 높으며 주요 변경 사항이 도입되면 새로운 API 버전 인 Foot2가 필요합니다.
- 다른 프로젝트에서 클래스를 재사용하는 경우 모든 계산이 필요하지 않을 수 있습니다
두 번째 접근 방식의 일부 전문가 :
- 더 유연한
- api는 변경 될 가능성이 적습니다.
일부 단점 :
- 느슨하게 입력했습니다. 모든 통화에 캐스트가 필요합니다.
- 문자열 매개 변수-그것에 대해 나쁜 감정을 가지고 있습니다 (문자열 값에서 분기 ...)
- 추가 유연성을 요구하는 현재 사용 사례 / 요구 사항은 없지만 앞으로있을 수 있습니다.
- API는 제한 사항을 부과합니다. 모든 계산은 기본 클래스에서 파생되어야합니다. 이 1 가지 방법을 통해 계산을 수행해야하며, 매개 변수를 전달하는 훨씬 더 역동적이고 초 유연한 방법을 고안하지 않으면 추가 매개 변수를 전달하는 것이 불가능합니다.
getCalculation()
.
enum
값을 만들고 켤 수 있습니다. 그래도 두 번째 옵션은 KISS에서 벗어나기 때문에 악하다고 생각합니다.